@yeepay/coderocket-mcp 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,167 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { CodeRocketService } from './coderocket.js';
6
+ import { ReviewCodeRequestSchema, ReviewCommitRequestSchema, ReviewFilesRequestSchema, ConfigureAIServiceRequestSchema, } from './types.js';
7
+ /**
8
+ * CodeRocket MCP Server
9
+ *
10
+ * 提供AI驱动的代码审查功能,集成多种AI服务(Gemini、OpenCode、ClaudeCode)
11
+ * 支持代码片段审查、Git提交审查、文件审查和AI服务管理
12
+ */
13
+ class CodeRocketMCPServer {
14
+ server;
15
+ codeRocketService;
16
+ constructor() {
17
+ this.server = new Server({
18
+ name: 'coderocket-mcp',
19
+ version: '1.0.0',
20
+ }, {
21
+ capabilities: {
22
+ tools: {},
23
+ },
24
+ });
25
+ this.codeRocketService = new CodeRocketService();
26
+ this.setupToolHandlers();
27
+ }
28
+ setupToolHandlers() {
29
+ // 注册工具列表处理器
30
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
31
+ return {
32
+ tools: [
33
+ {
34
+ name: 'review_code',
35
+ description: '审查代码片段,提供详细的质量分析和改进建议',
36
+ inputSchema: ReviewCodeRequestSchema,
37
+ },
38
+ {
39
+ name: 'review_commit',
40
+ description: '审查Git提交,分析代码变更的质量和影响',
41
+ inputSchema: ReviewCommitRequestSchema,
42
+ },
43
+ {
44
+ name: 'review_files',
45
+ description: '审查指定文件列表,提供全面的代码质量评估',
46
+ inputSchema: ReviewFilesRequestSchema,
47
+ },
48
+ {
49
+ name: 'configure_ai_service',
50
+ description: '配置AI服务设置,包括服务选择、API密钥等',
51
+ inputSchema: ConfigureAIServiceRequestSchema,
52
+ },
53
+ {
54
+ name: 'get_ai_service_status',
55
+ description: '获取所有AI服务的状态信息,包括可用性和配置状态',
56
+ inputSchema: {
57
+ type: 'object',
58
+ properties: {},
59
+ additionalProperties: false,
60
+ },
61
+ },
62
+ ],
63
+ };
64
+ });
65
+ // 注册工具调用处理器
66
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
67
+ const { name, arguments: args } = request.params;
68
+ try {
69
+ switch (name) {
70
+ case 'review_code': {
71
+ const parsedArgs = ReviewCodeRequestSchema.parse(args);
72
+ const result = await this.codeRocketService.reviewCode(parsedArgs);
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: JSON.stringify(result, null, 2),
78
+ },
79
+ ],
80
+ };
81
+ }
82
+ case 'review_commit': {
83
+ const parsedArgs = ReviewCommitRequestSchema.parse(args);
84
+ const result = await this.codeRocketService.reviewCommit(parsedArgs);
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: JSON.stringify(result, null, 2),
90
+ },
91
+ ],
92
+ };
93
+ }
94
+ case 'review_files': {
95
+ const parsedArgs = ReviewFilesRequestSchema.parse(args);
96
+ const result = await this.codeRocketService.reviewFiles(parsedArgs);
97
+ return {
98
+ content: [
99
+ {
100
+ type: 'text',
101
+ text: JSON.stringify(result, null, 2),
102
+ },
103
+ ],
104
+ };
105
+ }
106
+ case 'configure_ai_service': {
107
+ const parsedArgs = ConfigureAIServiceRequestSchema.parse(args);
108
+ const result = await this.codeRocketService.configureAIService(parsedArgs);
109
+ return {
110
+ content: [
111
+ {
112
+ type: 'text',
113
+ text: JSON.stringify(result, null, 2),
114
+ },
115
+ ],
116
+ };
117
+ }
118
+ case 'get_ai_service_status': {
119
+ const result = await this.codeRocketService.getAIServiceStatus();
120
+ return {
121
+ content: [
122
+ {
123
+ type: 'text',
124
+ text: JSON.stringify(result, null, 2),
125
+ },
126
+ ],
127
+ };
128
+ }
129
+ default:
130
+ throw new Error(`Unknown tool: ${name}`);
131
+ }
132
+ }
133
+ catch (error) {
134
+ const errorMessage = error instanceof Error ? error.message : String(error);
135
+ return {
136
+ content: [
137
+ {
138
+ type: 'text',
139
+ text: JSON.stringify({
140
+ error: errorMessage,
141
+ error_code: 'TOOL_EXECUTION_ERROR',
142
+ suggestions: [
143
+ '检查输入参数是否正确',
144
+ '确保coderocket-cli已正确安装',
145
+ '验证AI服务配置是否正确',
146
+ ],
147
+ }, null, 2),
148
+ },
149
+ ],
150
+ isError: true,
151
+ };
152
+ }
153
+ });
154
+ }
155
+ async run() {
156
+ const transport = new StdioServerTransport();
157
+ await this.server.connect(transport);
158
+ console.error('CodeRocket MCP Server running on stdio');
159
+ }
160
+ }
161
+ // 启动服务器
162
+ const server = new CodeRocketMCPServer();
163
+ server.run().catch(error => {
164
+ console.error('Failed to start server:', error);
165
+ process.exit(1);
166
+ });
167
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * 日志级别
3
+ */
4
+ export declare enum LogLevel {
5
+ DEBUG = 0,
6
+ INFO = 1,
7
+ WARN = 2,
8
+ ERROR = 3
9
+ }
10
+ /**
11
+ * 简单的日志记录器
12
+ */
13
+ export declare class Logger {
14
+ private logLevel;
15
+ private logFile?;
16
+ constructor(level?: LogLevel, logFile?: string);
17
+ /**
18
+ * 记录调试信息
19
+ */
20
+ debug(message: string, context?: Record<string, any>): void;
21
+ /**
22
+ * 记录信息
23
+ */
24
+ info(message: string, context?: Record<string, any>): void;
25
+ /**
26
+ * 记录警告
27
+ */
28
+ warn(message: string, context?: Record<string, any>): void;
29
+ /**
30
+ * 记录错误
31
+ */
32
+ error(message: string, error?: Error, context?: Record<string, any>): void;
33
+ /**
34
+ * 核心日志记录方法
35
+ */
36
+ private log;
37
+ /**
38
+ * 获取日志文件路径
39
+ */
40
+ getLogFile(): string | undefined;
41
+ /**
42
+ * 设置日志级别
43
+ */
44
+ setLevel(level: LogLevel): void;
45
+ }
46
+ export declare const logger: Logger;
47
+ /**
48
+ * 错误处理工具类
49
+ */
50
+ export declare class ErrorHandler {
51
+ private logger;
52
+ constructor(logger: Logger);
53
+ /**
54
+ * 处理并格式化错误
55
+ */
56
+ handleError(error: unknown, context?: string): Error;
57
+ /**
58
+ * 包装异步函数,自动处理错误
59
+ */
60
+ wrapAsync<T extends any[], R>(fn: (...args: T) => Promise<R>, context?: string): (...args: T) => Promise<R>;
61
+ /**
62
+ * 创建用户友好的错误消息
63
+ */
64
+ createUserFriendlyError(error: Error, suggestions?: string[]): {
65
+ error: string;
66
+ error_code: string;
67
+ suggestions: string[];
68
+ };
69
+ }
70
+ export declare const errorHandler: ErrorHandler;
71
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAaD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,KAAK,GAAE,QAAwB,EAAE,OAAO,CAAC,EAAE,MAAM;IAU7D;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIpD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAInD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAInD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAInE;;OAEG;YACW,GAAG;IAmDjB;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,SAAS;IAIhC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ;CAGzB;AAGD,eAAO,MAAM,MAAM,QAElB,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK;IAqBpD;;OAEG;IACH,SAAS,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAC1B,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9B,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;IAU7B;;OAEG;IACH,uBAAuB,CACrB,KAAK,EAAE,KAAK,EACZ,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB;QACD,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB;CAoDF;AAGD,eAAO,MAAM,YAAY,cAA2B,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,204 @@
1
+ import { appendFile } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { tmpdir } from 'os';
4
+ /**
5
+ * 日志级别
6
+ */
7
+ export var LogLevel;
8
+ (function (LogLevel) {
9
+ LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
10
+ LogLevel[LogLevel["INFO"] = 1] = "INFO";
11
+ LogLevel[LogLevel["WARN"] = 2] = "WARN";
12
+ LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
13
+ })(LogLevel || (LogLevel = {}));
14
+ /**
15
+ * 简单的日志记录器
16
+ */
17
+ export class Logger {
18
+ logLevel;
19
+ logFile;
20
+ constructor(level = LogLevel.INFO, logFile) {
21
+ this.logLevel = level;
22
+ this.logFile = logFile;
23
+ // 如果没有指定日志文件,使用临时目录
24
+ if (!this.logFile) {
25
+ this.logFile = join(tmpdir(), 'coderocket-mcp.log');
26
+ }
27
+ }
28
+ /**
29
+ * 记录调试信息
30
+ */
31
+ debug(message, context) {
32
+ this.log(LogLevel.DEBUG, message, context);
33
+ }
34
+ /**
35
+ * 记录信息
36
+ */
37
+ info(message, context) {
38
+ this.log(LogLevel.INFO, message, context);
39
+ }
40
+ /**
41
+ * 记录警告
42
+ */
43
+ warn(message, context) {
44
+ this.log(LogLevel.WARN, message, context);
45
+ }
46
+ /**
47
+ * 记录错误
48
+ */
49
+ error(message, error, context) {
50
+ this.log(LogLevel.ERROR, message, context, error);
51
+ }
52
+ /**
53
+ * 核心日志记录方法
54
+ */
55
+ async log(level, message, context, error) {
56
+ if (level < this.logLevel) {
57
+ return;
58
+ }
59
+ const entry = {
60
+ timestamp: new Date().toISOString(),
61
+ level,
62
+ message,
63
+ context,
64
+ error,
65
+ };
66
+ // 输出到控制台(根据日志级别选择合适的输出流)
67
+ const levelName = LogLevel[level];
68
+ const contextStr = context ? ` ${JSON.stringify(context)}` : '';
69
+ const errorStr = error ? ` Error: ${error.message}` : '';
70
+ const logMethod = level >= LogLevel.WARN ? console.error : console.log;
71
+ logMethod(`[${entry.timestamp}] ${levelName}: ${message}${contextStr}${errorStr}`);
72
+ // 写入日志文件
73
+ if (this.logFile) {
74
+ try {
75
+ // 处理 Error 对象,避免循环结构
76
+ let logEntry = entry;
77
+ if (entry.error instanceof Error) {
78
+ logEntry = {
79
+ ...entry,
80
+ error: {
81
+ name: entry.error.name,
82
+ message: entry.error.message,
83
+ stack: entry.error.stack,
84
+ },
85
+ };
86
+ }
87
+ const logLine = JSON.stringify(logEntry) + '\n';
88
+ await appendFile(this.logFile, logLine, 'utf-8');
89
+ }
90
+ catch (fileError) {
91
+ console.error('Failed to write to log file:', fileError);
92
+ }
93
+ }
94
+ }
95
+ /**
96
+ * 获取日志文件路径
97
+ */
98
+ getLogFile() {
99
+ return this.logFile;
100
+ }
101
+ /**
102
+ * 设置日志级别
103
+ */
104
+ setLevel(level) {
105
+ this.logLevel = level;
106
+ }
107
+ }
108
+ // 全局日志实例
109
+ export const logger = new Logger(process.env.NODE_ENV === 'development' ? LogLevel.DEBUG : LogLevel.INFO);
110
+ /**
111
+ * 错误处理工具类
112
+ */
113
+ export class ErrorHandler {
114
+ logger;
115
+ constructor(logger) {
116
+ this.logger = logger;
117
+ }
118
+ /**
119
+ * 处理并格式化错误
120
+ */
121
+ handleError(error, context) {
122
+ let formattedError;
123
+ if (error instanceof Error) {
124
+ formattedError = error;
125
+ }
126
+ else if (typeof error === 'string') {
127
+ formattedError = new Error(error);
128
+ }
129
+ else {
130
+ formattedError = new Error(`Unknown error: ${JSON.stringify(error)}`);
131
+ }
132
+ // 记录错误
133
+ this.logger.error(`${context ? `[${context}] ` : ''}${formattedError.message}`, formattedError, { context });
134
+ return formattedError;
135
+ }
136
+ /**
137
+ * 包装异步函数,自动处理错误
138
+ */
139
+ wrapAsync(fn, context) {
140
+ return async (...args) => {
141
+ try {
142
+ return await fn(...args);
143
+ }
144
+ catch (error) {
145
+ throw this.handleError(error, context);
146
+ }
147
+ };
148
+ }
149
+ /**
150
+ * 创建用户友好的错误消息
151
+ */
152
+ createUserFriendlyError(error, suggestions) {
153
+ // 根据错误类型提供不同的错误代码和建议
154
+ let errorCode = 'UNKNOWN_ERROR';
155
+ let userSuggestions = suggestions || [];
156
+ if (error.message.includes('Shell command failed')) {
157
+ errorCode = 'SHELL_COMMAND_ERROR';
158
+ userSuggestions = [
159
+ '检查coderocket-cli是否正确安装',
160
+ '验证AI服务是否已配置',
161
+ '确保有足够的权限执行命令',
162
+ ...userSuggestions,
163
+ ];
164
+ }
165
+ else if (error.message.includes('AI服务') ||
166
+ error.message.includes('AI service')) {
167
+ errorCode = 'AI_SERVICE_ERROR';
168
+ userSuggestions = [
169
+ '检查AI服务配置',
170
+ '验证API密钥是否正确',
171
+ '确保网络连接正常',
172
+ '尝试切换到其他AI服务',
173
+ ...userSuggestions,
174
+ ];
175
+ }
176
+ else if (error.message.includes('文件') ||
177
+ error.message.includes('file')) {
178
+ errorCode = 'FILE_ERROR';
179
+ userSuggestions = [
180
+ '检查文件路径是否正确',
181
+ '确保文件存在且可读',
182
+ '验证文件权限',
183
+ ...userSuggestions,
184
+ ];
185
+ }
186
+ else if (error.message.includes('Git') || error.message.includes('git')) {
187
+ errorCode = 'GIT_ERROR';
188
+ userSuggestions = [
189
+ '确保在Git仓库中执行',
190
+ '检查Git仓库状态',
191
+ '验证提交哈希是否存在',
192
+ ...userSuggestions,
193
+ ];
194
+ }
195
+ return {
196
+ error: error.message,
197
+ error_code: errorCode,
198
+ suggestions: userSuggestions,
199
+ };
200
+ }
201
+ }
202
+ // 全局错误处理器实例
203
+ export const errorHandler = new ErrorHandler(logger);
204
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
package/dist/test.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeRocket MCP 测试脚本
4
+ *
5
+ * 用于测试MCP服务器的基本功能
6
+ */
7
+ declare function runTests(): Promise<void>;
8
+ export { runTests };
9
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AA4FH,iBAAe,QAAQ,kBAqBtB;AAUD,OAAO,EAAE,QAAQ,EAAE,CAAC"}
package/dist/test.js ADDED
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeRocket MCP 测试脚本
4
+ *
5
+ * 用于测试MCP服务器的基本功能
6
+ */
7
+ import { CodeRocketService } from './coderocket.js';
8
+ import { logger } from './logger.js';
9
+ async function testCodeReview() {
10
+ console.log('🧪 测试代码审查功能...\n');
11
+ const service = new CodeRocketService();
12
+ // 测试代码片段审查
13
+ try {
14
+ const result = await service.reviewCode({
15
+ code: `function add(a, b) {
16
+ return a + b;
17
+ }
18
+
19
+ function multiply(a, b) {
20
+ var result = 0;
21
+ for (var i = 0; i < b; i++) {
22
+ result = add(result, a);
23
+ }
24
+ return result;
25
+ }`,
26
+ language: 'javascript',
27
+ context: '简单的数学函数实现',
28
+ });
29
+ console.log('✅ 代码审查测试成功');
30
+ console.log('状态:', result.status);
31
+ console.log('摘要:', result.summary);
32
+ console.log('AI服务:', result.ai_service_used);
33
+ console.log('时间:', result.timestamp);
34
+ console.log('---\n');
35
+ }
36
+ catch (error) {
37
+ console.error('❌ 代码审查测试失败:', error);
38
+ }
39
+ }
40
+ async function testServiceStatus() {
41
+ console.log('🔍 测试服务状态功能...\n');
42
+ const service = new CodeRocketService();
43
+ try {
44
+ const status = await service.getAIServiceStatus();
45
+ console.log('✅ 服务状态测试成功');
46
+ console.log('当前服务:', status.current_service);
47
+ console.log('自动切换:', status.auto_switch_enabled);
48
+ console.log('服务状态:');
49
+ status.services.forEach(svc => {
50
+ console.log(` - ${svc.service}: ${svc.available ? '✅' : '❌'} 可用, ${svc.configured ? '✅' : '❌'} 已配置`);
51
+ if (!svc.available && svc.install_command) {
52
+ console.log(` 安装命令: ${svc.install_command}`);
53
+ }
54
+ if (!svc.configured && svc.config_command) {
55
+ console.log(` 配置命令: ${svc.config_command}`);
56
+ }
57
+ });
58
+ console.log('---\n');
59
+ }
60
+ catch (error) {
61
+ console.error('❌ 服务状态测试失败:', error);
62
+ }
63
+ }
64
+ async function testConfiguration() {
65
+ console.log('⚙️ 测试配置功能...\n');
66
+ const service = new CodeRocketService();
67
+ try {
68
+ const result = await service.configureAIService({
69
+ service: 'gemini',
70
+ scope: 'project',
71
+ timeout: 60,
72
+ max_retries: 2,
73
+ });
74
+ console.log('✅ 配置测试成功');
75
+ console.log('结果:', result.message);
76
+ console.log('数据:', JSON.stringify(result.data, null, 2));
77
+ console.log('---\n');
78
+ }
79
+ catch (error) {
80
+ console.error('❌ 配置测试失败:', error);
81
+ }
82
+ }
83
+ async function runTests() {
84
+ console.log('🚀 CodeRocket MCP 测试开始\n');
85
+ console.log('='.repeat(50));
86
+ // 测试服务状态
87
+ await testServiceStatus();
88
+ // 测试配置功能
89
+ await testConfiguration();
90
+ // 测试代码审查(如果有可用的AI服务)
91
+ await testCodeReview();
92
+ console.log('='.repeat(50));
93
+ console.log('🎉 测试完成!');
94
+ // 显示日志文件位置
95
+ const logFile = logger.getLogFile();
96
+ if (logFile) {
97
+ console.log(`📝 详细日志: ${logFile}`);
98
+ }
99
+ }
100
+ // 运行测试
101
+ if (import.meta.url === `file://${process.argv[1]}`) {
102
+ runTests().catch(error => {
103
+ console.error('测试运行失败:', error);
104
+ process.exit(1);
105
+ });
106
+ }
107
+ export { runTests };
108
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}