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,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
+ }