jarp-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.
@@ -0,0 +1,314 @@
1
+ import * as path from 'path';
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
4
+ import { DependencyScanner } from '../scanner/DependencyScanner.js';
5
+ const execAsync = promisify(exec);
6
+ export class JavaClassAnalyzer {
7
+ scanner;
8
+ constructor() {
9
+ this.scanner = new DependencyScanner();
10
+ }
11
+ /**
12
+ * Analyze Java class structure information
13
+ */
14
+ async analyzeClass(className, projectPath) {
15
+ try {
16
+ // 1. Get class file path
17
+ const jarPath = await this.scanner.findJarForClass(className, projectPath);
18
+ if (!jarPath) {
19
+ throw new Error(`JAR package for class ${className} not found`);
20
+ }
21
+ // 2. Use javap to analyze class in JAR package directly
22
+ const analysis = await this.analyzeClassWithJavap(jarPath, className);
23
+ return analysis;
24
+ }
25
+ catch (error) {
26
+ console.error(`Failed to analyze class ${className}:`, error);
27
+ throw error;
28
+ }
29
+ }
30
+ /**
31
+ * Use javap tool to analyze class structure in JAR package
32
+ */
33
+ async analyzeClassWithJavap(jarPath, className) {
34
+ try {
35
+ const javapCmd = this.getJavapCommand();
36
+ const quotedJavapCmd = javapCmd.includes(' ') ? `"${javapCmd}"` : javapCmd;
37
+ const quotedJarPath = jarPath.includes(' ') ? `"${jarPath}"` : jarPath;
38
+ // Use javap -v to get detailed information (including parameter names)
39
+ const { stdout } = await execAsync(`${quotedJavapCmd} -v -cp ${quotedJarPath} ${className}`, { timeout: 10000 });
40
+ return this.parseJavapOutput(stdout, className);
41
+ }
42
+ catch (error) {
43
+ console.error('javap analysis failed:', error);
44
+ throw new Error(`javap analysis failed: ${error instanceof Error ? error.message : String(error)}`);
45
+ }
46
+ }
47
+ /**
48
+ * Parse javap output
49
+ */
50
+ parseJavapOutput(output, className) {
51
+ const lines = output.split('\n');
52
+ const analysis = {
53
+ className: className.split('.').pop() || className,
54
+ packageName: '',
55
+ modifiers: [],
56
+ superClass: undefined,
57
+ interfaces: [],
58
+ fields: [],
59
+ methods: []
60
+ };
61
+ let currentMethod = null;
62
+ let inLocalVariableTable = false;
63
+ let methodParameters = {};
64
+ for (let i = 0; i < lines.length; i++) {
65
+ const line = lines[i];
66
+ const trimmedLine = line.trim();
67
+ // Parse class declaration
68
+ if (trimmedLine.startsWith('public class') || trimmedLine.startsWith('public interface') ||
69
+ trimmedLine.startsWith('public enum')) {
70
+ this.parseClassDeclaration(trimmedLine, analysis);
71
+ continue;
72
+ }
73
+ // Parse method declaration
74
+ if (trimmedLine.startsWith('public ') && trimmedLine.includes('(') && trimmedLine.includes(')')) {
75
+ currentMethod = this.parseMethodFromJavap(trimmedLine);
76
+ if (currentMethod) {
77
+ analysis.methods.push(currentMethod);
78
+ methodParameters = {};
79
+ }
80
+ continue;
81
+ }
82
+ // Detect LocalVariableTable start
83
+ if (trimmedLine === 'LocalVariableTable:') {
84
+ inLocalVariableTable = true;
85
+ continue;
86
+ }
87
+ // Parse parameter names in LocalVariableTable
88
+ if (inLocalVariableTable && currentMethod) {
89
+ if (trimmedLine.startsWith('Start') || trimmedLine.startsWith('Slot')) {
90
+ continue; // Skip header
91
+ }
92
+ if (trimmedLine === '') {
93
+ // LocalVariableTable ended, immediately update current method's parameter names
94
+ if (Object.keys(methodParameters).length > 0) {
95
+ const updatedParams = [];
96
+ for (let j = 0; j < currentMethod.parameters.length; j++) {
97
+ const paramType = currentMethod.parameters[j];
98
+ const paramName = methodParameters[j] || `param${j + 1}`;
99
+ updatedParams.push(`${paramType} ${paramName}`);
100
+ }
101
+ currentMethod.parameters = updatedParams;
102
+ }
103
+ inLocalVariableTable = false;
104
+ methodParameters = {};
105
+ continue;
106
+ }
107
+ // Parse parameter line: "0 6 0 file Ljava/io/File;"
108
+ const paramMatch = trimmedLine.match(/^\s*\d+\s+\d+\s+(\d+)\s+(\w+)\s+(.+)$/);
109
+ if (paramMatch) {
110
+ const slot = parseInt(paramMatch[1]);
111
+ const paramName = paramMatch[2];
112
+ const paramType = paramMatch[3];
113
+ // Only handle parameters (slot >= 0, but exclude local variables)
114
+ // Parameters are usually in the first few slots, local variables come after
115
+ if (slot >= 0 && slot < currentMethod.parameters.length) {
116
+ methodParameters[slot] = paramName;
117
+ }
118
+ }
119
+ }
120
+ // Detect method end - when next method or class end is encountered
121
+ if (currentMethod && ((trimmedLine.startsWith('public ') && trimmedLine.includes('(') && trimmedLine.includes(')')) ||
122
+ trimmedLine.startsWith('}') ||
123
+ trimmedLine.startsWith('SourceFile:'))) {
124
+ // Update method's parameter names
125
+ if (Object.keys(methodParameters).length > 0) {
126
+ const updatedParams = [];
127
+ for (let j = 0; j < currentMethod.parameters.length; j++) {
128
+ const paramType = currentMethod.parameters[j];
129
+ const paramName = methodParameters[j] || `param${j + 1}`;
130
+ updatedParams.push(`${paramType} ${paramName}`);
131
+ }
132
+ currentMethod.parameters = updatedParams;
133
+ }
134
+ currentMethod = null;
135
+ inLocalVariableTable = false;
136
+ methodParameters = {};
137
+ }
138
+ }
139
+ return analysis;
140
+ }
141
+ /**
142
+ * Parse class declaration
143
+ */
144
+ parseClassDeclaration(line, analysis) {
145
+ // Extract modifiers
146
+ const modifiers = line.match(/\b(public|private|protected|static|final|abstract|strictfp)\b/g) || [];
147
+ analysis.modifiers = modifiers;
148
+ // Extract package name (inferred from class name)
149
+ const classMatch = line.match(/(?:public\s+)?(?:class|interface|enum)\s+([a-zA-Z_$][a-zA-Z0-9_$.]*)/);
150
+ if (classMatch) {
151
+ const fullClassName = classMatch[1];
152
+ const parts = fullClassName.split('.');
153
+ if (parts.length > 1) {
154
+ analysis.packageName = parts.slice(0, -1).join('.');
155
+ analysis.className = parts[parts.length - 1];
156
+ }
157
+ }
158
+ // Extract superclass
159
+ const extendsMatch = line.match(/extends\s+([a-zA-Z_$][a-zA-Z0-9_$.]*)/);
160
+ if (extendsMatch) {
161
+ analysis.superClass = extendsMatch[1];
162
+ }
163
+ // Extract interfaces
164
+ const implementsMatch = line.match(/implements\s+([^{]+)/);
165
+ if (implementsMatch) {
166
+ const interfaces = implementsMatch[1]
167
+ .split(',')
168
+ .map(iface => iface.trim())
169
+ .filter(iface => iface);
170
+ analysis.interfaces = interfaces;
171
+ }
172
+ }
173
+ /**
174
+ * Parse method from javap output
175
+ */
176
+ parseMethodFromJavap(line) {
177
+ try {
178
+ const trimmedLine = line.trim();
179
+ // Extract modifiers
180
+ const modifiers = [];
181
+ let startIndex = 0;
182
+ const modifierWords = ['public', 'private', 'protected', 'static', 'final', 'abstract', 'synchronized', 'native'];
183
+ // Handle multiple modifiers
184
+ let remainingLine = trimmedLine;
185
+ while (true) {
186
+ let foundModifier = false;
187
+ for (const modifier of modifierWords) {
188
+ if (remainingLine.startsWith(modifier + ' ')) {
189
+ modifiers.push(modifier);
190
+ remainingLine = remainingLine.substring(modifier.length + 1);
191
+ startIndex += modifier.length + 1;
192
+ foundModifier = true;
193
+ break;
194
+ }
195
+ }
196
+ if (!foundModifier) {
197
+ break;
198
+ }
199
+ }
200
+ // Find method name and parameters part
201
+ const parenIndex = trimmedLine.indexOf('(');
202
+ if (parenIndex === -1)
203
+ return null;
204
+ const closeParenIndex = trimmedLine.indexOf(')', parenIndex);
205
+ if (closeParenIndex === -1)
206
+ return null;
207
+ // Extract return type and method name
208
+ const beforeParen = trimmedLine.substring(startIndex, parenIndex).trim();
209
+ const lastSpaceIndex = beforeParen.lastIndexOf(' ');
210
+ if (lastSpaceIndex === -1)
211
+ return null;
212
+ const returnType = beforeParen.substring(0, lastSpaceIndex).trim();
213
+ const methodName = beforeParen.substring(lastSpaceIndex + 1).trim();
214
+ // Extract parameters
215
+ const paramsStr = trimmedLine.substring(parenIndex + 1, closeParenIndex).trim();
216
+ const parameters = [];
217
+ if (paramsStr) {
218
+ // Handle parameters, need to consider generics and nested types
219
+ const paramParts = this.splitParameters(paramsStr);
220
+ for (const param of paramParts) {
221
+ const trimmedParam = param.trim();
222
+ if (trimmedParam) {
223
+ parameters.push(trimmedParam);
224
+ }
225
+ }
226
+ }
227
+ return {
228
+ name: methodName,
229
+ returnType,
230
+ parameters,
231
+ modifiers
232
+ };
233
+ }
234
+ catch (error) {
235
+ console.error('Failed to parse method:', line, error);
236
+ return null;
237
+ }
238
+ }
239
+ /**
240
+ * Smart parameter splitting, handling generics and nested types
241
+ */
242
+ splitParameters(paramsStr) {
243
+ const params = [];
244
+ let current = '';
245
+ let angleBracketCount = 0;
246
+ for (let i = 0; i < paramsStr.length; i++) {
247
+ const char = paramsStr[i];
248
+ if (char === '<') {
249
+ angleBracketCount++;
250
+ }
251
+ else if (char === '>') {
252
+ angleBracketCount--;
253
+ }
254
+ else if (char === ',' && angleBracketCount === 0) {
255
+ params.push(current.trim());
256
+ current = '';
257
+ continue;
258
+ }
259
+ current += char;
260
+ }
261
+ if (current.trim()) {
262
+ params.push(current.trim());
263
+ }
264
+ return params;
265
+ }
266
+ /**
267
+ * Get javap command path
268
+ */
269
+ getJavapCommand() {
270
+ const javaHome = process.env.JAVA_HOME;
271
+ if (javaHome) {
272
+ return path.join(javaHome, 'bin', 'javap.exe');
273
+ }
274
+ return 'javap';
275
+ }
276
+ /**
277
+ * Get class inheritance hierarchy
278
+ */
279
+ async getInheritanceHierarchy(className, projectPath) {
280
+ const analysis = await this.analyzeClass(className, projectPath);
281
+ const hierarchy = [className];
282
+ if (analysis.superClass) {
283
+ try {
284
+ const superHierarchy = await this.getInheritanceHierarchy(analysis.superClass, projectPath);
285
+ hierarchy.unshift(...superHierarchy);
286
+ }
287
+ catch (error) {
288
+ // If parent class is not in current project, add directly
289
+ hierarchy.unshift(analysis.superClass);
290
+ }
291
+ }
292
+ return hierarchy;
293
+ }
294
+ /**
295
+ * Find all subclasses of a class
296
+ */
297
+ async findSubClasses(className, projectPath) {
298
+ const allClasses = await this.scanner.getAllClassNames(projectPath);
299
+ const subClasses = [];
300
+ for (const cls of allClasses) {
301
+ try {
302
+ const analysis = await this.analyzeClass(cls, projectPath);
303
+ if (analysis.superClass === className) {
304
+ subClasses.push(cls);
305
+ }
306
+ }
307
+ catch (error) {
308
+ // Ignore types that failed analysis
309
+ }
310
+ }
311
+ return subClasses;
312
+ }
313
+ }
314
+ //# sourceMappingURL=JavaClassAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JavaClassAnalyzer.js","sourceRoot":"","sources":["../../src/analyzer/JavaClassAnalyzer.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { JavaClassAnalyzerMCPServer } from './index.js';
4
+ const program = new Command();
5
+ program
6
+ .name('jarp-mcp')
7
+ .description('JARP MCP - Java Archive Reader for AI. MCP server that gives AI agents instant access to decompiled Java code.')
8
+ .version('1.0.1');
9
+ program
10
+ .command('start')
11
+ .description('Start MCP server')
12
+ .option('-e, --env <environment>', 'Runtime environment (development|production)', 'production')
13
+ .action(async (options) => {
14
+ // Set environment variables
15
+ if (options.env) {
16
+ process.env.NODE_ENV = options.env;
17
+ }
18
+ console.log(`Starting Java Class Analyzer MCP Server (${options.env} mode)...`);
19
+ const server = new JavaClassAnalyzerMCPServer();
20
+ await server.run();
21
+ });
22
+ program
23
+ .command('test')
24
+ .description('Test MCP server functionality')
25
+ .option('-p, --project <path>', 'Maven project path')
26
+ .option('-c, --class <className>', 'Class name to test')
27
+ .option('--no-cache', 'Do not use cache')
28
+ .option('--cfr-path <path>', 'CFR decompiler tool path')
29
+ .action(async (options) => {
30
+ console.log('Test mode - please use test-tools.js for complete testing');
31
+ console.log('Run: node test-tools.js --help for detailed usage');
32
+ });
33
+ program
34
+ .command('config')
35
+ .description('Generate MCP client configuration example')
36
+ .option('-o, --output <file>', 'Output configuration file path', 'mcp-client-config.json')
37
+ .action(async (options) => {
38
+ const config = {
39
+ mcpServers: {
40
+ "jarp-mcp": {
41
+ command: "jarp-mcp",
42
+ args: ["start"],
43
+ env: {
44
+ NODE_ENV: "production",
45
+ MAVEN_REPO: process.env.MAVEN_REPO || "",
46
+ JAVA_HOME: process.env.JAVA_HOME || "",
47
+ CFR_PATH: process.env.CFR_PATH || ""
48
+ }
49
+ }
50
+ }
51
+ };
52
+ const fs = await import('fs-extra');
53
+ await fs.default.writeJson(options.output, config, { spaces: 2 });
54
+ console.log(`MCP client configuration generated: ${options.output}`);
55
+ console.log('\nUsage instructions:');
56
+ console.log('1. Add this configuration to your MCP client configuration file');
57
+ console.log('2. Modify environment variable settings as needed');
58
+ console.log('3. Restart MCP client');
59
+ });
60
+ // Default command
61
+ if (process.argv.length === 2) {
62
+ // If no subcommand provided, start server by default
63
+ process.env.NODE_ENV = process.env.NODE_ENV || 'production';
64
+ const server = new JavaClassAnalyzerMCPServer();
65
+ server.run().catch((error) => {
66
+ console.error('Server startup failed:', error);
67
+ process.exit(1);
68
+ });
69
+ }
70
+ else {
71
+ program.parse();
72
+ }
73
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export declare class DecompilerService {
2
+ private scanner;
3
+ private cfrPath;
4
+ constructor();
5
+ private initializeCfrPath;
6
+ /**
7
+ * Decompile specified Java class file
8
+ */
9
+ decompileClass(className: string, projectPath: string, useCache?: boolean, cfrPath?: string): Promise<string>;
10
+ /**
11
+ * Get cache file path
12
+ */
13
+ private getCachePath;
14
+ /**
15
+ * Extract specified .class file from JAR package
16
+ */
17
+ private extractClassFile;
18
+ /**
19
+ * Use CFR to decompile .class file
20
+ */
21
+ private decompileWithCfr;
22
+ /**
23
+ * Find CFR jar package path
24
+ */
25
+ private findCfrJar;
26
+ /**
27
+ * Batch decompile multiple classes
28
+ */
29
+ decompileClasses(classNames: string[], projectPath: string, useCache?: boolean, cfrPath?: string): Promise<Map<string, string>>;
30
+ /**
31
+ * Get Java command path
32
+ */
33
+ private getJavaCommand;
34
+ }
35
+ //# sourceMappingURL=DecompilerService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DecompilerService.d.ts","sourceRoot":"","sources":["../../src/decompiler/DecompilerService.ts"],"names":[],"mappings":"AAeA,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAS;;YAOV,iBAAiB;IAU/B;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+DzH;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;YACW,gBAAgB;IA6D9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,UAAU;IAgCxB;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAiB3I;;OAEG;IACH,OAAO,CAAC,cAAc;CAQzB"}