jar-inspector-mcp
jar-inspector-mcp
一个 MCP 服务器,让 Claude Code 能够深入 Java 归档——类、API、源码、资源、字节码——而无需解压它们。
问题
当 Claude Code 处理 JVM 项目并需要知道 jar 内部有什么时,它会退回到 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所有这些都会进入上下文窗口,其中大部分是噪音,有些还会在工作树中写入临时文件。
Related MCP server: dejared-mcp
解决方案
十个聚焦的工具,回答实际问题——“这个 jar 里有什么”、“这个类的 API 是什么”、“这个字符串在哪里设置”——并且只返回这些内容。
在 jackson-databind-2.16.1.jar(779 个类,解压后 4.1 MB)上测量:
替代方案 | jar-inspector | |||
| 79,674 字符 |
| 2,632 字符 | 减少 97% |
| 36,008 字符 |
| 18,061 字符 | 减少 50% |
| 303,105 字符 |
| 21,409 字符 | 减少 93% |
永远不会写入磁盘,并且不需要 JDK——类文件解析器是纯 Python 的。(jar_disassemble 是唯一的例外;它会调用 javap。)
安装
需要 uv 和 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添加 --scope project 以通过 .mcp.json 与仓库共享,或使用 --scope user 在所有地方启用。要手动配置:
// .mcp.json
{
"mcpServers": {
"jar-inspector": {
"command": "uvx",
"args": ["--from", "git+https://github.com/pgatzka/jar-inspector-mcp", "jar-inspector-mcp"]
}
}
}使用 claude mcp list 或 Claude Code 中的 /mcp 进行验证。
其他 MCP 客户端:服务器使用 stdio,因此 uvx --from … jar-inspector-mcp 可以作为命令在任何地方使用。
工具
工具 | 回答的问题 |
| 这个工件是什么?清单、包、类数量、字节码级别、是否附加了源码 |
| 里面有哪些条目?按 glob 和类型过滤,分页 |
|
|
| 这个类的 API 是什么?声明、注解、字段、方法签名 |
| 它实际做什么?附加的 |
| 这个配置里有什么?一个文本条目:MANIFEST、 |
| 这个字符串在哪里?在文本条目和编译后的字符串常量中搜索 |
| 这个类接触了什么?内部与外部引用 |
| 这个方法编译成什么?通过 |
| jar 在哪里?搜索构建输出、Maven 仓库和 Gradle 缓存 |
每个工具都是只读的,并接受一个 jar 参数,可以是:
归档文件——
.jar、.war、.ear、.aar、.zip、.jmod解压后的类目录——
target/classes、build/classes/java/main嵌套归档——
app.jar!BOOT-INF/lib/dep-1.0.jar(Spring Boot fat jars)
输出示例
jar_class_outline,逐字(这是测试断言的确切输出):
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)泛型签名、参数名称(使用 -g 编译时)、可变参数、声明的异常、常量值、记录、枚举和 default 方法都会保留。方法体、桥接方法和常量池不会。
配置
环境变量 | 效果 |
| 服务器可以读取的路径分隔根目录。未设置表示无限制 |
|
|
| Maven 仓库位置,如果不是 |
jar_find 按顺序搜索:./target、./build/libs、./libs、./lib、Maven 仓库、Gradle 模块缓存、Ivy 缓存和 Coursier 缓存。
要将服务器限制在一个树中:
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 使用它
服务器附带 MCP instructions,告诉客户端这些工具替代 unzip、jar xf 和 javap。如果你仍然看到 Claude 使用 shell,请在项目的 CLAUDE.md 中添加一行:
To inspect jars, use the jar-inspector MCP tools instead of unzip/jar/javap.工作原理
类解析是一个无依赖的类文件格式读取器:常量池、访问标志、
Signature、MethodParameters、LocalVariableTable、Exceptions、Record、InnerClasses和运行时注解属性。除非jar_disassemble要求,否则跳过方法体。归档通过内存中的
zipfile读取。嵌套 jar 从外部条目的字节中打开,因此 Spring Boot fat jar 无需解包。源码从归档本身解析,然后从 Maven 布局中的同级
-sources.jar解析,然后从 Gradle 缓存使用的相邻哈希目录解析。输出始终有上限,并且始终说明何时被截断以及如何分页。
开发
uv sync
uv run pytest # 49 tests测试使用 javac 编译 tests/java 中的 Java,并针对真实字节码进行断言,因此泛型、桥接方法和记录都得到真实测试;当没有 JDK 时它们会跳过。解析器还针对 Maven 和 Gradle 附带的每个 jar 中的每个类进行了额外检查——65,573 个类,无失败。
许可证
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
- AlicenseAqualityCmaintenanceAn MCP server for intelligently reading Java source code, supporting extraction from Maven dependencies and local projects with dual decompilers.267 PyPI154Apache 2.0
- AlicenseNot gradedqualityAmaintenanceA Model Context Protocol (MCP) server for exploring, analyzing, and decompiling Java JAR files.123 npm7MIT
- AlicenseAqualityBmaintenanceMCP server that indexes your codebase's public API at startup and serves it via compact tool responses, saving tokens vs reading source files.543 PyPI21MIT
- FlicenseBqualityBmaintenanceMCP server for searching, browsing, and analyzing decompiled Minecraft source code locally. Supports symbol lookup, text search, reference lookup, and lightweight RAG.11-