Skip to main content
Glama
pgatzka

jar-inspector-mcp

by pgatzka

jar-inspector-mcp

Ein MCP-Server, mit dem Claude Code in Java-Archive hineinlesen kann — Klassen, APIs, Quellen, Ressourcen, Bytecode — ohne sie zu entpacken.

Das Problem

Wenn Claude Code an einem JVM-Projekt arbeitet und wissen muss, was in einem jar steckt, weicht es auf Shell-Werkzeuge aus:

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

All das landet im Kontextfenster, das meiste davon ist Rauschen, und einiges davon schreibt temporäre Dateien in den Arbeitsbaum.

Die Lösung

Zehn fokussierte Werkzeuge, die die tatsächlichen Fragen beantworten — „Was ist in diesem jar?“, „Wie sieht die API dieser Klasse aus?“, „Wo wird dieser String gesetzt?“ — und genau das zurückgeben.

Gemessen an jackson-databind-2.16.1.jar (779 Klassen, 4,1 MB entpackt):

Statt

jar-inspector

unzip -l <jar>

79.674 Zeichen

jar_overview

2.632 Zeichen

97 % weniger

javap <class>

36.008 Zeichen

jar_class_outline

18.061 Zeichen

50 % weniger

javap -p -c <class>

303.105 Zeichen

jar_class_outline

21.409 Zeichen

93 % weniger

Es wird nie etwas auf die Festplatte geschrieben und kein JDK ist erforderlich — der Parser für Klassendateien ist reines Python. (jar_disassemble ist die einzige Ausnahme; er ruft javap von der Shell aus auf.)

Installation

Voraussetzungen: uv und 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

Füge --scope project hinzu, um es über .mcp.json mit einem Repository zu teilen, oder --scope user, um es überall zu aktivieren. Um es stattdessen manuell zu verdrahten:

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

Verifiziere mit claude mcp list" oder /mcp` in Claude Code.

Andere MCP-Clients: Der Server spricht stdio, daher funktioniert uvx --from … jar-inspector-mcp überall als Befehl.

Werkzeuge

Werkzeug

Antwort

jar_overview

Was ist dieses Artefakt? Manifest, Packages, Klassenanzahl, Bytecode-Level, sind Quellen vorhanden

jar_list

Welche Einträge enthält es? Nach Glob und Typ gefiltert, seitenweise

jar_find_class

Wo lebt HttpClient? Einfacher Name, FQN oder Glob → Klassennamen

jar_class_outline

Wie sieht die API dieser Klasse aus? Deklaration, Annotationen, Felder, Methodensignaturen

jar_read_source

Was tut sie tatsächlich? Zugehörige .java/.kt-Quelle, in Zeilenfenstern

jar_read_entry

Was steckt in dieser Konfiguration? Ein Texteintrag: Manifest, META-INF/services/…, XML

jar_search

Wo steht dieser String? Grep über Texteinträge und kompilierte String-Klassenkonstanten

jar_class_dependencies

Was berührt diese Klasse? Interne vs. externe Referenzen

jar_disassemble

Wie kompiliert diese Methode? Bytecode einer Methode über javap

jar_find

Wo ist das JAR? Durchsucht Build-Ausgabe, das Maven-Repository und den Gradle-Cache

Jedes Werkzeug ist schreibgeschützt und erwartet ein jar-Argument. Dieses akzeptiert:

  • ein Archiv — .jar, .war, .ear, .aar, .zip, .jmod

  • ein entpacktes Klassenverzeichnis — target/classes, build/classes/java/main

  • ein verschachteltes Archiv — app.jar!BOOT-INF/lib/dep-1.0.jar (Spring-Boot-Fat-JARs)

Wie die Ausgabe aussieht

jar_class_outline — unverändert (das ist die genaue Ausgabe, auf die die Tests prüfen):

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)

Generische Signaturen, Parameternamen (bei Kompilation mit -g), Vararg-Parameter, Arrays, Konstanten, Records, Enums und default-Methoden überstehen es. Methodenrüke (Method bodies), Brücken-Methoden und Konstpools überstehen es nicht.

Konfiguration

Umgebungsvariable

Wirkung

JAR_INSPECTOR_ALLOW

Durch Pfad-Seperator getrennte Wurzelpfade, die der Server lesen darf. Nicht gesetzt bedeutet: keine Einschränkung

JAR_INSPECTOR_SEARCH_PATH

Zusätzliche Verzeichnisse, die jar_find zuerst durchsucht

MAVEN_REPO_LOCAL

Ort des Maven-Repositorys, falls nicht ~/.m2/repository

jar_find durchsucht in dieser Reihenfolge: ./target, ./build/libs, ./libs, ./lib, das Maven-Repository, den Gradle-Modul-Cache, den Ivy-Cache und den Coursier-Cache.

Um den Server auf einen Verzeichnisbaum zu beschränken:

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

Claude dazu bringen, es zu verwenden

Der Server bringt MCP-instructions mit, die Clients darüber informieren, dass diese Werkzeuge unzip, jar xf und javap ersetzen werden. Wenn du immer noch dabei beobachtest, wie Claude zur Shell greift, füge eine Zeile in dein CLAUDE.md in deinem Projekt hinzu:

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

Funktionsweise

  • Klassen-Parsing ist ein kalte Abhängigheitsfreier Reader für das Klassendateiformat: Konstantenpool, Zugriffsflags, Attributnamen wie Signature, MethodParameters, LocalVariableTable, Exceptions, Record, InnerClasses sowie die Attributen der Laufzeit-Annotationen. Methodrüke werden übersprungen, außer jar_disassemble fragt danach.

  • Archive werden über zipfile im Speicher gelesen. Verschachtelte JARs werden aus den Bytes des äußeren Eintrags geöffnet, sodass ein Spring-Boot-Fat-JAR nicht entpackt werden muss.

  • Quellen werden zuerst im Archiv selbst gefunden, danach im benachbarten -sources.jar im Maven-Layout, schließlich im zugehörigen Hash-Dhat, das im Gradle-Cache verwendet wird.

  • Ausgabe ist immer begrenzt und sagt immer, wenn sie abgeschnitten wurde und wie man weiterscheidet.

Entwicklung

uv sync
uv run pytest          # 49 tests

Die Tests kompilieren den Java-Code in tests/java mit javac und prüfen gegen echten Bytecode, sodass generics, Brücken-Methoden und Records echte ausprobiert werden; sie werden übersprungen, wenn kein JDK vorhanden ist. Zusätzlich wird der Parser gegen jede Klasse in jedem JAR geprüft, das mit Maven und Gradle ausgeliefert wird — insgesamt 65,573 Klassen, null Fehler.

Lizenz

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