mcpField
M
Maven Decoder

Maven Decoder

本地服务
github.com开发工具206 周前更新

关于 Maven Decoder

Maven Decoder MCP 是一个 MCP 服务,让 AI Agent 直接读取 Maven 依赖的真实源码。它从 ~/.m2 或 Maven Central 反编译 jar,并比较版本间的 API 变化,适合需要核实库接口的开发者。

主要功能

  1. 01反编译 ~/.m2 或 Maven Central 中的 jar
  2. 02比较两个版本的公开 API 差异与破坏性变更
  3. 03无源码 jar 时通过 javap 解析类信息
  4. 04支持 Maven Central 搜索与按需下载
  5. 05支持企业 Nexus 或 Artifactory 镜像及离线模式

适用场景

  1. 01升级依赖版本前核查哪些 API 发生变化
  2. 02在没有源码 jar 的内部构件中查看类结构
  3. 03让 Agent 根据实际源码而非记忆回答库用法问题

MCP 相关

该项目是 MCP 服务,向 MCP 客户端暴露本地分析、在线搜索和下载等工具,例如 compare_versions 与 extract_class_info。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"salitaba-maven-decoder": {
"command": "npx",
"args": [
"-y",
"maven-decoder-mcp"
],
"env": {
"MAVEN_REPOSITORY": "<MAVEN_REPOSITORY>",
"MAVEN_REMOTE_REPOS": "<MAVEN_REMOTE_REPOS>",
"MAVEN_REMOTE_USERNAME": "<MAVEN_REMOTE_USERNAME>",
"MAVEN_REMOTE_PASSWORD": "<MAVEN_REMOTE_PASSWORD>",
"MAVEN_OFFLINE": "<MAVEN_OFFLINE>",
"MAVEN_AUTO_DOWNLOAD": "<MAVEN_AUTO_DOWNLOAD>",
"MAVEN_DECODER_CACHE_DIR": "<MAVEN_DECODER_CACHE_DIR>"
}
}
}
}
启动命令npx -y maven-decoder-mcp
需要配置的环境变量
MAVEN_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmmaven-decoder-mcp1.3.2
pypimaven-decoder-mcp1.3.2

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Maven Decoder MCP Server

skills.sh

你的 Agent 会猜测自己从未读过的库 API。本工具让它读到真实内容。

让 AI Agent 读取任意 Maven 依赖的实际源代码——反编译 ~/.m2 或 Maven Central 中的 jar,并比较不同版本,找出破坏性变更。

演示:比较 jsoup 1.17.2 和 1.23.2

向 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 客户端的环境中设置这些变量。

远程下载使用单独的缓存,按以下顺序确定缓存位置(跳过空值):

  1. MAVEN_DECODER_CACHE_DIR:完整的缓存目录;不会追加子目录。
  2. XDG_CACHE_HOME:追加 maven-decoder-mcp\repository。
  3. LOCALAPPDATA:追加 maven-decoder-mcp\repository。
  4. 否则,在主目录下使用 ~/.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_artifactsgroup_idstring—按 group ID 筛选(例如,'org.springframework')
list_artifactsartifact_idstring—按 artifact ID 筛选(例如,'spring-core')
list_artifactsversionstring—按版本筛选(例如,'5.3.21')
list_artifactssort_bystringname排序方式:'name'(按 group/artifact/version 升序,默认)、'size'(较大的 jar 排在前面)或 'modified'(最近修改的排在前面)。未知值将回退为 'name'。
list_artifactslimitinteger50要返回的 artifact 最大数量
list_artifactspageinteger1分页页码
list_artifactsitems_per_pageinteger20每页项目数
analyze_jargroup_id*string—Maven group ID
analyze_jarartifact_id*string—Maven artifact ID
analyze_jarversion*string—Maven 版本
analyze_jarinclude_bytecodebooleanFalse包含字节码分析
analyze_jarinclude_manifestbooleanTrue包含 JAR 清单
analyze_jarsummarize_large_contentbooleanTrue自动总结大型内容
extract_class_infogroup_id*string—Maven group ID
extract_class_infoartifact_id*string—Maven artifact ID
extract_class_infoversion*string—Maven 版本
extract_class_infoclass_patternstring—匹配类名的模式(支持正则表达式)
extract_class_infoinclude_methodsbooleanTrue包含方法签名
extract_class_infoinclude_fieldsbooleanTrue包含字段信息
extract_class_infoinclude_bytecodebooleanFalse包含匹配类的详细 javap 字节码输出
extract_class_infopageinteger1分页页码
extract_class_infoitems_per_pageinteger20每页项目数
extract_class_infosummarize_large_contentbooleanTrue自动总结大型内容
get_dependenciesgroup_id*string—Maven group ID
get_dependenciesartifact_id*string—Maven artifact ID
get_dependenciesversion*string—Maven 版本
get_dependenciesinclude_transitivebooleanFalse包含传递依赖
get_dependenciespageinteger1分页页码
get_dependenciesitems_per_pageinteger20每页项目数
search_classesclass_namestring—要搜索的类名(支持通配符)
search_classespackage_patternstring—用于筛选的包模式
search_classesannotationstring—搜索带有特定注解的类
search_classescase_sensitivebooleanTrue区分大小写匹配 class_name 和 package_pattern。设为 false 可进行不区分大小写的搜索(例如,'arraylist' 可匹配 'ArrayList')。
search_classeslimitinteger100要返回的结果最大数量
search_classespageinteger1分页页码
search_classesitems_per_pageinteger20每页项目数
extract_source_codegroup_id*string—Maven group ID
extract_source_codeartifact_id*string—Maven artifact ID
extract_source_codeversion*string—Maven 版本
extract_source_codeclass_name*string—完全限定类名
extract_source_codeprefer_sourcesbooleanTrue优先使用源码 jar,而非反编译
extract_source_codesummarize_large_contentbooleanTrue自动总结大型内容
extract_source_codemax_linesinteger500要返回的最大行数(0 表示全部)
extract_jar_resourcegroup_id*string—Maven group ID
extract_jar_resourceartifact_id*string—Maven artifact ID
extract_jar_resourceversion*string—Maven 版本
extract_jar_resourceresource_pathstring—jar 内资源的确切路径
extract_jar_resourceresource_patternstring—匹配资源路径的正则表达式
extract_jar_resourcemax_bytesinteger65536每个资源可读取的最大字节数
extract_jar_resourcelimitinteger20要返回的匹配资源最大数量
compare_versionsgroup_id*string—Maven group ID
compare_versionsartifact_id*string—Maven artifact ID
compare_versionsversion1*string—要比较的第一个(较旧)版本
compare_versionsversion2*string—要比较的第二个(较新)版本
compare_versionscompare_apibooleanTrue比较公共 API:新增或移除的公共和受保护方法与字段,以及破坏性变更
compare_versionsresolve_inheritedbooleanFalse如果某个成员从类中消失,但仍在新 jar 中的某个超类型上声明,则将其重新归类到“已移至超类型”类别,而不是将其计为破坏性移除。默认值为 false(与按声明进行的差异比较结果逐字节相同)。
compare_versionssummarize_large_contentbooleanTrue自动总结大型内容
find_usage_examplesclass_name*string—要查找用法示例的类名
find_usage_examplesmethod_namestring—方法名
find_usage_examplessearch_testsbooleanTrue在测试 jar 中搜索
find_usage_exampleslimitinteger50要返回的结果最大数量
find_usage_examplespageinteger1分页页码
find_usage_examplesitems_per_pageinteger20每页项目数
get_dependency_treegroup_id*string—Maven group ID
get_dependency_treeartifact_id*string—Maven artifact ID
get_dependency_treeversion*string—Maven 版本
get_dependency_treemax_depthinteger3要显示的最大深度
get_dependency_treesummarize_large_contentbooleanTrue自动总结大型内容
find_dependentsgroup_id*string—目标 group ID
find_dependentsartifact_id*string—目标 artifact ID
find_dependentsversionstring—要搜索的特定版本(可选)
find_dependentslimitinteger100要返回的结果最大数量
find_dependentspageinteger1分页页码
find_dependentsitems_per_pageinteger20每页项目数
get_version_infogroup_id*string—Maven group ID
get_version_infoartifact_id*string—Maven artifact ID
get_version_infoinclude_remotebooleanFalse同时列出远程仓库中发布的版本(不仅限于已安装的版本)
get_version_infolimitinteger50要返回的版本最大数量
get_version_infopageinteger1分页页码
get_version_infoitems_per_pageinteger20每页项目数
analyze_jar_structuregroup_id*string—Maven group ID
analyze_jar_structureartifact_id*string—Maven artifact ID
analyze_jar_structureversion*string—Maven 版本
analyze_jar_structuresummarize_large_contentbooleanTrue自动总结大型内容
extract_method_infogroup_id*string—Maven group ID
extract_method_infoartifact_id*string—Maven artifact ID
extract_method_infoversion*string—Maven 版本
extract_method_infoclass_name*string—完全限定类名
extract_method_infomethod_patternstring—匹配方法名的模式(支持正则表达式)
extract_method_infoinclude_bytecodebooleanFalse包含字节码分析
extract_method_infomax_methodsinteger10要返回的方法最大数量
search_maven_centralquerystring—自由文本搜索词(例如,'jackson databind')
search_maven_centralgroup_idstring—精确的 group ID 筛选条件(例如,'org.springframework')
search_maven_centralartifact_idstring—精确的 artifact ID 筛选条件(例如,'spring-core')
search_maven_centralclass_namestring—要查找其所属 artifact 的简单类名(例如,'ObjectMapper')
search_maven_centralfully_qualified_classstring—完全限定类名(例如,'com.fasterxml.jackson.databind.ObjectMapper')
search_maven_centralpackagingstring—打包类型筛选条件(例如,'jar'、'pom')
search_maven_centralall_versionsbooleanFalse返回所有已发布版本,而非每个 artifact 仅返回最新版本
search_maven_centrallimitinteger20要返回的结果最大数量(最多 200)
search_maven_centralpageinteger1分页页码
get_remote_versionsgroup_id*string—Maven group ID
get_remote_versionsartifact_id*string—Maven artifact ID
get_remote_versionsinclude_snapshotsbooleanTrue包含 -SNAPSHOT 版本。设为 false 仅列出正式发布的版本。
get_remote_versionslimitinteger100要返回的版本最大数量
download_artifactgroup_id*string—Maven group ID
download_artifactartifact_id*string—Maven artifact ID
download_artifactversion*string—要下载的版本;若要下载最新发行版,则使用 'latest'
download_artifactinclude_sourcesbooleanTrue如果已发布,也下载源码 jar
download_artifactinclude_javadocbooleanFalse如果已发布,也下载 javadoc jar
download_artifactclassifierstring—下载特定分类的 jar,而非主 jar
download_artifactforcebooleanFalse即使文件已缓存,也重新下载
* 必填 — 该参数出现在工具的 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 支持

该服务可使用本地仓库和远程仓库。在线访问默认已启用。

工作原理
  1. 每个工具都会先在本地仓库(~/.m2/repository)中查找。
  2. 如果未找到,就会从 Maven Central 下载构件到缓存(~/.cache/maven-decoder-mcp/repository),缓存采用标准 Maven 布局。
  3. 随后,所有现有分析(反编译、类信息、依赖项)都会针对缓存中的构件运行,其方式与针对已安装构件运行完全相同。

缓存有意与 ~/.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 文件,说明它们位于服务不会查找的位置。服务会按以下顺序搜索这些目录,并使用第一个匹配项:

  1. 如果已设置,则查找 $MAVEN_DECODER_DECOMPILER_DIR
  2. 已安装的软件包内的 decompilers/
  3. 软件包旁边的 decompilers/——源代码检出目录结构
  4. ~/.cache/maven-decoder-mcp/decompilers
  5. 当前工作目录中的 decompilers/
  6. 当前工作目录本身

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

🤝 参与贡献

  1. Fork 此仓库
  2. 创建功能分支(git checkout -b feature/amazing-feature)
  3. 提交更改(git commit -m 'Add amazing feature')
  4. 推送到该分支(git push origin feature/amazing-feature)
  5. 发起 Pull Request

📄 许可证

本项目采用 MIT License 授权,详情请参阅 LICENSE 文件。

🙏 致谢

📊 统计数据

GitHub Stars GitHub Forks PyPI Downloads npm Downloads Docker Pulls


倾情打造 ❤️,献给 Java 开发社区

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。