const http = require('http'); const SERVER_URL = 'http://localhost:8585'; class MCPTester { constructor() { this.testResults = []; this.currentCategory = ''; } async makeRequest(toolName, args = {}) { const payload = { jsonrpc: '2.0', id: Date.now(), method: 'tools/call', params: { name: toolName, arguments: args } }; return new Promise((resolve, reject) => { const data = JSON.stringify(payload); const options = { hostname: '127.0.0.1', port: 8585, path: '/mcp', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': data.length } }; const req = http.request(options, (res) => { let responseData = ''; res.on('data', chunk => responseData += chunk); res.on('end', () => { try { const response = JSON.parse(responseData); resolve(response); } catch (e) { reject(e); } }); }); req.on('error', reject); req.write(data); req.end(); }); } async testTool(toolName, args = {}, description = '') { const testName = description || toolName.replace(/_/g, ' '); process.stdout.write(` ${testName}... `); try { const response = await this.makeRequest(toolName, args); if (response.result && response.result.success !== false) { console.log('✅ 通过'); this.testResults.push({ tool: toolName, status: 'pass', category: this.currentCategory }); return response.result; } else { const error = response.result?.error || response.error?.message || 'Unknown error'; console.log(`❌ 失败: ${error}`); this.testResults.push({ tool: toolName, status: 'fail', error, category: this.currentCategory }); return null; } } catch (error) { console.log(`❌ 错误: ${error.message}`); this.testResults.push({ tool: toolName, status: 'error', error: error.message, category: this.currentCategory }); return null; } } printCategory(categoryName) { this.currentCategory = categoryName; console.log(`\n📁 ${categoryName}:`); } printSummary() { console.log('\n' + '='.repeat(60)); console.log('📊 测试结果汇总:'); console.log('='.repeat(60)); const categories = [...new Set(this.testResults.map(r => r.category))]; for (const category of categories) { const categoryResults = this.testResults.filter(r => r.category === category); const passed = categoryResults.filter(r => r.status === 'pass').length; const failed = categoryResults.filter(r => r.status === 'fail').length; const errors = categoryResults.filter(r => r.status === 'error').length; console.log(`\n${category}:`); console.log(` ✅ 通过: ${passed}`); console.log(` ❌ 失败: ${failed}`); console.log(` ⚠️ 错误: ${errors}`); console.log(` 📊 总计: ${categoryResults.length}`); } const totalPassed = this.testResults.filter(r => r.status === 'pass').length; const totalFailed = this.testResults.filter(r => r.status === 'fail').length; const totalErrors = this.testResults.filter(r => r.status === 'error').length; const total = this.testResults.length; console.log(`\n总体结果:`); console.log(` ✅ 通过: ${totalPassed}/${total} (${((totalPassed/total)*100).toFixed(1)}%)`); console.log(` ❌ 失败: ${totalFailed}/${total} (${((totalFailed/total)*100).toFixed(1)}%)`); console.log(` ⚠️ 错误: ${totalErrors}/${total} (${((totalErrors/total)*100).toFixed(1)}%)`); // 显示失败的工具 const failedTools = this.testResults.filter(r => r.status === 'fail' || r.status === 'error'); if (failedTools.length > 0) { console.log('\n❌ 失败的工具:'); failedTools.forEach(tool => { console.log(` - ${tool.tool}: ${tool.error}`); }); } } async runAllTests() { console.log('🚀 开始全面测试 Cocos MCP 工具...\n'); // 1. 场景管理工具 this.printCategory('场景管理'); await this.testTool('scene_create_scene', { sceneName: 'TestScene2', savePath: 'db://assets/scenes/TestScene2.scene' }, '创建场景'); await this.testTool('scene_get_current_scene', {}, '获取当前场景'); await this.testTool('scene_save_scene', {}, '保存场景'); await this.testTool('scene_get_scene_list', {}, '获取场景列表'); await this.testTool('scene_get_scene_hierarchy', {}, '获取场景层次结构'); // 2. 节点操作工具 this.printCategory('节点操作'); const nodeResult = await this.testTool('node_create_node', { name: 'TestNode' }, '创建节点'); let testNodeUuid = null; if (nodeResult && nodeResult.data && nodeResult.data.uuid) { testNodeUuid = nodeResult.data.uuid; } await this.testTool('node_get_all_nodes', {}, '获取所有节点'); await this.testTool('node_find_node_by_name', { name: 'TestNode' }, '按名称查找节点'); if (testNodeUuid) { await this.testTool('node_get_node_info', { uuid: testNodeUuid }, '获取节点信息'); await this.testTool('node_set_node_property', { uuid: testNodeUuid, property: 'position', value: { x: 100, y: 100, z: 0 } }, '设置节点属性'); await this.testTool('node_duplicate_node', { uuid: testNodeUuid }, '复制节点'); } // 3. 组件管理工具 this.printCategory('组件管理'); if (testNodeUuid) { await this.testTool('component_add_component', { nodeUuid: testNodeUuid, componentType: 'cc.Sprite' }, '添加组件'); await this.testTool('component_get_components', { nodeUuid: testNodeUuid }, '获取组件列表'); await this.testTool('component_get_component_info', { nodeUuid: testNodeUuid, componentType: 'cc.Sprite' }, '获取组件信息'); } await this.testTool('component_get_available_components', {}, '获取可用组件'); // 4. 预制体工具 this.printCategory('预制体管理'); if (testNodeUuid) { await this.testTool('prefab_create_prefab', { nodeUuid: testNodeUuid, prefabPath: 'db://assets/prefabs/TestPrefab.prefab' }, '创建预制体'); } await this.testTool('prefab_get_prefab_list', {}, '获取预制体列表'); await this.testTool('prefab_instantiate_prefab', { prefabPath: 'db://assets/prefabs/TestPrefab.prefab' }, '实例化预制体'); // 5. 项目和资源管理 this.printCategory('项目资源管理'); await this.testTool('project_get_project_info', {}, '获取项目信息'); await this.testTool('project_get_project_settings', {}, '获取项目设置'); await this.testTool('project_get_assets', { type: 'all' }, '获取资源列表'); await this.testTool('project_refresh_assets', {}, '刷新资源'); await this.testTool('project_create_asset', { url: 'db://assets/test-folder', content: null }, '创建资源文件夹'); // 6. 调试工具 this.printCategory('调试工具'); await this.testTool('debug_get_console_logs', {}, '获取控制台日志'); await this.testTool('debug_get_performance_stats', {}, '获取性能统计'); await this.testTool('debug_validate_scene', {}, '验证场景'); await this.testTool('debug_get_editor_info', {}, '获取编辑器信息'); // 7. 偏好设置工具 this.printCategory('偏好设置'); await this.testTool('preferences_get_preferences', {}, '获取偏好设置'); await this.testTool('preferences_get_global_preferences', {}, '获取全局偏好设置'); await this.testTool('preferences_get_recent_projects', {}, '获取最近项目'); // 8. 服务器控制工具 this.printCategory('服务器控制'); await this.testTool('server_get_server_info', {}, '获取服务器信息'); await this.testTool('server_get_editor_version', {}, '获取编辑器版本'); // 9. 广播消息工具 this.printCategory('广播消息'); await this.testTool('broadcast_get_broadcast_log', {}, '获取广播日志'); // 清理测试节点 if (testNodeUuid) { await this.testTool('node_delete_node', { uuid: testNodeUuid }, '删除测试节点'); } this.printSummary(); } } // 运行测试 const tester = new MCPTester(); tester.runAllTests().catch(console.error);