@yeepay/coderocket-mcp
Version:
CodeRocket MCP - Independent AI-powered code review server for Model Context Protocol
168 lines • 7.46 kB
JavaScript
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
import { readFile } from 'fs/promises';
import { resolve, dirname } from 'path';
import { fileURLToPath } from 'url';
import { CodeRocketService, initializeCodeRocket } from './coderocket.js';
import { CODEROCKET_TOOLS } from './standardToolDefinitions.js';
// 调试模式检测
const DEBUG_MODE = process.env.DEBUG === 'true' || process.env.NODE_ENV === 'development';
function debugLog(message, data) {
console.error(`[CODEROCKET-MCP-DEBUG] ${new Date().toISOString()} - ${message}`);
if (data) {
console.error(`[CODEROCKET-MCP-DEBUG] Data:`, JSON.stringify(data, null, 2));
}
}
// 读取版本号
const getVersion = async () => {
try {
const __dirname = dirname(fileURLToPath(import.meta.url));
const packageJsonPath = resolve(__dirname, '../package.json');
const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));
return packageJson.version || 'unknown';
}
catch (error) {
console.error('Failed to read version from package.json:', error);
return 'unknown';
}
};
const VERSION = await getVersion();
/**
* CodeRocket MCP Server
*
* 提供AI驱动的代码审查功能,集成多种AI服务(Gemini、ClaudeCode)
* 支持代码片段审查、Git提交审查、文件审查和AI服务管理
*/
class CodeRocketMCPServer {
server;
codeRocketService = null;
constructor() {
debugLog('🚀 CodeRocket MCP Server 构造函数开始', { version: VERSION });
this.server = new Server({
name: 'coderocket-mcp',
version: VERSION,
}, {
capabilities: {
tools: {},
},
});
debugLog('✅ MCP Server 实例创建完成');
// 延迟初始化 CodeRocketService,等待 ConfigManager 初始化完成
this.setupToolHandlers();
debugLog('✅ 工具处理器设置完成');
}
setupToolHandlers() {
debugLog('🔧 开始设置工具处理器');
// 注册工具列表处理器
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
debugLog('📋 收到工具列表请求');
debugLog('📋 返回工具列表', {
toolCount: CODEROCKET_TOOLS.length,
toolNames: CODEROCKET_TOOLS.map(t => t.name)
});
return { tools: CODEROCKET_TOOLS };
});
// 注册工具调用处理器
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
debugLog('🔧 收到工具调用请求', { toolName: name, args });
// 确保 CodeRocketService 已初始化
if (!this.codeRocketService) {
debugLog('❌ CodeRocketService 未初始化');
throw new Error('CodeRocketService 未初始化,请稍后重试');
}
try {
let result;
const safeArgs = args || {};
switch (name) {
case 'review_code':
result = await this.codeRocketService.reviewCode(safeArgs);
break;
case 'review_changes':
result = await this.codeRocketService.reviewChanges(safeArgs);
break;
case 'review_commit':
result = await this.codeRocketService.reviewCommit(safeArgs);
break;
case 'review_files':
result = await this.codeRocketService.reviewFiles(safeArgs);
break;
case 'configure_ai_service':
result = await this.codeRocketService.configureAIService(safeArgs);
break;
case 'get_ai_service_status':
result = await this.codeRocketService.getAIServiceStatus(safeArgs);
break;
default:
throw new Error(`未知工具: ${name}`);
}
debugLog('✅ 工具调用成功', { toolName: name, resultType: typeof result });
return {
content: [
{
type: 'text',
text: JSON.stringify(result, null, 2),
},
],
};
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
debugLog('❌ 工具调用失败', { toolName: name, error: errorMessage });
return {
content: [
{
type: 'text',
text: JSON.stringify({
error: errorMessage,
error_code: 'TOOL_EXECUTION_ERROR',
suggestions: [
'检查输入参数是否正确',
'验证AI服务配置是否正确',
'确保API密钥已正确设置',
'检查网络连接是否正常',
],
}, null, 2),
},
],
isError: true,
};
}
});
}
async run() {
try {
debugLog('🚀 开始启动 CodeRocket MCP 服务器');
// 使用新的初始化函数初始化所有系统组件
debugLog('🔧 开始初始化系统组件');
await initializeCodeRocket();
debugLog('✅ 系统组件初始化完成');
// 现在可以安全地初始化 CodeRocketService
debugLog('🔧 开始初始化 CodeRocketService');
this.codeRocketService = new CodeRocketService();
debugLog('✅ CodeRocketService 初始化完成');
debugLog('🔧 开始连接 MCP 传输层');
const transport = new StdioServerTransport();
await this.server.connect(transport);
debugLog('✅ MCP 服务器启动成功,等待客户端连接');
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
debugLog('❌ 服务器启动失败', { error: errorMessage, stack: error instanceof Error ? error.stack : undefined });
console.error('❌ CodeRocket MCP 服务器启动失败:', errorMessage);
process.exit(1);
}
}
}
// 启动服务器
debugLog('🌟 开始创建 CodeRocket MCP 服务器实例');
const server = new CodeRocketMCPServer();
debugLog('🌟 服务器实例创建完成,开始运行');
server.run().catch(error => {
debugLog('💥 服务器运行失败', { error: error.message, stack: error.stack });
console.error('Failed to start server:', error);
process.exit(1);
});
//# sourceMappingURL=index.js.map