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.
- package/LICENSE +201 -0
- package/README.md +365 -0
- package/dist/analyzer/JavaClassAnalyzer.d.ts +61 -0
- package/dist/analyzer/JavaClassAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/JavaClassAnalyzer.js +314 -0
- package/dist/analyzer/JavaClassAnalyzer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +73 -0
- package/dist/cli.js.map +1 -0
- package/dist/decompiler/DecompilerService.d.ts +35 -0
- package/dist/decompiler/DecompilerService.d.ts.map +1 -0
- package/dist/decompiler/DecompilerService.js +238 -0
- package/dist/decompiler/DecompilerService.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/dist/scanner/DependencyScanner.d.ts +52 -0
- package/dist/scanner/DependencyScanner.d.ts.map +1 -0
- package/dist/scanner/DependencyScanner.js +235 -0
- package/dist/scanner/DependencyScanner.js.map +1 -0
- package/lib/cfr-0.152.jar +0 -0
- package/package.json +85 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { parseString } from 'xml2js';
|
|
6
|
+
import * as yauzl from 'yauzl';
|
|
7
|
+
const execAsync = promisify(exec);
|
|
8
|
+
const parseXmlAsync = promisify(parseString);
|
|
9
|
+
export class DependencyScanner {
|
|
10
|
+
indexCache = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Scan all dependencies of a Maven project and build mapping index from class names to JAR packages
|
|
13
|
+
*/
|
|
14
|
+
async scanProject(projectPath, forceRefresh = false) {
|
|
15
|
+
const indexPath = path.join(projectPath, '.mcp-class-index.json');
|
|
16
|
+
const isDebug = process.env.NODE_ENV === 'development';
|
|
17
|
+
// If force refresh, delete old index file first
|
|
18
|
+
if (forceRefresh && await fs.pathExists(indexPath)) {
|
|
19
|
+
if (isDebug) {
|
|
20
|
+
console.error('Force refresh: deleting old index file');
|
|
21
|
+
}
|
|
22
|
+
await fs.remove(indexPath);
|
|
23
|
+
}
|
|
24
|
+
// Check cache
|
|
25
|
+
if (!forceRefresh && await fs.pathExists(indexPath)) {
|
|
26
|
+
if (isDebug) {
|
|
27
|
+
console.error('Using cached class index');
|
|
28
|
+
}
|
|
29
|
+
const cachedIndex = await fs.readJson(indexPath);
|
|
30
|
+
return {
|
|
31
|
+
jarCount: cachedIndex.jarCount,
|
|
32
|
+
classCount: cachedIndex.classCount,
|
|
33
|
+
indexPath,
|
|
34
|
+
sampleEntries: cachedIndex.sampleEntries
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (isDebug) {
|
|
38
|
+
console.error('Starting Maven dependency scan...');
|
|
39
|
+
}
|
|
40
|
+
// 1. Get Maven dependency tree
|
|
41
|
+
const dependencies = await this.getMavenDependencies(projectPath);
|
|
42
|
+
console.error(`Found ${dependencies.length} dependency JARs`);
|
|
43
|
+
// 2. Parse each JAR package and build class index
|
|
44
|
+
const classIndex = [];
|
|
45
|
+
let processedJars = 0;
|
|
46
|
+
for (const jarPath of dependencies) {
|
|
47
|
+
try {
|
|
48
|
+
const classes = await this.extractClassesFromJar(jarPath);
|
|
49
|
+
classIndex.push(...classes);
|
|
50
|
+
processedJars++;
|
|
51
|
+
if (processedJars % 10 === 0) {
|
|
52
|
+
console.error(`Processed ${processedJars}/${dependencies.length} JARs`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.warn(`Failed to process JAR: ${jarPath}, error: ${error}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// 3. Save index to file
|
|
60
|
+
const result = {
|
|
61
|
+
jarCount: processedJars,
|
|
62
|
+
classCount: classIndex.length,
|
|
63
|
+
indexPath,
|
|
64
|
+
sampleEntries: classIndex.slice(0, 10).map(entry => `${entry.className} -> ${path.basename(entry.jarPath)}`)
|
|
65
|
+
};
|
|
66
|
+
await fs.outputJson(indexPath, {
|
|
67
|
+
...result,
|
|
68
|
+
classIndex,
|
|
69
|
+
lastUpdated: new Date().toISOString()
|
|
70
|
+
}, { spaces: 2 });
|
|
71
|
+
console.error(`Scan complete! Processed ${processedJars} JARs, indexed ${classIndex.length} classes`);
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get all JAR package paths from Maven dependency tree
|
|
76
|
+
*/
|
|
77
|
+
async getMavenDependencies(projectPath) {
|
|
78
|
+
try {
|
|
79
|
+
// Build Maven command path
|
|
80
|
+
const mavenCmd = this.getMavenCommand();
|
|
81
|
+
// Execute mvn dependency:tree command
|
|
82
|
+
const { stdout } = await execAsync(`${mavenCmd} dependency:tree -DoutputType=text`, {
|
|
83
|
+
cwd: projectPath,
|
|
84
|
+
timeout: 60000 // 60 second timeout
|
|
85
|
+
});
|
|
86
|
+
// Parse output, extract JAR package paths
|
|
87
|
+
const jarPaths = new Set();
|
|
88
|
+
const lines = stdout.split('\n');
|
|
89
|
+
for (const line of lines) {
|
|
90
|
+
// Match lines like: [INFO] +- com.example:my-lib:jar:1.0.0:compile
|
|
91
|
+
const match = line.match(/\[INFO\].*?([a-zA-Z0-9._-]+:[a-zA-Z0-9._-]+:[a-zA-Z0-9._-]+:[a-zA-Z0-9._-]+:[a-zA-Z0-9._-]+)/);
|
|
92
|
+
if (match) {
|
|
93
|
+
const dependency = match[1];
|
|
94
|
+
// Build JAR package path
|
|
95
|
+
const jarPath = await this.resolveJarPath(dependency, projectPath);
|
|
96
|
+
if (jarPath && await fs.pathExists(jarPath)) {
|
|
97
|
+
jarPaths.add(jarPath);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return Array.from(jarPaths);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error('Failed to get Maven dependencies:', error);
|
|
105
|
+
// If Maven command fails, try scanning from local repository
|
|
106
|
+
return await this.scanLocalMavenRepo(projectPath);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Scan JAR packages from local Maven repository
|
|
111
|
+
*/
|
|
112
|
+
async scanLocalMavenRepo(projectPath) {
|
|
113
|
+
const mavenRepoPath = this.getMavenRepositoryPath();
|
|
114
|
+
if (!await fs.pathExists(mavenRepoPath)) {
|
|
115
|
+
throw new Error('Maven local repository does not exist');
|
|
116
|
+
}
|
|
117
|
+
const jarFiles = [];
|
|
118
|
+
const scanDir = async (dir) => {
|
|
119
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
120
|
+
for (const entry of entries) {
|
|
121
|
+
const fullPath = path.join(dir, entry.name);
|
|
122
|
+
if (entry.isDirectory()) {
|
|
123
|
+
await scanDir(fullPath);
|
|
124
|
+
}
|
|
125
|
+
else if (entry.isFile() && entry.name.endsWith('.jar')) {
|
|
126
|
+
jarFiles.push(fullPath);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
await scanDir(mavenRepoPath);
|
|
131
|
+
return jarFiles;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Resolve dependency coordinates to get JAR package path
|
|
135
|
+
*/
|
|
136
|
+
async resolveJarPath(dependency, projectPath) {
|
|
137
|
+
const [groupId, artifactId, type, version, scope] = dependency.split(':');
|
|
138
|
+
if (type !== 'jar') {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
// Use unified Maven repository path getter method
|
|
142
|
+
const mavenRepoPath = this.getMavenRepositoryPath();
|
|
143
|
+
const groupPath = groupId.replace(/\./g, '/');
|
|
144
|
+
const jarPath = path.join(mavenRepoPath, groupPath, artifactId, version, `${artifactId}-${version}.jar`);
|
|
145
|
+
return jarPath;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Extract all class file information from JAR package
|
|
149
|
+
*/
|
|
150
|
+
async extractClassesFromJar(jarPath) {
|
|
151
|
+
return new Promise((resolve, reject) => {
|
|
152
|
+
const classes = [];
|
|
153
|
+
yauzl.open(jarPath, { lazyEntries: true }, (err, zipfile) => {
|
|
154
|
+
if (err) {
|
|
155
|
+
reject(err);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
zipfile.readEntry();
|
|
159
|
+
zipfile.on('entry', (entry) => {
|
|
160
|
+
if (entry.fileName.endsWith('.class') && !entry.fileName.includes('$')) {
|
|
161
|
+
const className = entry.fileName
|
|
162
|
+
.replace(/\.class$/, '')
|
|
163
|
+
.replace(/\//g, '.');
|
|
164
|
+
const lastDotIndex = className.lastIndexOf('.');
|
|
165
|
+
const packageName = lastDotIndex > 0 ? className.substring(0, lastDotIndex) : '';
|
|
166
|
+
const simpleName = lastDotIndex > 0 ? className.substring(lastDotIndex + 1) : className;
|
|
167
|
+
classes.push({
|
|
168
|
+
className,
|
|
169
|
+
jarPath,
|
|
170
|
+
packageName,
|
|
171
|
+
simpleName
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
zipfile.readEntry();
|
|
175
|
+
});
|
|
176
|
+
zipfile.on('end', () => {
|
|
177
|
+
resolve(classes);
|
|
178
|
+
});
|
|
179
|
+
zipfile.on('error', (err) => {
|
|
180
|
+
reject(err);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Find corresponding JAR package path by class name
|
|
187
|
+
*/
|
|
188
|
+
async findJarForClass(className, projectPath) {
|
|
189
|
+
const indexPath = path.join(projectPath, '.mcp-class-index.json');
|
|
190
|
+
if (!await fs.pathExists(indexPath)) {
|
|
191
|
+
throw new Error('Class index does not exist, please run dependency scan first');
|
|
192
|
+
}
|
|
193
|
+
const indexData = await fs.readJson(indexPath);
|
|
194
|
+
const classIndex = indexData.classIndex;
|
|
195
|
+
const entry = classIndex.find(entry => entry.className === className);
|
|
196
|
+
return entry ? entry.jarPath : null;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get all indexed class names
|
|
200
|
+
*/
|
|
201
|
+
async getAllClassNames(projectPath) {
|
|
202
|
+
const indexPath = path.join(projectPath, '.mcp-class-index.json');
|
|
203
|
+
if (!await fs.pathExists(indexPath)) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
const indexData = await fs.readJson(indexPath);
|
|
207
|
+
const classIndex = indexData.classIndex;
|
|
208
|
+
return classIndex.map(entry => entry.className);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get Maven command path
|
|
212
|
+
*/
|
|
213
|
+
getMavenCommand() {
|
|
214
|
+
const mavenHome = process.env.MAVEN_HOME;
|
|
215
|
+
if (mavenHome) {
|
|
216
|
+
const mavenCmd = process.platform === 'win32' ? 'mvn.cmd' : 'mvn';
|
|
217
|
+
return path.join(mavenHome, 'bin', mavenCmd);
|
|
218
|
+
}
|
|
219
|
+
return 'mvn'; // Fallback to mvn in PATH
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get Maven local repository path
|
|
223
|
+
*/
|
|
224
|
+
getMavenRepositoryPath() {
|
|
225
|
+
// 1. Prioritize repository path specified by MAVEN_REPO environment variable
|
|
226
|
+
const mavenRepo = process.env.MAVEN_REPO;
|
|
227
|
+
if (mavenRepo) {
|
|
228
|
+
return mavenRepo;
|
|
229
|
+
}
|
|
230
|
+
// 2. Use default Maven local repository path
|
|
231
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE;
|
|
232
|
+
return path.join(homeDir, '.m2', 'repository');
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=DependencyScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencyScanner.js","sourceRoot":"","sources":["../../src/scanner/DependencyScanner.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "jarp-mcp",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "MCP server that gives AI agents instant access to decompiled Java code from Maven/Gradle dependencies. Blazing fast Java class analysis for Claude, Cursor, and other LLM-powered IDEs.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"jarp-mcp": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/**/*",
|
|
12
|
+
"lib/**/*",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"dev": "tsx src/index.ts",
|
|
20
|
+
"test": "jest",
|
|
21
|
+
"prepublishOnly": "npm run build",
|
|
22
|
+
"prepack": "npm run build",
|
|
23
|
+
"publish:npm": "npm publish",
|
|
24
|
+
"publish:beta": "npm publish --tag beta",
|
|
25
|
+
"version:patch": "npm version patch",
|
|
26
|
+
"version:minor": "npm version minor",
|
|
27
|
+
"version:major": "npm version major"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"mcp",
|
|
31
|
+
"model-context-protocol",
|
|
32
|
+
"java",
|
|
33
|
+
"decompiler",
|
|
34
|
+
"decompilation",
|
|
35
|
+
"java-decompiler",
|
|
36
|
+
"maven",
|
|
37
|
+
"gradle",
|
|
38
|
+
"claude",
|
|
39
|
+
"cursor",
|
|
40
|
+
"ai",
|
|
41
|
+
"llm",
|
|
42
|
+
"jarp",
|
|
43
|
+
"spring",
|
|
44
|
+
"spring-boot",
|
|
45
|
+
"jar",
|
|
46
|
+
"bytecode",
|
|
47
|
+
"reverse-engineering",
|
|
48
|
+
"class-analyzer",
|
|
49
|
+
"dependency-analysis",
|
|
50
|
+
"intellij",
|
|
51
|
+
"vscode",
|
|
52
|
+
"ai-assistant",
|
|
53
|
+
"copilot",
|
|
54
|
+
"anthropic"
|
|
55
|
+
],
|
|
56
|
+
"author": "tersePrompts",
|
|
57
|
+
"license": "Apache-2.0",
|
|
58
|
+
"repository": {
|
|
59
|
+
"type": "git",
|
|
60
|
+
"url": "https://github.com/tersePrompts/jarp-mcp.git"
|
|
61
|
+
},
|
|
62
|
+
"homepage": "https://github.com/tersePrompts/jarp-mcp#readme",
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=16.0.0"
|
|
65
|
+
},
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
68
|
+
"commander": "^14.0.2",
|
|
69
|
+
"fs-extra": "^11.3.3",
|
|
70
|
+
"xml2js": "^0.6.2",
|
|
71
|
+
"archiver": "^7.0.1",
|
|
72
|
+
"yauzl": "^3.2.0"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@types/node": "^22.10.0",
|
|
76
|
+
"@types/fs-extra": "^11.0.4",
|
|
77
|
+
"@types/xml2js": "^0.4.14",
|
|
78
|
+
"@types/archiver": "^6.0.2",
|
|
79
|
+
"@types/yauzl": "^2.10.3",
|
|
80
|
+
"typescript": "^5.7.0",
|
|
81
|
+
"tsx": "^4.19.0",
|
|
82
|
+
"jest": "^29.7.0",
|
|
83
|
+
"@types/jest": "^29.5.13"
|
|
84
|
+
}
|
|
85
|
+
}
|