Skip to main content
Glama
pgatzka

jar-inspector-mcp

by pgatzka

{"type": "text"}# jar-inspector-mcp

Un servidor MCP que permite a Claude Code leer dentro de archivos Java — clases, APIs, fuentes, recursos, bytecode — sin extraerlos.

El problema

Cuando Claude Code trabaja en un proyecto JVM y necesita saber qué hay dentro de un jar, recurre a herramientas de shell:

unzip -l target/lib/jackson-databind-2.16.1.jar     # 780 lines of entry listing
unzip -o app.jar -d /tmp/x && cat /tmp/x/…/Foo.java # a whole file to answer one question
javap -p -c -cp app.jar com.acme.Foo                # 300 KB of bytecode

Todo eso termina en la ventana de contexto, la mayor parte es ruido, y algo de ello escribe archivos temporales en el árbol de trabajo.

La solución

Diez herramientas enfocadas que responden a las preguntas reales — "qué hay en este jar", "cuál es la API de esta clase", "dónde se establece esta cadena" — y devuelven solo eso.

Medido en jackson-databind-2.16.1.jar (779 clases, 4.1 MB extraídos):

En lugar de

jar-inspector

unzip -l <jar>

79,674 caracteres

jar_overview

2,632 caracteres

97% menos

javap <class>

36,008 caracteres

jar_class_outline

18,061 caracteres

50% menos

javap -p -c <class>

303,105 caracteres

jar_class_outline

21,409 caracteres

93% menos

Nada se escribe nunca en disco, y no se requiere JDK — el analizador de archivos de clase es Python puro. (jar_disassemble es la única excepción; recurre a javap.)

Instalación

Requiere uv y Python 3.10+.

# from GitHub, nothing to clone
claude mcp add jar-inspector -- uvx --from git+https://github.com/pgatzka/jar-inspector-mcp jar-inspector-mcp

# or from a local clone
git clone https://github.com/pgatzka/jar-inspector-mcp && cd jar-inspector-mcp
claude mcp add jar-inspector -- uv run --directory "$PWD" jar-inspector-mcp

Añade --scope project para compartirlo con un repositorio a través de .mcp.json, o --scope user para habilitarlo en todas partes. Para configurarlo manualmente en su lugar:

// .mcp.json
{
  "mcpServers": {
    "jar-inspector": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/pgatzka/jar-inspector-mcp", "jar-inspector-mcp"]
    }
  }
}

Verifica con claude mcp list, o /mcp dentro de Claude Code.

Otros clientes MCP: el servidor habla stdio, así que uvx --from … jar-inspector-mcp funciona como comando en cualquier lugar.

Herramientas

Herramienta

Respuestas

jar_overview

¿Qué es este artefacto? Manifiesto, paquetes, número de clases, nivel de bytecode, si hay fuentes adjuntas

jar_list

¿Qué entradas contiene? Filtrado por glob y tipo, paginado

jar_find_class

¿Dónde vive HttpClient? Nombre simple, FQCN o glob → nombres de clase

jar_class_outline

¿Cuál es la API de esta clase? Declaración, anotaciones, campos, firmas de métodos

jar_read_source

¿Qué hace realmente? Fuente .java/.kt adjunta, por ventana de líneas

jar_read_entry

¿Qué hay en esta configuración? Una entrada de texto: MANIFEST, META-INF/services/…, XML

jar_search

¿Dónde está esta cadena? Grep a través de entradas de texto y constantes de cadena compiladas

jar_class_dependencies

¿Qué toca esta clase? Referencias internas vs externas

jar_disassemble

¿A qué compila este método? Bytecode de un método vía javap

jar_find

¿Dónde está el jar? Busca en la salida de compilación, el repositorio Maven y la caché de Gradle

Cada herramienta es de solo lectura y toma un argumento jar que acepta:

  • un archivo — .jar, .war, .ear, .aar, .zip, .jmod

  • un directorio de clases explotado — target/classes, build/classes/java/main

  • un archivo anidadoapp.jar!BOOT-INF/lib/dep-1.0.jar (jars gordos de Spring Boot)

Cómo se ve la salida

jar_class_outline, textualmente (esta es la salida exacta que los tests verifican):

com.acme.demo.UserService  [class, Java 21, UserService.java]
// source is attached -- jar_read_source(jar, 'com.acme.demo.UserService') shows it

@Deprecated
@Marker(enabled=true, code='z', tags={"alpha", "beta"})
public class UserService implements Repository<String, Integer>

  // fields (2)
  public static final String CACHE_KEY = "user.cache"
  protected volatile boolean dirty

  // constructors (1)
  public UserService(Map<Integer, String> users)

  // methods (5)
  public long count()
  public List<String> findAll()
  public Optional<String> findById(Integer id) throws IllegalStateException
  public <R extends Comparable<R>> List<R> mapAll(Function<String, R> fn)
  public void rename(int id, String newName, String... aliases)

  // nested (1)
  UserService.Builder

  // 4 more member(s) hidden (visibility below 'protected', synthetic or bridge)

Las firmas genéricas, los nombres de parámetros (cuando se compila con -g), los varargs, las excepciones declaradas, los valores constantes, los records, los enums y los métodos default sobreviven. Los cuerpos de métodos, los métodos puente y los pools de constantes no.

Configuración

Variable de entorno

Efecto

JAR_INSPECTOR_ALLOW

Raíces separadas por rutas que el servidor puede leer. Sin establecer significa sin restricción

JAR_INSPECTOR_SEARCH_PATH

Directorios adicionales que jar_find escanea primero

MAVEN_REPO_LOCAL

Ubicación del repositorio Maven, si no es ~/.m2/repository

jar_find busca, en orden: ./target, ./build/libs, ./libs, ./lib, el repositorio Maven, la caché de módulos de Gradle, la caché de Ivy y la caché de Coursier.

Para confinar el servidor a un árbol:

claude mcp add jar-inspector --env JAR_INSPECTOR_ALLOW="$HOME/work:$HOME/.m2" \
  -- uvx --from git+https://github.com/pgatzka/jar-inspector-mcp jar-inspector-mcp

Incitando a Claude a usarlo

El servidor incluye instructions de MCP que indican a los clientes que estas herramientas reemplazan a unzip, jar xf y javap. Si aún ves a Claude recurriendo al shell, añade una línea a tu CLAUDE.md del proyecto:

To inspect jars, use the jar-inspector MCP tools instead of unzip/jar/javap.

Cómo funciona

  • Análisis de clases es un lector sin dependencias para el formato de archivo de clase: pool de constantes, flags de acceso, Signature, MethodParameters, LocalVariableTable, Exceptions, Record, InnerClasses y los atributos de anotaciones en tiempo de ejecución. Los cuerpos de métodos se omiten a menos que jar_disassemble los solicite.

  • Archivos se leen a través de zipfile en memoria. Los jars anidados se abren desde los bytes de la entrada externa, por lo que un jar gordo de Spring Boot no necesita descompresión.

  • Fuentes se resuelven desde el propio archivo, luego desde el -sources.jar hermano en el diseño de Maven, y luego desde el directorio hash vecino que usa la caché de Gradle.

  • Salida siempre está limitada y siempre dice cuándo se truncó y cómo paginar.

Desarrollo

uv sync
uv run pytest          # 49 tests

Los tests compilan el Java en tests/java con javac y verifican contra bytecode real, por lo que los genéricos, los métodos puente y los records se ejercitan de verdad; se omiten cuando no hay JDK presente. El analizador se verifica además contra cada clase en cada jar distribuido con Maven y Gradle — 65,573 clases, sin fallos.

Licencia

MIT

-
license - not tested
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Augments MCP Server - A comprehensive framework documentation provider for Claude Code

  • An MCP server that gives your AI access to the source code and docs of all public github repos

  • A MCP server built for developers enabling Git based project management with project and personal…

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pgatzka/jar-inspector-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server