jar-inspector-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jar-inspector-mcpShow me the outline of com.example.UserService in target/app.jar"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
jar-inspector-mcp
An MCP server that lets Claude Code read inside Java archives — classes, APIs, sources, resources, bytecode — without extracting them.
The problem
When Claude Code works on a JVM project and needs to know what is inside a jar, it falls back on shell tools:
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 bytecodeAll of it lands in the context window, most of it is noise, and some of it writes temporary files into the working tree.
Related MCP server: dejared-mcp
The solution
Ten focused tools that answer the actual questions — "what is in this jar", "what is this class's API", "where is this string set" — and return only that.
Measured on jackson-databind-2.16.1.jar (779 classes, 4.1 MB extracted):
Instead of | jar-inspector | |||
| 79,674 chars |
| 2,632 chars | 97% less |
| 36,008 chars |
| 18,061 chars | 50% less |
| 303,105 chars |
| 21,409 chars | 93% less |
Nothing is ever written to disk, and no JDK is required — the class file parser
is pure Python. (jar_disassemble is the one exception; it shells out to javap.)
Install
Requires uv and 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-mcpAdd --scope project to share it with a repo through .mcp.json, or --scope user
to enable it everywhere. To wire it up by hand instead:
// .mcp.json
{
"mcpServers": {
"jar-inspector": {
"command": "uvx",
"args": ["--from", "git+https://github.com/pgatzka/jar-inspector-mcp", "jar-inspector-mcp"]
}
}
}Verify with claude mcp list, or /mcp inside Claude Code.
Other MCP clients: the server speaks stdio, so uvx --from … jar-inspector-mcp works
as the command anywhere.
Tools
Tool | Answers |
| What is this artifact? Manifest, packages, class count, bytecode level, are sources attached |
| What entries are in it? Filtered by glob and kind, paged |
| Where does |
| What is this class's API? Declaration, annotations, fields, method signatures |
| What does it actually do? Attached |
| What is in this config? One text entry: MANIFEST, |
| Where is this string? Grep across text entries and compiled string constants |
| What does this class touch? Internal vs external references |
| What does this method compile to? One method's bytecode via |
| Where is the jar? Searches build output, the Maven repo and the Gradle cache |
Every tool is read-only and takes a jar argument that accepts:
an archive —
.jar,.war,.ear,.aar,.zip,.jmodan exploded classes directory —
target/classes,build/classes/java/maina nested archive —
app.jar!BOOT-INF/lib/dep-1.0.jar(Spring Boot fat jars)
What the output looks like
jar_class_outline, verbatim (this is the exact output the tests assert on):
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)Generic signatures, parameter names (when compiled with -g), varargs, declared
exceptions, constant values, records, enums and default methods all survive.
Method bodies, bridge methods and constant pools do not.
Configuration
Environment variable | Effect |
| Path-separated roots the server may read. Unset means no restriction |
| Extra directories |
| Maven repository location, if not |
jar_find searches, in order: ./target, ./build/libs, ./libs, ./lib, the
Maven repository, the Gradle module cache, the Ivy cache and the Coursier cache.
To confine the server to one tree:
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-mcpNudging Claude to use it
The server ships MCP instructions telling clients these tools replace unzip,
jar xf and javap. If you still see Claude reaching for the shell, add a line to
your project's CLAUDE.md:
To inspect jars, use the jar-inspector MCP tools instead of unzip/jar/javap.How it works
Class parsing is a dependency-free reader for the class file format: constant pool, access flags,
Signature,MethodParameters,LocalVariableTable,Exceptions,Record,InnerClassesand the runtime annotation attributes. Method bodies are skipped unlessjar_disassembleasks for them.Archives are read through
zipfilein memory. Nested jars are opened from the bytes of the outer entry, so a Spring Boot fat jar needs no unpacking.Sources are resolved from the archive itself, then from the sibling
-sources.jarin Maven layout, then from the neighbouring hash directory that Gradle's cache uses.Output is always capped and always says when it was truncated and how to page.
Development
uv sync
uv run pytest # 49 testsThe tests compile the Java in tests/java with javac and assert against real
bytecode, so generics, bridge methods and records are exercised for real; they skip
when no JDK is present. The parser is additionally checked against every class in
every jar shipped with Maven and Gradle — 65,573 classes, no failures.
License
MIT
Available Tools
10 toolsjar_class_dependenciesARead-only
List the classes a compiled class references, split into internal and external.
Useful for tracing what a class actually touches, and for spotting which dependency supplies a type, without decompiling anything.
Args:
jar: Archive path, classes directory, or outer.jar!nested.jar.
class_name: FQCN, simple name or glob.
include_jdk: Include java.*/javax.*/jdk.* references.
limit: Maximum references to list.
| Name | Required | Description | Default |
|---|---|---|---|
| jar | Yes | ||
| limit | No | ||
| class_name | Yes | ||
| include_jdk | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds behavioral context by explaining that references are split into internal and external and that the tool supports jar paths, class directories, and nested jar notation. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence summary, a short 'useful for' framing, and a clean Args list. No filler or redundant content; every line contributes to selection or invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and the presence of an output schema, the description fully covers what the tool does, when to use it, and how to specify each parameter. Nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden of explaining parameters. It does so excellently: jar formats, class_name matching options, include_jdk scope, and limit meaning are all spelled out clearly, adding real value over the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'List the classes a compiled class references, split into internal and external.' This clearly distinguishes it from sibling tools like jar_read_source or jar_disassemble by focusing on dependency references rather than source or bytecode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear use cases: tracing what a class touches and identifying which dependency supplies a type, with the note that it works 'without decompiling anything.' It does not explicitly name alternative sibling tools, but the context is strong enough for an agent to infer when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jar_class_outlineARead-only
Show a class's API: declaration, annotations, fields and method signatures.
This is the cheap alternative to decompiling or reading source. Signatures
keep generics, parameter names (when compiled with -g), thrown exceptions
and constant values; method bodies are not included.
Args:
jar: Archive path, classes directory, or outer.jar!nested.jar.
class_name: FQCN, simple name or glob (resolved like jar_find_class).
visibility: Lowest visibility to include: public, protected, package, private.
include_synthetic: Include compiler-generated bridge/synthetic members.
fully_qualified_types: Print java.util.List instead of List.
| Name | Required | Description | Default |
|---|---|---|---|
| jar | Yes | ||
| class_name | Yes | ||
| visibility | No | protected | |
| include_synthetic | No | ||
| fully_qualified_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=true and openWorldHint=false, so the description carries meaningful extra value. It details what is included (declaration, annotations, fields, method signatures, generics, parameter names under -g, thrown exceptions, constant values) and explicitly what is not included (method bodies), giving an agent an accurate model of behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, well-structured, and front-loaded. The first sentence states the purpose, the second adds key trade-offs, and the Args block provides necessary parameter detail without redundancy. Every sentence contributes information not already present in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only outline tool, the description is complete: it covers input formats, resolution behavior, output scope, caveats about debug symbols, and exclusions. An output schema exists to define return values, so the description does not need to repeat those details. The only external reference, 'resolved like jar_find_class', is reasonable since that sibling already exists in the toolset.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all parameters, and it does. Each param gets a concrete explanation: jar accepts paths or nested-jar syntax, class_name accepts FQCN/simple/glob and references jar_find_class resolution, visibility gives the allowed values, and the two booleans are explained with examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Show a class's API: declaration, annotations, fields and method signatures.' It clearly differentiates this from related tools by framing it as 'the cheap alternative to decompiling or reading source' and by stating that method bodies are not included, which distinguishes it from jar_read_source and jar_disassemble.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for when to choose this tool: when only an API outline is needed and decompiling/source is overkill. It also notes the exclusion of method bodies, which signals when another tool would be needed, though it does not explicitly name those alternative siblings or provide a when-not-to-use list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jar_disassembleARead-only
Disassemble one method's bytecode with javap (needs a JDK on PATH).
Reach for this only when the API outline and the source are not enough --
for example when checking what a method compiles to, or reading a class
that has no sources attached. Always pass method to keep it small.
Args:
jar: Archive path or classes directory (nested ! specs are not supported).
class_name: FQCN, simple name or glob.
method: Method name to keep; empty returns every method (often large).
limit: Maximum lines of disassembly to return.
| Name | Required | Description | Default |
|---|---|---|---|
| jar | Yes | ||
| limit | No | ||
| method | No | ||
| class_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation by disclosing an environmental requirement ('needs a JDK on PATH'), a supported-input limitation ('nested ! specs are not supported'), and a size-related behavior ('empty returns every method (often large)'). These details help the agent anticipate real-world failure modes and avoid huge outputs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly organized: purpose first, usage guidance second, then a clean Args list. Every sentence adds operational value; there is no filler or repetition of structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only inspection tool with an output schema and four parameters, the description provides all essential context: prerequisites, when to use it, parameter semantics, and an important limitation. Nothing critical is missing for selecting or invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full explanatory burden. It compensates thoroughly: jar is described as 'Archive path or classes directory' with a limitation, class_name as 'FQCN, simple name or glob', method with its empty-value behavior, and limit as 'Maximum lines of disassembly'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Disassemble one method's bytecode with javap'. It clearly differentiates this from sibling tools by explaining it is for when 'the API outline and the source are not enough', which distinguishes it from jar_class_outline, jar_read_source, and similar tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Reach for this only when the API outline and the source are not enough', with concrete examples like checking what a method compiles to or reading a class with no sources. It also gives a practical directive to 'Always pass method to keep it small', which helps the agent invoke it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jar_findARead-only
Find jar files on this machine by name: build output, Maven repo, Gradle cache.
Use it to turn "the Jackson databind jar" into a path you can pass to the other tools.
Args:
query: Part of the file name, or a glob such as jackson-databind-*.jar.
search_path: Extra directories to scan first, separated by the path separator.
include_classifiers: Also list -sources, -javadoc and -tests jars.
limit: Maximum jars to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| search_path | No | ||
| include_classifiers | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context: search scope (build output, Maven repo, Gradle cache) and the classifier behavior ('also list -sources, -javadoc and -tests jars'). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: core purpose first, then a practical use case, then parameter details. Every sentence earns its place with no redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all four parameters, the search domain, and the intended workflow. Since an output schema exists, return values are already handled. The description is complete for correct invocation and routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining every parameter: query with glob example, search_path with path separator note, include_classifiers with concrete classifier names, and limit as maximum count. This adds real meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Find jar files on this machine by name', with concrete scopes (build output, Maven repo, Gradle cache). The use case of turning a jar name into a path for other tools clearly distinguishes it from siblings like jar_find_class or jar_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit usage context: 'Use it to turn ... into a path you can pass to the other tools.' This implies when to invoke it, but does not name specific alternatives or state when not to use it. Clear context but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jar_find_classARead-only
Find classes in an archive by simple name, fully-qualified name or glob.
Use this to turn "where does HttpClient live" into a concrete class name
you can pass to jar_class_outline or jar_read_source.
Args:
jar: Archive path, classes directory, or outer.jar!nested.jar.
name: HttpClient, com.acme.HttpClient, or a glob like com.acme.*Repo.
limit: Maximum matches to return.
| Name | Required | Description | Default |
|---|---|---|---|
| jar | Yes | ||
| name | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint: true and destructiveHint: false, and the description adds meaningful behavioral context: supported archive forms, classes directories, nested jar notation, name matching modes, and limit semantics. It does not mention no-match behavior or the exact return composition, but those are secondary given the read-only safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, then the use case, then structured parameter details. Every sentence carries information, and there is no filler or repetition that wastes an agent's attention.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read-only lookup tool with no output schema, the description gives the agent enough to select and invoke it correctly: accepted inputs, match forms, limit behavior, and downstream tool chaining. The 'concrete class name' phrasing also clues the return value sufficiently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides no descriptions for its three properties, so the description fully compensates. The Args block explains jar with paths, class directories, and nested archives, name with simple/FQN/glob examples, and limit as the maximum matches returned. This is strong, concrete parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Find classes in an archive' by simple name, fully-qualified name, or glob. It also grounds the tool in a practical use case, turning 'where does HttpClient live' into a class name for downstream tools. It does not explicitly contrast itself with siblings like jar_find or jar_search, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use this to...' sentence gives explicit guidance on when to invoke the tool: when you need to resolve a vague class reference into a concrete class name for jar_class_outline or jar_read_source. It does not state when not to use it or name a preferred alternative, so it misses the full 5-level guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jar_listARead-only
List entries in an archive, filtered by glob and kind.
Prefer this over unzip -l. Use kind='text' to find configuration,
kind='archive' to find jars bundled inside a fat jar.
Args:
jar: Archive path, classes directory, or outer.jar!nested.jar.
pattern: Comma-separated globs matched against the entry path, e.g.
META-INF/* or *.properties. Empty matches everything.
kind: One of all, class, source, text, binary, archive.
limit: Maximum entries to return.
offset: Entries to skip, for paging.
| Name | Required | Description | Default |
|---|---|---|---|
| jar | Yes | ||
| kind | No | all | |
| limit | No | ||
| offset | No | ||
| pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the read-only nature is covered. The description adds useful behavioral context including the ability to point jar at a classes directory or `outer.jar!nested.jar`, and that an empty pattern matches everything. These are informative but largely parameter-level rather than deeper behavioral disclosures such as output shape or error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose, two lines of usage guidance, and a clean Args list. Each sentence earns its place and the most important information is front-loaded. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 5-parameter tool with zero schema descriptions, the description is highly complete. It covers all parameters, provides examples, notes special cases, and mentions paging. The output schema exists, so the description need not detail return values. The only minor gap is sibling differentiation, which is already accounted for in other dimensions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden of explaining parameters. It does so thoroughly: jar's accepted forms, pattern glob syntax with examples, kind enum values, limit semantics, and offset paging. Every parameter is explained with enough detail for an agent to construct a correct call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'List entries in an archive, filtered by glob and kind.' This is clear and non-tautological. However, it does not explicitly differentiate this tool from siblings like jar_find or jar_search, so the agent must infer distinctions from the tool name and action alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical usage hints for parameter values ('Use kind='text' to find configuration, kind='archive' to find jars bundled inside a fat jar') and recommends this tool over `unzip -l`. It does not, however, explain when to choose jar_list over sibling tools such as jar_find, jar_search, or jar_overview, leaving some selection ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jar_overviewARead-only
Summarize a Java archive: manifest, size, packages, class count, and whether sources are attached.
Start here when you meet an unfamiliar jar, instead of unzipping it or listing every entry.
Args:
jar: Path to a .jar/.war/.aar/.zip, an exploded classes directory, or a
nested archive such as app.jar!BOOT-INF/lib/dep-1.0.jar.
| Name | Required | Description | Default |
|---|---|---|---|
| jar | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true, and the description aligns by describing a non-mutating summary operation. It adds useful behavioral context beyond annotations by specifying the output dimensions and the accepted input forms, including nested archives like `app.jar!BOOT-INF/lib/dep-1.0.jar`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence summary of behavior, one sentence of usage guidance, then a short Args block. Every sentence adds value, and the key guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one required parameter, an output schema, and read-only annotations, the description covers all the information an agent needs to select and correctly invoke the tool. It also positions the tool among many siblings by saying to start here, reducing ambiguity in a crowded tool family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter semantics. It does so thoroughly: 'jar' is explained as a path to jars, wars, aars, zips, exploded directories, or nested archives with a concrete syntax example. This fully compensates for the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Summarize') and names the exact resource and output fields: manifest, size, packages, class count, and source attachment. This makes the tool's purpose immediately clear and distinct from listing, searching, or extracting jar contents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Start here when you meet an unfamiliar jar.' It also tells the agent what not to do instead ('instead of unzipping it or listing every entry'), which implies exclusions even if sibling tool names are not named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jar_read_entryARead-only
Read one text entry from an archive: MANIFEST, service files, XML, config.
Prefer this over unzip -p. Binary entries are described, not dumped.
Args:
jar: Archive path, classes directory, or outer.jar!nested.jar.
entry: Exact entry path, e.g. META-INF/spring.factories.
start_line: 1-based first line to show.
line_count: How many lines to show.
| Name | Required | Description | Default |
|---|---|---|---|
| jar | Yes | ||
| entry | Yes | ||
| line_count | No | ||
| start_line | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark readOnlyHint and openWorldHint; the description adds useful behavioral details: binary entries are described not dumped, the jar parameter accepts a classes directory or nested outer.jar!nested.jar path, and line numbers are 1-based. These go beyond the schema and annotations, though it does not cover error behavior or limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose in the first sentence, followed by one usage tip and a concise parameter list. No redundant or marketing language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the unusual path forms, binary-entry behavior, and line-selection parameters, which is sufficient for most invocations given the available output schema and readOnly annotation. It falls short only in not clarifying the boundary with jar_read_source for Java source code.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates: jar's accepted path forms are specified, entry is defined as an exact path with an example, and start_line/line_count are explained as 1-based and line counts. Every parameter receives meaning beyond the bare schema property names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read one text entry from an archive' and lists typical entry types (MANIFEST, service files, XML, config). It also notes binary entries are described rather than dumped, which clarifies scope, but it does not explicitly distinguish itself from sibling jar_read_source or other jar_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one comparative directive: 'Prefer this over unzip -p', and implies it is for text entries. It does not state when to use jar_read_entry versus the sibling jar_read_source or when not to use it, so the usage signal is mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jar_read_sourceARead-only
Read attached Java/Kotlin source for a class, one line window at a time.
Looks inside the archive itself, then the matching -sources.jar next to it
(Maven layout) or beside it in the Gradle cache. If no source is available,
say so and fall back to jar_class_outline.
Args:
jar: Archive path, classes directory, or outer.jar!nested.jar.
target: FQCN (com.acme.Foo) or an entry path (com/acme/Foo.java).
start_line: 1-based first line to show.
line_count: How many lines to show; use a window rather than whole files.
sources_jar: Explicit sources archive, when auto-detection misses it.
| Name | Required | Description | Default |
|---|---|---|---|
| jar | Yes | ||
| target | Yes | ||
| line_count | No | ||
| start_line | No | ||
| sources_jar | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses the search order: inside the archive itself, then the matching -sources.jar in Maven or Gradle layout. It also explains the behavior when source is unavailable ('say so and fall back to jar_class_outline') and details the explicit sources_jar override. This is rich behavioral context that the annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence states the core purpose immediately. The behavior is explained in a short paragraph, followed by a compact Args list that documents every parameter. Each sentence earns its place, and the fallback and override details are included without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five parameters, no schema-level descriptions, and an output schema present, the description is complete. It covers all parameters, explains archive/source resolution, gives the fallback path, and sets expectations about windowed reading. There is no meaningful missing information an agent would need to select or invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the full burden of parameter documentation. It does: jar accepts an archive path, classes directory, or nested jar syntax; target accepts an FQCN or entry path; start_line is 1-based; line_count is meant for windowed reading; sources_jar is an explicit override. This adds significant meaning beyond the bare schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read attached Java/Kotlin source for a class, one line window at a time.' This clearly distinguishes it from sibling tools like jar_class_outline and jar_read_entry by focusing on source code and line-window access. The name and description align well, and the fallback mention reinforces its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: reading attached source for a class, and explicitly says to fall back to jar_class_outline if no source is available. It also advises using a line window rather than reading entire files. It does not enumerate all sibling alternatives, but the fallback and windowing guidance provide practical routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jar_searchARead-only
Grep text and source entries inside an archive, returning matching lines.
Use it to find a property key, a bean name, an SQL fragment or a log
message without extracting anything. With include_class_strings=True it
also searches string constants compiled into .class files.
Args:
jar: Archive path, classes directory, or outer.jar!nested.jar.
query: Literal text, or a Python regular expression when regex=True.
regex: Treat query as a regular expression.
ignore_case: Case-insensitive matching.
path: Comma-separated globs limiting which entries are searched.
include_class_strings: Also search string constants inside .class files.
limit: Maximum matches to report.
| Name | Required | Description | Default |
|---|---|---|---|
| jar | Yes | ||
| path | No | ||
| limit | No | ||
| query | Yes | ||
| regex | No | ||
| ignore_case | No | ||
| include_class_strings | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, and the description reinforces this by saying 'without extracting anything.' It also adds meaningful behavioral detail about searching inside .class files when include_class_strings=True and returning matching lines, going beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose, a short usage rationale, then a clean Args list. Every sentence adds information without unnecessary padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema and annotations, the description fully covers invocation context: what to search, how to target entries, how to enable regex and class-string search, and how to limit results. No critical guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for parameters. It provides meaningful explanations for all seven parameters, including jar's support for classes directories and nested jar notation, query's regex option, path glob semantics, and the behavior of include_class_strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Grep text and source entries inside an archive, returning matching lines,' which names a specific verb, resource, and result. It clearly distinguishes itself from sibling tools like jar_list or jar_find_class by focusing on content search rather than listing or class discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete use cases: finding a property key, bean name, SQL fragment, or log message. It does not explicitly mention when to prefer a sibling tool, but the use-case framing and content-search focus make the intended context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
jar_class_dependencies - First observed
jar_class_outline - First observed
jar_disassemble - First observed
jar_find - First observed
jar_find_class - First observed
jar_list - First observed
jar_overview - First observed
jar_read_entry - First observed
jar_read_source - First observed
jar_search
TDQS
Scored across 10 tools
Each tool targets a distinct inspection task: overview, listing, class lookup, API outline, source reading, entry reading, search, dependency analysis, disassembly, and jar discovery. There is no meaningful overlap that would make an agent likely to pick the wrong tool.
All tools share the jar_ prefix, which helps, but the grammatical pattern is mixed: jar_list and jar_search are bare verbs, jar_find_class and jar_read_source are verb_noun, while jar_overview and jar_class_outline are noun phrases. The names are readable but not consistently verb_noun.
Ten tools is well within the ideal range and each tool covers a distinct facet of archive inspection. The count feels neither bloated nor thin for the stated purpose.
The read-only jar inspection domain is covered thoroughly: overview, listing, class lookup, API outline, source reading, arbitrary text entries, grep-like search, class dependency analysis, bytecode disassembly, and locating jars on disk. An agent can move from finding a jar to reading its source or bytecode without obvious dead ends.
Maintenance
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…
MCP server for developer documentation, generated by doc2mcp.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server for intelligently reading Java source code, supporting extraction from Maven dependencies and local projects with dual decompilers.155Apache 2.0
- AlicenseNot gradedqualityAmaintenanceA Model Context Protocol (MCP) server for exploring, analyzing, and decompiling Java JAR files.2715MIT
- AlicenseAqualityBmaintenanceMCP server that indexes your codebase's public API at startup and serves it via compact tool responses, saving tokens vs reading source files.521MIT
- FlicenseBqualityBmaintenanceMCP server for searching, browsing, and analyzing decompiled Minecraft source code locally. Supports symbol lookup, text search, reference lookup, and lightweight RAG.11-