一个基于Model Context Protocol (MCP)的Java类分析服务,可以扫描Maven项目依赖、反编译Java类文件、获取class方法列表等详细信息,并提供给LLM进行代码分析。
本项目源自 handsomestWei/java-class-analyzer-mcp-server,感谢原作者的开源贡献。
🚀 核心突破与改进
- 修复 Cursor/stdio 兼容性:修复原版只支持字节跳动Trae,而在 Cursor 下 完全不可用的致命问题。
- 全版本 JDK 深度适配:补齐了原版缺失的 JDK 类扫描能力,完美支持 Java 8 (
rt.jar) 及 Java 9+ 模块化系统 (jrt://)。 - CFR 反编译引擎工程化:内置 CFR 0.152 核心,解决了原版 npm 安装后找不到反编译工具、环境变量不生效等分发难题。
- 工业级 Maven 执行器:重写了依赖扫描逻辑,支持 Windows 环境下含空格路径、
.cmd脚本,并加入超时与健壮的错误处理机制。 - 智能项目隔离缓存:重构了缓存架构,按项目根目录和包名进行强隔离,彻底解决临时文件污染工程根目录的问题。
- 企业级分发优化:适配内网 npm/npx 分发模式,并针对 AI Agent 优化了 Tool Definitions,使其能更精准地自动按需触发。
Cursor等AI工具直接生成调用二方(内部调用)、三方包(外部调用)接口的代码,但因AI无法读取未在当前工程中打开的依赖源码,导致生成的代码错误频出,甚至出现幻觉式编码。
为解决此问题,一般会直接拷贝源码内容喂给LLM;或者先将源码文件放到当前工程内,再在对话中引用。
而使用本地反编译MCP方案最有效,能精准解析jar包中的类与方法,显著提升代码生成的准确性和可用性。
- 🚀 使用方便:mcp服务基于TypeScript实现,使用npm打包,方便分发和安装,弱环境依赖。
- 🔍 依赖扫描: 自动扫描Maven项目的所有依赖JAR包
- 📦 类索引: 建立类全名到JAR包路径的映射索引
- 🔄 反编译: 使用CFR工具(已内置有)实时反编译.class文件为Java源码
- 📊 类分析: 分析Java类的结构、方法、字段、继承关系等
- 💾 智能缓存: 按包名结构缓存反编译结果,支持缓存控制
- 🚀 自动索引: 执行分析前自动检查并创建索引
- ⚙️ 灵活配置: 支持外部指定CFR工具路径
- 🤖 LLM集成: 通过MCP协议为LLM提供Java代码分析能力
推荐方式:直接在 MCP 客户端配置文件中添加以下配置:
{
"mcpServers": {
"java-class-analyzer": {
"command": "npx",
"args": [
"-y",
"@yifei/java-class-analyzer-mcp-server@latest",
"start",
"--stdio"
],
"env": {
"npm_config_registry": "http://admin.npm.oppoer.me",
"NODE_ENV": "production"
}
}
}
}可选方式:
- 全局安装:
npm install -g @yifei/java-class-analyzer-mcp-server
- 本地安装:
npm install @yifei/java-class-analyzer-mcp-server
在配置的 env 中可以添加以下可选环境变量:
MAVEN_REPO: Maven 本地仓库路径(默认:~/.m2/repository)JAVA_HOME: Java 安装路径(默认:使用 PATH 中的 java)CFR_PATH: CFR 反编译工具路径(默认:使用内置版本)
示例(添加可选环境变量):
{
"mcpServers": {
"java-class-analyzer": {
"command": "npx",
"args": [
"-y",
"@yifei/java-class-analyzer-mcp-server@latest",
"start"
],
"env": {
"npm_config_registry": "http://admin.npm.oppoer.me",
"NODE_ENV": "production",
"MAVEN_REPO": "D:/maven/repository",
"JAVA_HOME": "C:/Program Files/Java/jdk-11"
}
}
}
}如果需要使用 SSE 方式(需要手动启动服务器):
- 手动启动服务器:
java-class-analyzer-mcp start --sse --port 6666- 在客户端配置中使用 URL:
{
"mcpServers": {
"java-class-analyzer": {
"url": "http://localhost:6666/sse",
"env": {
"npm_config_registry": "http://admin.npm.oppoer.me",
"NODE_ENV": "production"
}
}
}
}为了让Cursor Agent在识别到三方依赖时自动使用MCP工具(无需手动指定),请按以下步骤配置:
-
确保MCP服务器已正确配置(参考上面的配置说明)
-
创建
.cursorrules文件(项目根目录): 项目已包含.cursorrules文件,其中定义了自动使用MCP工具的规则。Cursor Agent会根据这些规则自动识别需要使用MCP的场景。 -
工具描述已优化: MCP工具的描述已优化,明确说明了何时应该自动使用这些工具,AI会更容易识别触发场景。
-
自动触发场景:
- 代码中出现
import三方包时 - 生成调用三方库API的代码时
- 需要了解三方类的结构、方法签名时
- 错误排查涉及三方依赖时
- 代码中出现
扫描Maven项目的所有依赖,建立类名到JAR包的映射索引。当需要分析三方依赖类时,应先执行此工具建立索引。
参数:
projectPath(string): Maven项目根目录路径forceRefresh(boolean, 可选): 是否强制刷新索引,默认false
示例:
{
"name": "scan_dependencies",
"arguments": {
"projectPath": "/path/to/your/maven/project",
"forceRefresh": false
}
}反编译指定的Java类文件,返回Java源码。当代码中使用了三方依赖类(如import语句、类引用),或需要查看三方类的实现细节、方法签名时,Cursor Agent应自动使用此工具,获取准确的类信息,避免生成错误的代码。
参数:
className(string): 要反编译的Java类全名,如:com.example.QueryBizOrderDOprojectPath(string): Maven项目根目录路径useCache(boolean, 可选): 是否使用缓存,默认true。避免每次都重复生成。cfrPath(string, 可选): CFR反编译工具的jar包路径。已内置有,可以额外指定版本。
示例:
{
"name": "decompile_class",
"arguments": {
"className": "com.example.QueryBizOrderDO",
"projectPath": "/path/to/your/maven/project",
"useCache": true,
"cfrPath": "/path/to/cfr-0.152.jar"
}
}分析Java类的结构、方法、字段等信息。当需要了解三方依赖类的API(方法名、参数类型、返回类型、字段定义)时,Cursor Agent应自动使用此工具。特别适用于生成调用三方库代码的场景,确保方法签名和参数类型完全正确。
参数:
className(string): 要分析的Java类全名projectPath(string): Maven项目根目录路径
示例:
{
"name": "analyze_class",
"arguments": {
"className": "com.example.QueryBizOrderDO",
"projectPath": "/path/to/your/maven/project",
}
}在当前工程,会生成以下缓存目录和文件。
.mcp-class-index.json: 类索引缓存文件.mcp-decompile-cache/: 反编译结果缓存目录(按包名结构).mcp-class-temp/: 临时文件目录(按包名结构)
- 自动索引: 首次调用
analyze_class或decompile_class时,自动检查并创建索引 - 智能缓存: 反编译结果按包名结构缓存,支持缓存控制
- 分析类: 使用
analyze_class或decompile_class获取类的详细信息 - LLM分析: 将反编译的源码提供给LLM进行代码分析
- DependencyScanner: 负责扫描Maven依赖和建立类索引
- DecompilerService: 负责反编译.class文件
- JavaClassAnalyzer: 负责分析Java类结构
- MCP Server: 提供标准化的MCP接口
- 执行
mvn dependency:tree获取依赖树 - 解析每个JAR包,提取所有.class文件
- 建立"类全名 -> JAR包路径"的映射索引
- 缓存索引到
.mcp-class-index.json文件
- 根据类名查找对应的JAR包路径
- 检查缓存,如果存在且启用缓存则直接返回
- 从JAR包中提取.class文件到
.mcp-class-temp目录(按包名结构) - 使用CFR工具反编译.class文件
- 保存反编译结果到缓存
.mcp-decompile-cache目录(按包名结构) - 返回Java源码
-
Maven命令失败
- 确保Maven已安装并在PATH中
- 检查项目是否有有效的pom.xml文件
-
CFR反编译失败
- 确保CFR jar包已下载(支持任意版本号)
- 检查Java环境是否正确配置
- 可通过
cfrPath参数指定CFR路径
-
类未找到
- 程序会自动检查并创建索引
- 检查类名是否正确
- 确保项目依赖已正确解析
npm install
npm run build项目提供了独立的测试工具,可以直接测试MCP服务的各个功能,无需通过MCP客户端。
# 测试所有工具
node test-tools.js
# 测试特定工具
node test-tools.js --tool decompile_class --class com.alibaba.excel.EasyExcelFactory --project /path/to/project
# 不使用缓存
node test-tools.js --tool decompile_class --no-cache
# 指定CFR路径
node test-tools.js --tool decompile_class --cfr-path /path/to/cfr.jar-t, --tool <工具名>: 指定要测试的工具 (scan|decompile|analyze|all)-p, --project <路径>: 项目路径-c, --class <类名>: 要分析的类名--no-refresh: 不强制刷新依赖索引--no-cache: 不使用反编译缓存--cfr-path <路径>: 指定CFR反编译工具的jar包路径-h, --help: 显示帮助信息
通过 NODE_ENV 环境变量控制日志输出:
development: 输出详细调试信息production: 只输出关键信息
-
JDK类支持:完整支持Java标准库类的扫描和反编译
- 支持Java 8及之前的
rt.jar扫描 - 支持Java 9+模块化JDK(
jrt://文件系统)的类扫描 - 自动检测JDK版本并使用相应的扫描策略
- 使用Java命令访问
jrt://文件系统,支持所有JDK模块类
- 支持Java 8及之前的
-
内置CFR工具:内置CFR 0.152版本jar包(
lib/cfr-0.152.jar)- 无需单独下载CFR工具即可使用
- 优先检查
CFR_PATH环境变量 - 改进CFR查找路径,支持npm包安装后的路径结构
- 仍支持通过
CFR_PATH环境变量指定自定义CFR路径
-
Maven命令执行优化:
- 使用
spawn替代exec,正确处理包含空格的路径 - Windows平台特殊处理:支持
.cmd文件和包含空格的路径 - 改进错误处理和超时机制(60秒超时)
- 更好的跨平台兼容性
- 使用
-
JAR包解析增强:
- 处理JAR包中的绝对路径条目(跳过以
/开头的无效条目) - 支持
.jmod文件格式(Java模块文件,处理classes/目录结构) - 改进错误处理:单个条目处理失败不中断整个流程
- 处理
absolute path错误,避免因无效条目导致解析失败 - 跳过内部类(包含
$符号的类文件)
- 处理JAR包中的绝对路径条目(跳过以
-
缓存路径优化:
- 使用项目路径作为缓存根目录,而不是
process.cwd() - 统一管理临时文件目录(
.mcp-class-temp) - 临时Java文件统一放在项目缓存目录下,避免污染根目录
- 改进缓存路径结构,按包名组织
- 使用项目路径作为缓存根目录,而不是
-
工具描述优化:优化MCP工具的描述文本,使AI更容易自动识别和使用
scan_dependencies: 明确说明在缺类/引入三方或JDK类时自动调用decompile_class: 明确说明在需查看依赖或JDK类实现时自动调用analyze_class: 明确说明在需生成调用代码或确认签名时自动调用
-
错误处理改进:
- 更详细的错误信息和警告提示
- 索引文件验证:检查索引文件是否存在且有效
- 工具调用异常处理:提供友好的错误提示和建议
- stdio模式下完全静默,避免干扰MCP协议通信
-
版本管理:从package.json动态读取版本号,确保版本一致性
-
修复Maven命令执行问题:
- 修复Windows平台路径包含空格时命令执行失败的问题
- 修复
.cmd文件无法执行的问题 - 修复超时处理不生效的问题
-
修复JAR包解析问题:
- 修复JAR包包含绝对路径条目导致解析失败的问题
- 修复
.jmod文件无法解析的问题 - 修复单个条目处理失败导致整个JAR解析失败的问题
- 修复内部类被错误包含的问题
-
修复JDK类扫描问题:
- 修复Java 9+模块化JDK无法扫描的问题
- 修复JDK类无法反编译的问题
- 修复
jrt://文件系统访问问题
-
修复CFR工具查找问题:
- 修复npm包安装后CFR工具找不到的问题
- 修复CFR_PATH环境变量不生效的问题
- 改进CFR查找路径优先级
-
修复缓存路径问题:
- 修复缓存文件保存到错误位置的问题
- 修复临时文件污染根目录的问题
-
修复其他问题:
- 修复索引文件为空时的处理问题
- 修复类查找超时无提示的问题
- 修复错误信息不够详细的问题
archiver:^6.0.1→^7.0.1jest:^29.7.0→^30.2.0@types/jest:^29.5.8→^30.0.0- 新增
overrides配置:强制使用glob ^10.0.0
- 添加"让Cursor Agent自动使用MCP工具"章节
- 完善工具使用说明,强调自动触发场景
- 添加致谢章节
- 更新配置示例,说明默认使用SSE模式
- 新增:
.cursorignore- Cursor忽略文件配置 - 新增:
lib/cfr-0.152.jar- 内置CFR工具 - 删除:
mcp-server-config.json- 配置文件模板(改为通过CLI命令生成) - 修改:
src/index.ts- 改进错误处理、工具描述优化 - 修改:
src/cli.ts- 版本号动态读取、改进配置生成 - 修改:
src/scanner/DependencyScanner.ts- JDK类支持、Maven命令优化、JAR解析增强 - 修改:
src/decompiler/DecompilerService.ts- JDK模块类反编译、CFR查找优化、缓存路径优化 - 修改:
package.json- 更新版本号和依赖 - 修改:
.gitignore- 更新忽略规则

