关于 Maven Decoder
Maven Decoder MCP 是一个 MCP 服务,让 AI Agent 直接读取 Maven 依赖的真实源码。它从 ~/.m2 或 Maven Central 反编译 jar,并比较版本间的 API 变化,适合需要核实库接口的开发者。
主要功能
- 01反编译 ~/.m2 或 Maven Central 中的 jar
- 02比较两个版本的公开 API 差异与破坏性变更
- 03无源码 jar 时通过 javap 解析类信息
- 04支持 Maven Central 搜索与按需下载
- 05支持企业 Nexus 或 Artifactory 镜像及离线模式
适用场景
- 01升级依赖版本前核查哪些 API 发生变化
- 02在没有源码 jar 的内部构件中查看类结构
- 03让 Agent 根据实际源码而非记忆回答库用法问题
MCP 相关
该项目是 MCP 服务,向 MCP 客户端暴露本地分析、在线搜索和下载等工具,例如 compare_versions 与 extract_class_info。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y maven-decoder-mcpMAVEN_REPOSITORYPath to the local Maven repository. Defaults to ~/.m2/repository.MAVEN_REMOTE_REPOSComma or whitespace separated list of remote Maven repository base URLs.MAVEN_REMOTE_USERNAMEUsername for authenticating against private remote Maven repositories.MAVEN_REMOTE_PASSWORD密钥Password or token for authenticating against private remote Maven repositories.MAVEN_OFFLINESet to true to disable all network access and use only the local repository.MAVEN_AUTO_DOWNLOADWhether to automatically download missing artifacts from remote repositories. Defaults to true.MAVEN_DECODER_CACHE_DIROverride directory used for decompilation and metadata caches.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Maven Decoder MCP Server
你的 Agent 会猜测自己从未读过的库 API。本工具让它读到真实内容。
让 AI Agent 读取任意 Maven 依赖的实际源代码——反编译 ~/.m2 或 Maven Central 中的 jar,并比较不同版本,找出破坏性变更。

向 Agent 提问 “我正要将 org.jsoup:jsoup 从 1.17.2 升级到 1.23.2——会有哪些问题?” 如果没有读取 jar 的方法,它只能凭记忆作答。借助此 MCP 服务,compare_versions 会读取两个 jar,并报告实际发生的变化:
| 1.17.2 → 1.23.2 | |
|---|---|
| 破坏性变更 | 45 |
| 已移除的成员 | 31 |
| 已添加的成员 | 150 |
| API 发生变化的类 | 比较了 115 个类中的 47 个 |
成员会按声明位置进行比较,因此,即使某个成员移到了超类型中、仍然可能可以调用,也会被报告为已移除。工具会在输出中说明这一点。
它也适用于没有 sources jar 的构件:extract_class_info 会回退到 javap,并返回解析后的字段、方法和字节码版本——公司 Nexus 中的内部构件正是这种情况。
一条命令即可试用
npx skills add https://github.com/salitaba/maven-decoder-mcp --skill maven-code-search
这会安装 maven-code-search Agent 技能,告诉你的 Agent 何时使用这些工具。如需直接配置 MCP 服务,请参阅安装。
🚀 功能
核心功能
- Jar 文件分析:深入检查 jar 文件,包括元数据、清单和结构
- 依赖解析:完整分析依赖树,包括传递依赖
- 源代码提取:从源代码 jar 中提取源代码,或反编译字节码
- 类信息:详细的类签名、方法、字段和注解
- 搜索功能:在所有构件中查找类、方法和依赖项
- 版本管理:比较版本、查找依赖方并跟踪版本冲突
在线 Maven 支持
- Maven Central 搜索:查找本地未安装的构件和类
- 远程版本列表:查看所有已发布版本,而不只是本地已有版本
- 按需下载:将任意构件(jar、sources、POM)下载到本地缓存
- 透明回退:所有分析工具都会自动下载缺失的构件,因此无需安装即可反编译依赖
- 支持镜像:可连接到公司 Nexus/Artifactory,并可选配置凭据
- 离线模式:只需一个环境变量,即可恢复为完全本地、无需联网的行为
高级功能
- 反编译支持:集成支持多种 Java 反编译器(CFR、Fernflower、Procyon)
- 冲突分析:检测并分析依赖版本冲突
- 仓库导航:浏览和探索本地 Maven 仓库结构
- 元数据解析:提取并解析 Maven POM 文件和元数据
- 服务发现:查找并分析 Java 服务和 SPI 实现
- 响应管理:针对大型响应进行智能分页和摘要
- 方法提取:从大型 Java 类中提取指定方法
- 完整性检查:下载内容会根据仓库的 SHA-1 校验和进行验证
📦 安装
前置条件
- Java 8+(用于反编译功能)
- Maven 本地仓库(
~/.m2/repository) - 以下工具之一:Python 3.8+、Node.js 14+ 或 Docker
🚀 快速安装
一行安装(推荐)
curl -fsSL https://raw.githubusercontent.com/salitaba/maven-decoder-mcp/main/install.sh | bash
📋 安装方式
方式 1:uvx(推荐)
# Install uv (if not installed)
curl -Ls https://astral.sh/uv/install.sh | sh
# Ensure your shell PATH is updated (restart shell or eval as printed by installer)
# Run the server via uvx (isolated, fast, no venv needed)
uvx maven-decoder-mcp
# Optional: pick a specific Python
# uvx --python 3.12 maven-decoder-mcp
方式 2:Node.js/npm
# Install globally
npm install -g maven-decoder-mcp
# Or install locally
npm install maven-decoder-mcp
# Run the server
maven-decoder-mcp
# or if installed locally: npx maven-decoder-mcp
方式 3:Docker
# Pull and run
docker run --rm -it \
-v ~/.m2:/home/mcpuser/.m2 \
-v $(pwd):/workspace \
ali79taba/maven-decoder-mcp:latest
方式 4:从源代码安装(开发)
# Clone repository
git clone https://github.com/salitaba/maven-decoder-mcp.git
cd maven-decoder-mcp
# Option A: Using Virtual Environment
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -r requirements.txt
pip install "git+https://github.com/modelcontextprotocol/python-sdk.git"
./setup_decompilers.sh
# Option B: System-wide Installation (not recommended)
./setup_decompilers.sh
Windows
检出源代码时,请使用 Python 3.10 或更高版本,并确保 JDK 位于 PATH 中。在仓库根目录下,通过 PowerShell 创建并激活虚拟环境:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -e ".[dev]"
# Point to your existing local Maven repository (drive-letter paths are supported)
$env:MAVEN_REPOSITORY = 'F:\data\repository'
maven-decoder-mcp
在命令提示符(cmd.exe)中,使用 .venv\Scripts\activate.bat 激活,并改用 set "MAVEN_REPOSITORY=F:\data\repository" 设置仓库。这些环境设置适用于从该终端启动的程序;如果 MCP 客户端会单独启动服务,请在 MCP 客户端的环境中设置这些变量。
远程下载使用单独的缓存,按以下顺序确定缓存位置(跳过空值):
MAVEN_DECODER_CACHE_DIR:完整的缓存目录;不会追加子目录。XDG_CACHE_HOME:追加maven-decoder-mcp\repository。LOCALAPPDATA:追加maven-decoder-mcp\repository。- 否则,在主目录下使用
~/.cache/maven-decoder-mcp/repository。
在 Windows 上,这通常对应 %LOCALAPPDATA%\maven-decoder-mcp\repository;如果设置了 XDG_CACHE_HOME,则优先使用它。缓存采用 Maven 的目录布局,但与实际本地仓库分开,因此下载不会干扰 Maven 构建。设置 MAVEN_REPOSITORY 不会改变缓存位置。
🔧 配置
用于 Cursor IDE
添加到 ~/.cursor/mcp_servers.json:
{
"maven-decoder": {
"command": "uvx",
"args": ["maven-decoder-mcp"]
}
}
用于其他 MCP 客户端
该服务作为标准 MCP 服务运行,可与任何兼容 MCP 的客户端集成。
🧠 AI Agent 技能
此仓库包含一项 maven-code-search Agent 技能,说明 AI 编码 Agent 何时以及如何使用此 MCP 搜索已安装的 Maven 包代码。
npx skills add https://github.com/salitaba/maven-decoder-mcp --skill maven-code-search
该技能位于 skills/maven-code-search,仓库推送后即可供 skills.sh 编入索引。
🛠️ 可用工具
本地分析
| 工具 | 描述 |
|---|---|
list_artifacts | 列出 Maven 仓库中的构件,支持筛选 |
analyze_jar | 分析 jar 文件的结构和内容 |
extract_class_info | 获取 Java 类的详细信息 |
get_dependencies | 从 POM 文件中获取 Maven 依赖项 |
search_classes | 搜索所有 jar 中的类,可按注解筛选 |
extract_source_code | 反编译并提取 Java 源代码 |
extract_jar_resource | 提取文本资源,例如 .proto 文件、服务和元数据 |
compare_versions | 比较两个版本,包括公开 API 差异和破坏性变更 |
find_usage_examples | 查找引用给定类或方法的类 |
get_dependency_tree | 获取完整的依赖树 |
find_dependents | 查找依赖特定构件的构件 |
get_version_info | 获取构件的已安装版本(将 include_remote 设为 true 可添加已发布的版本) |
analyze_jar_structure | 分析 jar 的整体结构和元数据 |
extract_method_info | 提取 Java 类中特定方法的信息 |
在线(Maven Central)
| 工具 | 描述 |
|---|---|
search_maven_central | 按名称、坐标或包含的类搜索 Maven Central 中的构件 |
get_remote_versions | 列出远程发布的所有版本,并标记已安装的版本 |
download_artifact | 将构件(jar/源代码/POM)下载到本地缓存;支持 latest |
工具参数
| 工具 | 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|---|
list_artifacts | group_id | string | — | 按 group ID 筛选(例如,'org.springframework') |
list_artifacts | artifact_id | string | — | 按 artifact ID 筛选(例如,'spring-core') |
list_artifacts | version | string | — | 按版本筛选(例如,'5.3.21') |
list_artifacts | sort_by | string | name | 排序方式:'name'(按 group/artifact/version 升序,默认)、'size'(较大的 jar 排在前面)或 'modified'(最近修改的排在前面)。未知值将回退为 'name'。 |
list_artifacts | limit | integer | 50 | 要返回的 artifact 最大数量 |
list_artifacts | page | integer | 1 | 分页页码 |
list_artifacts | items_per_page | integer | 20 | 每页项目数 |
analyze_jar | group_id* | string | — | Maven group ID |
analyze_jar | artifact_id* | string | — | Maven artifact ID |
analyze_jar | version* | string | — | Maven 版本 |
analyze_jar | include_bytecode | boolean | False | 包含字节码分析 |
analyze_jar | include_manifest | boolean | True | 包含 JAR 清单 |
analyze_jar | summarize_large_content | boolean | True | 自动总结大型内容 |
extract_class_info | group_id* | string | — | Maven group ID |
extract_class_info | artifact_id* | string | — | Maven artifact ID |
extract_class_info | version* | string | — | Maven 版本 |
extract_class_info | class_pattern | string | — | 匹配类名的模式(支持正则表达式) |
extract_class_info | include_methods | boolean | True | 包含方法签名 |
extract_class_info | include_fields | boolean | True | 包含字段信息 |
extract_class_info | include_bytecode | boolean | False | 包含匹配类的详细 javap 字节码输出 |
extract_class_info | page | integer | 1 | 分页页码 |
extract_class_info | items_per_page | integer | 20 | 每页项目数 |
extract_class_info | summarize_large_content | boolean | True | 自动总结大型内容 |
get_dependencies | group_id* | string | — | Maven group ID |
get_dependencies | artifact_id* | string | — | Maven artifact ID |
get_dependencies | version* | string | — | Maven 版本 |
get_dependencies | include_transitive | boolean | False | 包含传递依赖 |
get_dependencies | page | integer | 1 | 分页页码 |
get_dependencies | items_per_page | integer | 20 | 每页项目数 |
search_classes | class_name | string | — | 要搜索的类名(支持通配符) |
search_classes | package_pattern | string | — | 用于筛选的包模式 |
search_classes | annotation | string | — | 搜索带有特定注解的类 |
search_classes | case_sensitive | boolean | True | 区分大小写匹配 class_name 和 package_pattern。设为 false 可进行不区分大小写的搜索(例如,'arraylist' 可匹配 'ArrayList')。 |
search_classes | limit | integer | 100 | 要返回的结果最大数量 |
search_classes | page | integer | 1 | 分页页码 |
search_classes | items_per_page | integer | 20 | 每页项目数 |
extract_source_code | group_id* | string | — | Maven group ID |
extract_source_code | artifact_id* | string | — | Maven artifact ID |
extract_source_code | version* | string | — | Maven 版本 |
extract_source_code | class_name* | string | — | 完全限定类名 |
extract_source_code | prefer_sources | boolean | True | 优先使用源码 jar,而非反编译 |
extract_source_code | summarize_large_content | boolean | True | 自动总结大型内容 |
extract_source_code | max_lines | integer | 500 | 要返回的最大行数(0 表示全部) |
extract_jar_resource | group_id* | string | — | Maven group ID |
extract_jar_resource | artifact_id* | string | — | Maven artifact ID |
extract_jar_resource | version* | string | — | Maven 版本 |
extract_jar_resource | resource_path | string | — | jar 内资源的确切路径 |
extract_jar_resource | resource_pattern | string | — | 匹配资源路径的正则表达式 |
extract_jar_resource | max_bytes | integer | 65536 | 每个资源可读取的最大字节数 |
extract_jar_resource | limit | integer | 20 | 要返回的匹配资源最大数量 |
compare_versions | group_id* | string | — | Maven group ID |
compare_versions | artifact_id* | string | — | Maven artifact ID |
compare_versions | version1* | string | — | 要比较的第一个(较旧)版本 |
compare_versions | version2* | string | — | 要比较的第二个(较新)版本 |
compare_versions | compare_api | boolean | True | 比较公共 API:新增或移除的公共和受保护方法与字段,以及破坏性变更 |
compare_versions | resolve_inherited | boolean | False | 如果某个成员从类中消失,但仍在新 jar 中的某个超类型上声明,则将其重新归类到“已移至超类型”类别,而不是将其计为破坏性移除。默认值为 false(与按声明进行的差异比较结果逐字节相同)。 |
compare_versions | summarize_large_content | boolean | True | 自动总结大型内容 |
find_usage_examples | class_name* | string | — | 要查找用法示例的类名 |
find_usage_examples | method_name | string | — | 方法名 |
find_usage_examples | search_tests | boolean | True | 在测试 jar 中搜索 |
find_usage_examples | limit | integer | 50 | 要返回的结果最大数量 |
find_usage_examples | page | integer | 1 | 分页页码 |
find_usage_examples | items_per_page | integer | 20 | 每页项目数 |
get_dependency_tree | group_id* | string | — | Maven group ID |
get_dependency_tree | artifact_id* | string | — | Maven artifact ID |
get_dependency_tree | version* | string | — | Maven 版本 |
get_dependency_tree | max_depth | integer | 3 | 要显示的最大深度 |
get_dependency_tree | summarize_large_content | boolean | True | 自动总结大型内容 |
find_dependents | group_id* | string | — | 目标 group ID |
find_dependents | artifact_id* | string | — | 目标 artifact ID |
find_dependents | version | string | — | 要搜索的特定版本(可选) |
find_dependents | limit | integer | 100 | 要返回的结果最大数量 |
find_dependents | page | integer | 1 | 分页页码 |
find_dependents | items_per_page | integer | 20 | 每页项目数 |
get_version_info | group_id* | string | — | Maven group ID |
get_version_info | artifact_id* | string | — | Maven artifact ID |
get_version_info | include_remote | boolean | False | 同时列出远程仓库中发布的版本(不仅限于已安装的版本) |
get_version_info | limit | integer | 50 | 要返回的版本最大数量 |
get_version_info | page | integer | 1 | 分页页码 |
get_version_info | items_per_page | integer | 20 | 每页项目数 |
analyze_jar_structure | group_id* | string | — | Maven group ID |
analyze_jar_structure | artifact_id* | string | — | Maven artifact ID |
analyze_jar_structure | version* | string | — | Maven 版本 |
analyze_jar_structure | summarize_large_content | boolean | True | 自动总结大型内容 |
extract_method_info | group_id* | string | — | Maven group ID |
extract_method_info | artifact_id* | string | — | Maven artifact ID |
extract_method_info | version* | string | — | Maven 版本 |
extract_method_info | class_name* | string | — | 完全限定类名 |
extract_method_info | method_pattern | string | — | 匹配方法名的模式(支持正则表达式) |
extract_method_info | include_bytecode | boolean | False | 包含字节码分析 |
extract_method_info | max_methods | integer | 10 | 要返回的方法最大数量 |
search_maven_central | query | string | — | 自由文本搜索词(例如,'jackson databind') |
search_maven_central | group_id | string | — | 精确的 group ID 筛选条件(例如,'org.springframework') |
search_maven_central | artifact_id | string | — | 精确的 artifact ID 筛选条件(例如,'spring-core') |
search_maven_central | class_name | string | — | 要查找其所属 artifact 的简单类名(例如,'ObjectMapper') |
search_maven_central | fully_qualified_class | string | — | 完全限定类名(例如,'com.fasterxml.jackson.databind.ObjectMapper') |
search_maven_central | packaging | string | — | 打包类型筛选条件(例如,'jar'、'pom') |
search_maven_central | all_versions | boolean | False | 返回所有已发布版本,而非每个 artifact 仅返回最新版本 |
search_maven_central | limit | integer | 20 | 要返回的结果最大数量(最多 200) |
search_maven_central | page | integer | 1 | 分页页码 |
get_remote_versions | group_id* | string | — | Maven group ID |
get_remote_versions | artifact_id* | string | — | Maven artifact ID |
get_remote_versions | include_snapshots | boolean | True | 包含 -SNAPSHOT 版本。设为 false 仅列出正式发布的版本。 |
get_remote_versions | limit | integer | 100 | 要返回的版本最大数量 |
download_artifact | group_id* | string | — | Maven group ID |
download_artifact | artifact_id* | string | — | Maven artifact ID |
download_artifact | version* | string | — | 要下载的版本;若要下载最新发行版,则使用 'latest' |
download_artifact | include_sources | boolean | True | 如果已发布,也下载源码 jar |
download_artifact | include_javadoc | boolean | False | 如果已发布,也下载 javadoc jar |
download_artifact | classifier | string | — | 下载特定分类的 jar,而非主 jar |
download_artifact | force | boolean | False | 即使文件已缓存,也重新下载 |
* 必填 — 该参数出现在工具的 inputSchema required 数组中。没有 * 的参数为可选参数,可以省略。 |
💡 使用示例
查找依赖项
"Show me all dependencies of org.springframework:spring-core:5.3.21"
反编译类
"Decompile the class com.example.MyService from my Maven repository"
分析冲突
"Find all version conflicts in my Maven repository"
检查升级是否包含破坏性变更
"Compare org.jsoup:jsoup 1.17.2 with 1.23.2 and tell me what would break"
compare_versions 会对两个版本共有的每个类的公共和受保护成员进行差异比较,并分别报告移除项和新增项。移除的成员和类会计为破坏性变更。成员按其声明位置进行比较,因此,移至超类型的成员也会被报告为已移除,即使它仍然可以调用。
探索 API
"Show me all public methods in the Jackson ObjectMapper class"
查找实际调用方
"Find classes that call ObjectMapper.readValue, including examples from test jars"
find_usage_examples 会扫描已编译类的常量池,因此找到的是实际调用方,而不是简单的名称匹配。传入 method_name(例如 readValue)可将结果缩小到特定方法的调用方。默认包含测试 jar,并优先显示,因为其中通常有最清晰的示例;将 search_tests 设为 false 可排除它们。为确保大型仓库中的响应速度,扫描会在达到 MCP_USAGE_SCAN_LIMIT 个类后停止(默认值:200000)。
检查仅包含已编译内容的构件
"The sources jar is missing. Use extract_class_info for bytecode-backed fields and methods."
"Find and read .proto resources from com.example:protobuf-lib:1.0.0"
当依赖项没有 sources jar 时,extract_class_info 会在内部使用 javap,并返回解析后的字段、方法、字节码版本,以及可选的详细字节码输出。Agent 应通过此 MCP 使用 analyze_jar、extract_class_info、extract_source_code 和 extract_jar_resource,而不是直接运行 jar 或 javap。
处理大型响应
"List all Spring classes with pagination (page 2, 10 items per page)"
"Extract source code for a large class with summarization"
"Get method information for specific patterns in a class"
搜索 Maven Central(在线)
"Which Maven artifact contains the class HikariDataSource?"
"Search Maven Central for retrofit"
"What is the newest published version of org.apache.commons:commons-lang3?"
"Download com.google.code.gson:gson:latest and show me the JsonParser class"
🌐 在线 Maven 支持
该服务可使用本地仓库和远程仓库。在线访问默认已启用。
工作原理
- 每个工具都会先在本地仓库(
~/.m2/repository)中查找。 - 如果未找到,就会从 Maven Central 下载构件到缓存(
~/.cache/maven-decoder-mcp/repository),缓存采用标准 Maven 布局。 - 随后,所有现有分析(反编译、类信息、依赖项)都会针对缓存中的构件运行,其方式与针对已安装构件运行完全相同。
缓存有意与 ~/.m2 分开,因此下载内容绝不会干扰 Maven 或 Gradle 构建。响应中包含 origin 字段(local-repository 或 remote-cache),让你始终清楚结果的来源。
离线使用
MAVEN_OFFLINE=true # no network access at all; original local-only behavior
MAVEN_AUTO_DOWNLOAD=false # keep online search, but never auto-download
使用私有镜像
MAVEN_REMOTE_REPOS="https://nexus.corp/repository/maven-public"
MAVEN_REMOTE_USERNAME=builder
MAVEN_REMOTE_PASSWORD=secret
关于搜索索引的说明
构件下载使用 repo1.maven.org,速度快且可靠。构件搜索使用 search.maven.org,这是唯一能正确响应类级别(c: / fc:)查询的公共索引。该索引会对短时间内的大量请求进行速率限制,因此请求会采用退避策略重试;繁忙时段仍可能出现超时。下载和版本列表不受影响,因为它们会直接从仓库读取 maven-metadata.xml。
🔄 响应管理
分页支持
该服务会通过智能分页自动处理大型响应:
- 自动检测:超过 50KB 的响应会自动分页
- 可配置页面大小:每页默认包含 20 项,可按请求自定义
- 分页元数据:每个响应都包含分页信息
- 支持的工具:
list_artifacts、extract_class_info、search_classes、get_dependencies、find_dependents、get_version_info
摘要功能
大型文本内容会自动生成摘要,以提升可读性:
- 智能摘要:保留重要部分(包声明、方法签名、右花括号)
- 可配置限制:文本限制默认值为 10KB,可自定义
- 针对 Java 优化:针对 Java 源代码结构进行了优化
- 保留元数据:保留原始结构和元数据
方法提取
用于定向访问特定方法的新工具:
- 模式匹配:使用正则表达式模式查找特定方法
- 限制结果:控制返回的方法数量
- 完整上下文:包含方法签名、方法体和行号
- 高效处理:仅提取请求的方法,而非整个类
🏗️ 架构
该服务采用模块化架构:
MavenDecoderServer:MCP 服务的主要实现ResponseManager:处理分页和摘要JavaDecompiler:处理多种反编译策略MavenDependencyAnalyzer:分析 Maven 依赖和元数据MavenCentralClient:远程搜索、版本列表和构件下载- 反编译器:集成 CFR、Procyon、Fernflower 和 javap
🧪 开发
运行测试
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run specific test
python test_startup.py
构建软件包
# Build distribution
python setup.py sdist bdist_wheel
# Install locally
pip install dist/maven_decoder_mcp-*.whl
Docker 开发
# Build Docker image
docker build -t maven-decoder-mcp .
# Run container
docker run --rm -it maven-decoder-mcp
📝 配置选项
环境变量
本地仓库
MAVEN_REPOSITORY/MAVEN_REPO:本地 Maven 仓库的直接路径(例如F:\data\repository)。优先级最高。MAVEN_HOME/M2_HOME:Maven 安装目录或仓库目录。如果存在嵌套的repository/子目录,则优先使用;同时支持conf/settings.xml中的<localRepository>。- 未设置环境变量时,支持
~/.m2/settings.xml中的<localRepository>。回退路径:~/.m2/repository。
在线访问
MAVEN_OFFLINE:设为true可禁用所有网络访问(默认值:false)MAVEN_AUTO_DOWNLOAD:自动获取本地缺失的构件(默认值:true)MAVEN_REMOTE_REPOS/MAVEN_REMOTE_REPO:以逗号或空格分隔的仓库基础 URL(默认值:https://repo1.maven.org/maven2)MAVEN_SEARCH_URL:以逗号或空格分隔的 Solr 搜索端点(默认值:https://search.maven.org/solrsearch/select)MAVEN_DECODER_CACHE_DIR:下载构件的缓存位置(默认值:~/.cache/maven-decoder-mcp/repository)MAVEN_REMOTE_USERNAME/MAVEN_REMOTE_PASSWORD:私有镜像的基本身份验证凭据MAVEN_HTTP_TIMEOUT:每个请求的超时时间,单位为秒(默认值:30)MAVEN_HTTP_RETRIES:临时网络故障时的重试次数(默认值:3)MAVEN_MAX_DOWNLOAD_SIZE:最大下载大小,单位为字节(默认值:104857600)MAVEN_VERIFY_CHECKSUM:根据已发布的 SHA-1 校验下载内容(默认值:true)
响应
MCP_LOG_LEVEL:日志级别(DEBUG、INFO、WARNING、ERROR)MCP_MAX_RESPONSE_SIZE:最大响应大小,单位为字节(默认值:50000)MCP_MAX_ITEMS_PER_PAGE:每页的默认条目数(默认值:20)MCP_MAX_TEXT_LENGTH:触发摘要前的最大文本长度(默认值:10000)MCP_MAX_LINES:触发摘要前的最大行数(默认值:500)MCP_USAGE_SCAN_LIMIT:find_usage_examples扫描的最大类数(默认值:200000)MCP_API_DIFF_LIMIT:compare_versions比较的最大类数(默认值:2000)MAVEN_DECODER_DECOMPILER_DIR:存放cfr.jar/procyon-decompiler.jar的目录
高级配置
服务会自动检测并配置:
- Maven 仓库位置
- 可用的 Java 反编译器
- 系统功能
🔍 故障排除
常见问题
服务无法启动
# Check Python installation
python --version
# Check Maven repository
ls ~/.m2/repository
# Check logs
maven-decoder-mcp --debug
反编译失败
# Check the environment: Java, repository, cache and available decompilers
maven-decoder-setup status
# Install the optional CFR and Procyon decompilers
maven-decoder-setup decompilers
从源代码检出目录中,你也可以运行 ./setup_decompilers.sh,脚本会将 CFR 和 Procyon 下载到其旁边的 decompilers/ 目录中,分别保存为 decompilers/cfr.jar 和 decompilers/procyon-decompiler.jar。
如果 maven-decoder-setup status 报告未找到反编译器,但你确实有这些 JAR 文件,说明它们位于服务不会查找的位置。服务会按以下顺序搜索这些目录,并使用第一个匹配项:
- 如果已设置,则查找
$MAVEN_DECODER_DECOMPILER_DIR - 已安装的软件包内的
decompilers/ - 软件包旁边的
decompilers/——源代码检出目录结构 ~/.cache/maven-decoder-mcp/decompilers- 当前工作目录中的
decompilers/ - 当前工作目录本身
MCP 客户端会从任意工作目录启动服务,因此实际上最后两项并不可靠。如果你的 JAR 文件位于其他位置,请明确指定其路径:
export MAVEN_DECODER_DECOMPILER_DIR=~/tools/decompilers
该目录必须包含名称严格为 cfr.jar 和 procyon-decompiler.jar 的 JAR 文件。此值会展开 ~ 和环境变量。
如果没有 CFR 或 Procyon,服务仍可正常工作,并会回退到使用 JDK 中的 javap 获取签名、字段和方法。
未找到构件
# Verify Maven repository location
ls ~/.m2/repository
# Run a Maven build to populate repository
mvn dependency:resolve
Maven Central 搜索超时
公共搜索索引会对突发请求进行限流。系统内置了带退避机制的重试,但在严重限流期间,搜索仍可能失败。可尝试以下解决方法:
# Wait a moment and retry, or raise the retry budget
MAVEN_HTTP_RETRIES=5
# Downloads and version listing do not use the search index, so these keep
# working even while search is throttled:
# get_remote_versions, download_artifact
代理或防火墙后下载失败
# requests honors the standard proxy variables
export HTTPS_PROXY=http://proxy.corp:8080
# Or point at an internal mirror
export MAVEN_REMOTE_REPOS="https://nexus.corp/repository/maven-public"
# Or turn the network off entirely
export MAVEN_OFFLINE=true
🤝 参与贡献
- Fork 此仓库
- 创建功能分支(
git checkout -b feature/amazing-feature) - 提交更改(
git commit -m 'Add amazing feature') - 推送到该分支(
git push origin feature/amazing-feature) - 发起 Pull Request
📄 许可证
本项目采用 MIT License 授权,详情请参阅 LICENSE 文件。
🙏 致谢
- Model Context Protocol - 为此服务提供支持的协议
- CFR - Java 反编译器
- Procyon - Java 反编译器
- Maven - 依赖项管理
📊 统计数据
倾情打造 ❤️,献给 Java 开发社区
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。