javalens-mcp
Summary: JavaLens is an MCP server that gives AI assistants compiler-accurate semantic analysis of Java codebases via Eclipse JDT (75 tools), covering navigation, reference search, analysis, refactoring, quick fixes, and metrics.
Project setup & status — load Maven/Gradle/Bazel/plain Java projects, inspect classpath, package structure, and server health.
Navigation — search symbols by glob, go-to-definition, find references/implementations, type hierarchy, document symbols, symbol/type/method/field info at a position, hover, Javadoc, signature help.
Fine-grained reference search (JDT-only) — find annotations, instantiations, casts, instanceof checks, throws/catch clauses, method references, generic type arguments, and reflection usage.
Code analysis — diagnostics, syntax validation, call hierarchies (in/out), field writes, tests, unused/unreachable code, affected tests, possible bugs, DI registrations, JPA models, HTTP endpoints.
Data/control flow & impact — variable flow (with optional interprocedural null/taint tracking), branching/loop structure, change-impact blast radius (depth or full transitive closure).
Refactoring (returns text edits) — rename, organize imports, extract variable/method/constant/interface/superclass, inline variable/method, change signature, encapsulate field, pull up/push down, introduce parameter object, move nested type to file, anonymous→lambda.
Quick fixes — suggest imports, list/apply fixes (add import, add throws, try-catch), 10 JDT clean-ups, one-shot diagnose-and-fix.
Metrics — cyclomatic/cognitive complexity, dependency graphs, circular dependency detection (Tarjan SCC), large classes, naming violations.
Compound tools —
analyze_file,analyze_type,analyze_method,get_type_usage_summaryto reduce round-trips.Compiler-accurate Java 1.1–25 (plus Lombok), zero-based coordinates, disk-synchronized answers in strict mode.
Provides compiler-accurate Java code analysis using Eclipse JDT Core, enabling semantic understanding of Java codebases including type resolution, method overloading, inheritance hierarchies, and fine-grained reference analysis.
Enables detection of Spring Dependency Injection registrations and annotations (@Component, @Bean, @Autowired, @Inject) for analyzing Spring-based Java applications.
JavaLens: AI-First Code Analysis for Java
An MCP server providing 75 semantic analysis tools for Java, built directly on Eclipse JDT for compiler-accurate code understanding.
Built for AI Agents
JavaLens exists because AI systems need compiler-accurate insights that reading source files cannot provide. When an AI uses grep or Read to find usages of a method, it cannot distinguish:
A method call from a method with the same name in an unrelated class
A field read from a field write
An interface implementation from an unrelated class
A cast to a type from other references to that type
This leads to incorrect refactorings, missed usages, and incomplete understanding of code behavior.
Related MCP server: java-jdtls-mcp-server
Compiler-Accurate Analysis
JavaLens provides compiler-accurate code analysis through Eclipse JDT—the same engine that powers Eclipse IDE. Unlike text search, JDT understands:
Type resolution across inheritance hierarchies
Method overloading and overriding
Generic type arguments
Import resolution and classpath dependencies
Java source from version 1.1 through Java 25 (markdown Javadoc, module imports, compact source files, flexible constructor bodies)
Lombok-generated members — a bundled agent makes
@Dataaccessors and the like resolve, so code using them is not flagged as undefined
Example: Finding all places where UserService.save() is called:
Approach | Result |
| Returns 47 matches including |
| Returns exactly 12 calls to |
AI Training Bias Warning
⚠️ Important for AI developers and users
AI models may exhibit trained bias toward native tools (Grep, Read, LSP) over MCP server tools, even when semantic analysis provides better results. This happens because:
Training data contains extensive grep/text-search patterns
Native tools are "always available" in the model's experience
The model may not recognize when semantic analysis is superior
To get the best results:
Add guidance to your project instructions or system prompt (e.g., CLAUDE.md for Claude Code):
## Code Analysis Preferences
For Java code analysis, prefer JavaLens MCP tools over text search:
- Use `find_references` instead of grep for finding usages
- Use `find_implementations` instead of text search for implementations
- Use `analyze_type` to understand a class before modifying it
- Use refactoring tools (rename_symbol, extract_method) for safe changes
Semantic analysis from JDT is more accurate than text-based search,
especially for overloaded methods, inheritance, and generic types.What is JavaLens?
JavaLens is an MCP server that gives AI assistants deep understanding of Java codebases. It provides semantic analysis, navigation, refactoring, and code intelligence tools that go beyond simple text search.
Why Not LSP?
Language Server Protocol was designed for IDE autocomplete and basic navigation—not for AI agent workflows that require deep semantic analysis.
Capability | Native LSP | JavaLens |
Find all | ❌ | ✅ |
Find all | ❌ | ✅ |
Find all casts to a type | ❌ | ✅ |
Distinguish field reads from writes | ❌ | ✅ |
Detect circular package dependencies | ❌ | ✅ |
Calculate cyclomatic complexity | ❌ | ✅ |
Find unused private methods | ❌ | ✅ |
Detect possible null pointer bugs | ❌ | ✅ |
Project-wide dead-code reachability from entry points | ❌ | ✅ |
Find the tests that exercise a symbol, transitively | ❌ | ✅ |
JavaLens wraps Eclipse JDT Core directly via OSGi, providing:
Fine-grained reference types: Find specifically casts, annotations, throws clauses, catch blocks, instanceof checks, method references, type arguments
Read vs write access distinction: Track where fields are mutated vs just read
Indexed search: JDT pre-builds an index at load time, so symbol/reference queries do not walk source files
Full AST access: Direct manipulation for complex refactorings
Installation
Prerequisites
Java 21 or later (must be on PATH or set
JAVA_HOME) — required for both install paths.Node.js 18+ — required only if you use the npm/
npxinstall path below. Skip if you use the direct-download path.
JavaLens is an analytical server, not a compiler. It uses Eclipse JDT 2025-12 to parse and understand Java source code from version 1.1 through 25. Java 21 is required only as the server runtime.
Install from GitHub Releases (recommended — Java only)
This is the simplest path if you already have Java 21 and don't have Node.js. Download from Releases:
Platform | File |
All platforms |
|
Extract to a location of your choice (e.g., /opt/javalens or C:\javalens). Then point your MCP client at the bundled jar — see Configure MCP Client below.
Install via npm (requires Node.js 18+)
If you already have Node.js, npx will download and cache the JavaLens distribution (~23 MB) on first run:
{
"mcpServers": {
"javalens": {
"command": "npx",
"args": ["-y", "javalens-mcp"],
"env": {
"JAVA_PROJECT_PATH": "/path/to/your/java/project"
}
}
}
}Configure MCP Client
Add to your MCP configuration (e.g., .mcp.json for Claude Code):
{
"mcpServers": {
"javalens": {
"command": "java",
"args": ["-jar", "/path/to/javalens/javalens.jar", "-data", "/path/to/javalens-workspaces"]
}
}
}The -data argument specifies where JavaLens stores its workspace metadata. See How Workspaces Work below.
Auto-Load a Project
Set JAVA_PROJECT_PATH to auto-load a project when the server starts:
{
"mcpServers": {
"javalens": {
"command": "java",
"args": ["-jar", "/path/to/javalens/javalens.jar", "-data", "/path/to/javalens-workspaces"],
"env": {
"JAVA_PROJECT_PATH": "/path/to/your/java/project"
}
}
}
}Note: Project loading happens asynchronously in the background. The MCP server responds immediately while the project loads. Use
health_checkto monitor loading status—it will show"project.status": "loading"until complete, then"loaded"when ready.
How Workspaces Work
Unlike in-memory code models, Eclipse JDT requires a workspace directory to store:
Search indexes for fast symbol lookup
Compilation state and caches
Project metadata
Workspaces Are Outside Your Source
JavaLens creates its workspace outside your source project to keep your codebase clean:
Your Java Project (unchanged)
├── src/main/java/
├── pom.xml
└── (no Eclipse files added)
JavaLens Workspace (specified by -data)
└── {session-uuid}/
├── .metadata/ <- JDT indexes and state
└── javalens-project/ <- Links to your source (not copies)Why this matters:
No pollution: Your source tree stays clean—no
.projector.classpathfilesNo conflicts: Works alongside any build system without interference
Session isolation: Each MCP session gets its own workspace, enabling concurrent analysis
Session Lifecycle
JavaLens starts and creates a unique workspace:
{base}/{uuid}/load_projectcreates linked folders pointing to your sourceJDT builds indexes in the workspace (not in your project)
When the session ends, the workspace is cleaned up
Tools
Navigation (10 tools)
Tool | Description |
| Search types, methods, fields by glob pattern |
| Navigate to symbol definition |
| Find all usages of a symbol |
| Find interface/class implementations |
| Get inheritance chain |
| Get all symbols in a file |
| Get detailed symbol information at position |
| Get type details at cursor |
| Get method details at cursor |
| Get field details at cursor |
Fine-Grained Reference Search (9 tools)
These use JDT's unique reference type constants—not available through LSP:
Tool | Description |
| Find all |
| Find all |
| Find all |
| Find all |
| Find all |
| Find all |
| Find all |
| Find all |
| Find |
Analysis (20 tools)
Tool | Description |
| Get compilation errors and warnings |
| Fast syntax-only validation |
| Find all callers of a method |
| Find all methods called by a method |
| Find where fields are mutated |
| Discover JUnit/TestNG test methods |
| Find unused private members |
| Project-wide dead code — members unreachable from any main method or test, over the whole-program call graph |
| The tests that exercise a symbol, directly or transitively — the set to run after changing it |
| Detect null risks, empty catches, resource leaks |
| Get documentation/signature for symbol |
| Get parsed Javadoc |
| Get method signature at call site |
| Get containing method/class at position |
| Blast radius — direct call sites by depth, or the full transitive closure over the project graph ( |
| Variable read/write/declaration tracking within a method; opt-in |
| Branching, loops, return/throw points, nesting depth |
| Find Spring DI registrations (@Component, @Bean, @Autowired, @Inject) |
| Assembled JPA entity model — tables, id fields, relationships with resolved targets and mappedBy sides |
| Assembled HTTP route table — Spring and JAX-RS paths composed from class prefixes, mapped to handler methods |
Compound Analysis (4 tools)
Combine multiple queries to reduce round-trips:
Tool | Description |
| Get imports, types, diagnostics in one call |
| Get members, hierarchy, usages, diagnostics |
| Get signature, callers, callees, overrides |
| Get instantiations, casts, instanceof counts |
Refactoring (16 tools)
All refactoring tools return text edits (and new-file content where a refactoring creates one) rather than applying changes directly:
Tool | Description |
| Rename across entire project |
| Sort and clean imports |
| Extract expression to local variable |
| Extract code block to new method |
| Extract to |
| Create interface from class methods |
| Move a member into a newly created superclass |
| Replace variable with its initializer |
| Replace call with method body |
| Modify params/return, update all callers |
| Convert anonymous class to lambda |
| Generate accessors and rewrite all direct field accesses |
| Move a member into the superclass |
| Move a member into the subclasses |
| Bundle a method's parameters into a new class, updating callers |
| Move a nested type into its own top-level file |
Quick Fixes (5 tools)
Tool | Description |
| Find import candidates for unresolved type |
| List available fixes for problem at position |
| Apply fix by ID (add import, remove import, add throws, try-catch) |
| Apply one of 10 JDT clean-ups (convert loops, pattern matching, switch expressions, text blocks, ...) and return rewritten source |
| Diagnose a file and return each problem's top quick-fix edits in one call |
Metrics (5 tools)
Tool | Description |
| Cyclomatic/cognitive complexity, LOC per method |
| Package/type dependencies as nodes and edges |
| Detect package cycles using Tarjan's SCC algorithm |
| Find types exceeding method/field/line count thresholds |
| Check against Java naming conventions |
Project & Infrastructure (6 tools)
Tool | Description |
| Server status and capabilities |
| Load Maven/Gradle/Bazel/plain Java project |
| Get package hierarchy |
| Get classpath entries |
| Get members by type name |
| Find overridden method in superclass |
Usage
Basic Workflow
1. load_project(projectPath="/path/to/java/project")
2. search_symbols(query="*Service", kind="Class")
3. find_references(filePath="...", line=10, column=15)
4. analyze_type(typeName="com.example.UserService")Coordinate System
All line/column parameters are zero-based:
Line 0, Column 0 = first character of file
Path Handling
Response paths are relative by default
All paths use forward slashes for cross-platform consistency
Input paths can be relative or absolute
Important Notes
Disk Synchronization
Every answer is verified against the files on disk at query time. Before any tool logic runs, JavaLens content-hashes the known source files, detects edits, additions, and deletions (the agent reports nothing — the server discovers changes itself), repairs exactly what changed, waits for the search index to absorb the repair, and only then answers. There is no file watcher and no background thread — verification is synchronous inside the query the agent issued, so there are no race conditions.
The agent's loop is just: edit → query.
1. Use JavaLens tools to analyze
2. Write changes to files
3. Use JavaLens tools to verify — answers already reflect the changesload_project is needed only on first use, when a response reports RELOAD_REQUIRED (a build file like pom.xml changed, so the classpath must be rebuilt), or to rebuild everything from scratch. If verification itself fails, the query returns VERIFICATION_FAILED rather than an unverified answer.
Cost: verification is hash-based and parallel — measured per query at ~2 ms for a 72-file project, ~25 ms at 1,000 files, ~180 ms at 10,000 files. Repairs cost only what changed (one edited file reconciles in well under a second), never a full reindex.
Manual mode: set JAVALENS_DISK_SYNC=manual to restore the pre-1.5.0 contract — answers reflect the last load and the agent calls load_project after editing files. Tool descriptions and the MCP instructions field always state the active contract, and health_check reports it as diskSync.
Refactoring Returns Edits
Refactoring tools return text edits but don't modify files. This gives visibility into what would change before applying.
Session Isolation
Each MCP session is independent with its own workspace UUID. Multiple sessions can analyze the same project concurrently.
Build System Support
JavaLens loads three real build systems plus plain Java directories. Each is exercised end-to-end in CI against synthetic real-shaped fixtures (multi-module reactors with cross-module deps, real external libraries, annotation processors).
System | Detection | Single-module | Multi-module / multi-project | Compiler compliance from build files | Generated sources | Annotation processors |
Maven |
| ✅ | ✅ (the reactor, | ✅ (each module's level as maven-compiler-plugin applies it: | ✅ (subdirectories of each module's | ✅ ( |
Gradle |
| ✅ | ✅ (projects, custom | ✅ (each project's | ✅ (the generated-source directories Gradle reports) | ✅ ( |
Bazel |
| ✅ | ✅ (the Java targets and their sources from | ✅ (each javac action's level as javac takes it: the toolchain default, | n/a (Bazel actions write into | ✅ (each javac action's processor path) |
Plain Java |
| ✅ | n/a | ✅ (falls back to | n/a | n/a |
JavaLens asks the build tool itself during the load and takes the model from its answer, writing nothing into the project tree:
Maven: one run (
--fail-at-end) ofhelp:effective-pomanddependency:build-classpath. A module Maven cannot resolve (one that depends on a module of the same build that is not installed, typically) is named by aBUILD_TOOL_FAILED; the rest of the model is still Maven's. Modules declared only in an inactive profile, and Gradle projects of asettings.gradlebeside the root pom, stay linked withINCLUDED_OUTSIDE_BUILD.Gradle: one run with an init script that reports projects, custom
projectDirs, included builds, source sets, generated-source directories, classpath and per-project levels.Bazel:
bazel queryfor the Java targets and sources and the build files,bazel aqueryfor each javac action,bazel info execution_root, all with--lockfile_mode=off.
When the tool cannot run or reports no model, JavaLens reads the build files itself as code (comments and strings declare nothing: poms as XML, Gradle settings and Bazel BUILD files through a lexer), lays modules out by convention where the files say nothing, and reports buildModel.source = static-read with a BUILD_MODEL_STATIC warning naming what such a read cannot see.
A change to any file the build reads, including one created after the load (gradle.properties, a version catalog, buildSrc, .mvn/maven.config, .bazelrc, a .bzl file, the pom of a module outside the root), makes the next query report RELOAD_REQUIRED naming it.
load_project and health_check both report a buildModel summary (build system, where the structure came from: build-tool, static-read or convention, analysis level, modules) and every load warning, so a degraded load is visible wherever the agent looks, including projects auto-loaded through JAVA_PROJECT_PATH. Warning codes:
Code | Meaning |
| The build tool could not start, failed, or ran out of time; the message carries its last output |
| The build tool reported no model, so the build files were read statically; the message says what that cannot see |
| A declared module or subproject was not loaded (directory missing, invalid path) |
| A module's source roots were assumed from the conventional layout |
| A conventional source folder the build does not declare, a module of an inactive Maven profile, or a Gradle project beside a Maven build, stays linked |
| A module's compiled output holds classes with no source and stays on the classpath |
| Modules declare different levels, none, or one outside JDT's range |
| Declared annotation-processor jars are missing |
| Bazel output the classpath needs has not been built |
| Source files or libraries JDT's search index still lacks after repair; index-backed tool responses name them while it lasts |
| The JDK could not be registered with JDT |
| An earlier load's workspace project could not be removed |
|
|
Configuration
Environment Variable | Description | Default |
| Auto-load project on startup | (none) |
| Time limit on each tool call, a whole number of seconds from 5 to 300 (values outside are clamped, other values ignored, each with a | (none: no limit) |
|
| strict |
| TRACE/DEBUG/INFO/WARN/ERROR (case-insensitive); logs go to stderr, stdout carries only JSON-RPC | INFO |
| JVM options, e.g. | (default: 512m via eclipse.ini) |
| Path to the Lombok agent jar attached at launch; overrides the bundled one | (bundled) |
| Extra arguments for the Maven runs that read the model, e.g. | (none) |
| Extra arguments for the Gradle run that reads the model, e.g. | (none) |
| Extra build flags for | (none) |
Building from Source
git clone https://github.com/pzalutski-pixel/javalens-mcp.git
cd javalens-mcp
./mvnw clean verifyDistributions are output to org.javalens.product/target/products/.
Build Requirements
Java 21+ (server runtime)
Maven 3.9+ (wrapper included as
./mvnw)
To run the full test suite (which includes end-to-end tests against real Maven, Gradle, and Bazel builds), the corresponding tools must also be on PATH:
Maven (provided by the wrapper)
Gradle 8+
Bazel 9+ (or
bazelisk)
Tests gracefully skip when a tool is missing on a developer machine. Set JAVALENS_TESTS_REQUIRE_TOOLS=true to flip the gate: missing tools cause a hard failure instead of a skip. CI runs with this flag set so any provisioning gap surfaces as a real failure rather than weakening the suite silently.
Testing
# Full suite, gentle (missing tools skip)
./mvnw verify
# Full suite, strict (missing tools fail; what CI does)
JAVALENS_TESTS_REQUIRE_TOOLS=true ./mvnw verifyBuild-system coverage is structured as focused per-bug tests plus realistic end-to-end tests. The end-to-end tests load a single representative project per build system that exercises every fix in one pass — multi-module Maven with Lombok APT and cross-module references; multi-project Gradle with annotation processors; multi-target Bazel with cross-target deps. CI runs them on Linux and macOS; Windows line endings are covered by tests that write CRLF files explicitly.
Architecture
flowchart TD
Client["<b>MCP Client</b>"]
MCP["<b>org.javalens.mcp</b><br/>McpProtocolHandler → ToolRegistry → 75 Tools"]
Core["<b>org.javalens.core</b><br/>JdtServiceImpl → WorkspaceManager, SearchService"]
JDT["<b>Eclipse JDT Core</b> (via OSGi / Equinox)<br/>IWorkspace, IJavaProject, SearchEngine, ASTParser"]
Client -->|"JSON-RPC over stdio"| MCP
MCP --> Core
Core --> JDTLicense
MIT License - see LICENSE for details.
Available Tools
75 toolsanalyze_change_impactA
Analyze the blast radius of changing a symbol.
USAGE: analyze_change_impact(filePath="path/to/File.java", line=10, column=5) OUTPUT: All files and call sites affected, grouped by file. Every reference at every depth is listed and counted; nothing is cut. A place JDT could not confirm is listed in potentialMatches with its depth, and the member holding it is followed no further.
Options:
depth: How many levels of callers to follow, 1 to 3 (default 1); any other depth is INVALID_PARAMETER depth=1: direct references only depth=2: references + callers of those references depth=3: three levels deep
transitive: full reverse closure over the project call graph (default false). No depth ceiling; follows calls, instantiations, field accesses, and override declarations (callers through an interface or superclass count). Returns affectedMethods + affectedFiles instead of callSites. Supports project methods, fields, and types.
maxResults: cap on affectedMethods in transitive mode (default 200)
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| depth | No | Levels of transitive callers to follow, 1 to 3 (default 1) | |
| column | Yes | Zero-based column number | |
| filePath | Yes | File containing the symbol | |
| maxResults | No | Cap on affectedMethods in transitive mode (default 200) | |
| transitive | No | Full reverse closure over the project graph, no depth ceiling (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses that nothing is cut ("every reference at every depth is listed and counted"), explains the potentialMatches caveat for unconfirmed JDT matches and that they are never counted as results, defines the transitive node types followed (calls, instantiations, field accesses, override declarations), and notes INVALID_PARAMETER for out-of-range depth. This is rich behavioral context beyond any structured field.
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?
Front-loaded with the purpose and organized under USAGE, OUTPUT, and Options headings, so it is easy to scan. It is longer than average, and the potentialMatches paragraph contains some convoluted phrasing ("as many as the results it stands beside may list"), but nearly every sentence earns its place for a 6-parameter tool with no output 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 tool with no output schema and no annotations, the description adequately explains return shapes (callSites vs affectedMethods/affectedFiles), the potentialMatches structure, mode behavior, and the load_project prerequisite. It omits exact output field shapes and any performance/large-project caveats, leaving minor gaps.
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 coverage is already 100%, but the description goes well past the schema: it enumerates the meaning of depth=1, 2, and 3, states that any other value is invalid, clarifies that maxResults applies only to affectedMethods in transitive mode, and specifies that transitive returns affectedMethods + affectedFiles instead of callSites. This adds substantial semantics over the raw parameter definitions.
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+resource ("Analyze the blast radius of changing a symbol") and defines the scope as all files/call sites affected, grouped by file. This distinguishes it from narrow siblings like find_references or get_call_hierarchy_incoming, though it never names a sibling to route between them. Clear and non-tautological.
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 an explicit invocation example and a prerequisite ("Requires load_project to be called first"), plus mode-selection guidance distinguishing depth=1/2/3 semantics and when to use transitive closure. It does not explicitly say when to prefer this over find_references or get_call_hierarchy_incoming, so it stops short of full when/when-not/alternatives routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_control_flowB
Analyze the control flow structure of a method.
USAGE: analyze_control_flow(filePath="path/to/File.java", line=10, column=5) OUTPUT: Branching points, loops, returns, throws, and nesting depth
Reports:
Branch count (if/switch/ternary)
Loop count and types (for/while/do-while/enhanced-for)
Return points with line numbers
Throw points with exception types and line numbers
Try-catch blocks with caught exception types
Maximum nesting depth
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number within the method | |
| column | Yes | Zero-based column number | |
| filePath | Yes | File containing the method |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not explicitly state that the tool is read-only or have side effects, nor does it discuss performance or permissions. The word 'Analyze' implies inspection, but not explicitly.
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 well-structured with a usage line, output summary, and bulleted list of reports. It is concise and front-loaded, though the usage line could be considered redundant.
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 details the output fields (branch count, loop types, etc.) but lacks a formal output schema or return format. It covers input usage and basic output, but misses behavioral transparency and error handling.
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 coverage is 100% with descriptions for all three parameters. The description adds a usage example and notes zero-based indexing, but does not significantly enhance understanding beyond the 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 clearly states it analyzes the control flow structure of a method, specifying what it reports (branching, loops, returns, etc.). This distinguishes it from siblings like analyze_data_flow (data flow analysis) and analyze_method (broader analysis).
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 a usage example and states the prerequisite 'Requires load_project to be called first.' However, it does not explicitly guide when to use this tool versus alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_data_flowA
Analyze data flow within a method.
USAGE: analyze_data_flow(filePath="path/to/File.java", line=10, column=5) OUTPUT: Variables with read/write/declaration info
Reports for each variable:
name and type
whether it is declared, read, written
whether it is a parameter, local variable, or field
return statement count and types
Useful for understanding side effects before extracting methods.
Options:
followCalls: opt-in interprocedural mode (default false). Tracks two fact kinds across argument-to-parameter hops into project callees and reports interproceduralFlows:
null facts - locals assigned null; sink = a dereference of the tracked value in a callee (potential NPE)
taint facts - this method's parameters, propagated through aliases and expressions; sink = the value escaping into a non-project (binary) callee May-analysis: reassignments do not kill facts. Returned values are not tracked back into callers.
maxCallDepth: call-edge bound for followCalls (default 2)
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number within the method | |
| column | Yes | Zero-based column number | |
| filePath | Yes | File containing the method | |
| followCalls | No | Track null/taint facts across method calls (default false) | |
| maxCallDepth | No | Call-edge bound for followCalls (default 2, min 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It explains output details (variables, read/write/declaration info) and provides extensive behavior for followCalls mode, including null and taint facts, may-analysis, and tracking limitations.
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 well-structured with sections, starts clearly, and is not overly verbose given the complexity of the tool. It could be slightly more concise but effectively covers key points.
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?
No output schema, but description adequately explains output format. It mentions prerequisite (load_project) and covers all parameters. For the complexity of the tool, it is sufficiently complete.
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 coverage is 100%, baseline is 3. The description adds value by showing usage format, clarifying zero-based indexing, and explaining followCalls and maxCallDepth in detail beyond schema descriptions.
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 clearly states 'Analyze data flow within a method' and provides a usage example. It distinguishes itself from sibling tools like analyze_control_flow or analyze_change_impact by focusing on data flow and variable tracking.
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 mentions it is 'useful for understanding side effects before extracting methods' and that it requires load_project first. However, it does not explicitly state when not to use it or compare to alternatives, leaving room for ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_fileA
Comprehensive file analysis in a single call.
USAGE: analyze_file(filePath="path/to/File.java") OUTPUT: File info, imports, types with member counts, diagnostics
Combines:
File info (path, package, line count)
All imports (with static/on-demand flags)
All types with member counts
Compilation diagnostics (errors/warnings)
Use this instead of multiple calls to get_document_symbols + get_diagnostics.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Path to source file | |
| includeMembers | No | Include full member details for each type (default false) | |
| includeDiagnostics | No | Include compilation errors/warnings (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description bears full transparency burden. It describes tool's combined behavior and default for includeDiagnostics, but does not specify default for includeMembers (false) or any side effects. Minor gap, but overall satisfactory.
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?
Description is highly concise with clear sections (USAGE, OUTPUT, combines list, guideline). Every sentence serves a purpose, no wasted words, effectively front-loaded with key information.
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 complexity (combines multiple analyses) and no output schema, description provides sufficient overview of what is included. Minor missing detail on includeMembers default, but otherwise complete for selection and invocation.
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 covers 100% of parameters, so description adds minimal value beyond illustrating usage (e.g., filePath example). No additional semantics for includeMembers or includeDiagnostics beyond schema, meeting baseline.
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?
Description clearly states 'Comprehensive file analysis in a single call' and lists specific components (file info, imports, types with member counts, diagnostics), differentiating it from sibling tools that provide individual analyses.
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?
Explicitly states prerequisite 'Requires load_project to be called first' and recommends using this tool instead of multiple calls to get_document_symbols and get_diagnostics, providing clear context for when to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_methodA
Comprehensive method analysis in a single call.
USAGE: analyze_method(filePath="path/to/File.java", line=N, column=N) OUTPUT: Method info, parameters, exceptions, callers, callees, override info
Combines:
Method info (signature, modifiers, return type)
Parameters with types
Declared exceptions
Incoming calls (who calls this method)
Outgoing calls (what this method calls, in its lambdas included; a call in an anonymous or local class declared in it is a call of that class's member; creating an anonymous class is a call of the superclass constructor its constructor runs)
Override information (super method, overriding methods)
callers.count and callees.count are the exact numbers of distinct callers and callees; each list holds the first maxCallers (default 20) or maxCallees (default 50) of them, callers in search order and callees in source order. meta.totalCount counts both, meta.returnedCount those listed, and meta.truncated is true when either list is cut. A negative maxCallers or maxCallees is INVALID_PARAMETER.
The method is the one the position names, wherever it is declared: its file and line are those of its declaration, and its callees are read there. A method of a class file reports no file, line or callees (there is no source to read them from); its callers are those in the project's source files. callers.potentialMatches holds the references JDT could not confirm, the first maxCallers of them; overrides.potentialMatches the places naming the declaring type, or a subtype, as a supertype that JDT could not confirm. overrides.unresolvedSupertypes, present only when there are any, names each supertype of the declaring type the compiler cannot resolve, with the type whose declaration names it: the method may override a method of one of them.
Use this instead of multiple calls to get_method_at_position + call hierarchy tools.
IMPORTANT: Uses ZERO-BASED coordinates.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file | |
| maxCallees | No | Maximum callees listed (default 50); callees.count counts all | |
| maxCallers | No | Maximum callers listed (default 20); callers.count counts all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the whole burden and discharges it richly: truncation semantics (meta.truncated, totalCount vs returnedCount), INVALID_PARAMETER behavior for negative limits, position-resolution rules (declaration file/line, class-file methods reporting no callees), and what potentialMatches/unresolvedSupertypes mean. This is far beyond what the schema reveals.
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 is well front-loaded (USAGE, OUTPUT, Combines), but the body sprawls across many dense paragraphs, and the potentialMatches explanation and the load_project prerequisite are stranded toward the very end rather than grouped with related material. Much of the length is justified by the absent output schema, but it is not tight.
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 high-complexity tool with no output schema, the description documents the returned structure (counts, meta fields, potentialMatches, unresolvedSupertypes), edge cases, and the sequencing prerequisite. An agent has enough to invoke it correctly and interpret the result without a schema.
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 coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it explains the interaction between callers.count/callees.count and the maxCallers/maxCallees truncation limits, and flags that negative values are INVALID_PARAMETER. The zero-based note merely echoes the 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 opens with a specific verb+resource ("Comprehensive method analysis") and explicitly enumerates what it covers: signature, parameters, exceptions, callers, callees, overrides. It also distinguishes itself from siblings by naming get_method_at_position and the call-hierarchy tools it replaces, so an agent can route without opening any schema.
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 an explicit when-to-use rule ("Use this instead of multiple calls to get_method_at_position + call hierarchy tools") and a hard prerequisite ("Requires load_project to be called first"). It does not state when to prefer the narrower single-purpose siblings instead, so it falls short of a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_typeA
Comprehensive type analysis in a single call.
USAGE: analyze_type(typeName="com.example.Foo") OUTPUT: Type info, members, hierarchy, usage summary, diagnostics
Combines:
Type info (name, kind, modifiers, location)
All members (methods, fields, constructors)
Type hierarchy (superclass, interfaces, subtypes)
Usage summary (instantiations, casts, etc.)
Diagnostics for the type's file
Use this instead of multiple calls to get_type_members + get_type_hierarchy + get_type_usage_summary.
hierarchy.unresolvedSupertypes, present only when there are any, names each supertype the compiler cannot resolve (a missing dependency), as the declaration writes it, with the type whose declaration names it: this type or one of its supertypes. The hierarchy's potentialMatches are places naming the type as a supertype that JDT could not confirm; the usage summary's are uses it could not confirm, the first maxUsages of each category. maxUsages below 0 is INVALID_PARAMETER.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified or simple type name | |
| maxUsages | No | Max usages per category, 0 or more (default 10) | |
| includeUsages | No | Include usage analysis (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: it documents the output shape, discloses that hierarchy.unresolvedSupertypes and potentialMatches are conditionally present, explains what potentialMatches counts and why, and states maxUsages below 0 is INVALID_PARAMETER. These are real behavioral traits beyond the schema.
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?
Front-loaded with purpose, usage, and output, and each section is labeled. The middle paragraphs on unresolvedSupertypes and potentialMatches are dense and slightly tangled, but since there is no output schema they largely earn their place. Minor tightening would help.
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?
No output schema exists, so the description must explain return values, and it does in detail, including conditional fields and the unresolved/uncertain match semantics. It also supplies the prerequisite and parameter error condition, leaving nothing essential for a correct call 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 coverage is 100%, so the baseline is 3. The description adds a validation rule absent from the schema ('maxUsages below 0 is INVALID_PARAMETER') and clarifies the semantics of the potentialMatches/maxUsages listing, giving it an edge over the schema alone.
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+resource ('Comprehensive type analysis') and enumerates exactly what it aggregates: type info, members, hierarchy, usage summary, and diagnostics. It explicitly names the siblings it replaces (get_type_members, get_type_hierarchy, get_type_usage_summary), so an agent can distinguish it from those without opening any schema.
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?
Explicitly routes the agent away from three sibling tools and states the prerequisite 'Requires load_project to be called first.' It gives a concrete usage example. It stops short of a 'when-not' condition (e.g. when a single-purpose tool is preferable), so it is strong but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_cleanupA
Apply a JDT code clean-up to a file and return the rewritten source.
USAGE: apply_cleanup(filePath="path/to/File.java", cleanupId="convert_loops") OUTPUT: changed flag, a label, and the full rewritten source (the file is NOT written — apply the returned source yourself).
Supported cleanupId values: - convert_loops: rewrite index- and iterator-based for loops as enhanced for loops - convert_to_lambda: convert anonymous classes implementing a functional interface to lambdas - pattern_matching_instanceof: use pattern matching for instanceof checks followed by a cast - convert_to_switch_expression: convert assignment/return switch statements to switch expressions - string_concat_to_text_block: convert multi-line string concatenations to text blocks - do_while_rather_than_while: replace while loops that always run once with do-while loops - invert_equals: invert equals() calls so the constant is the receiver (avoids NPEs) - boolean_value_rather_than_comparison: simplify comparisons with boolean literals (x == true -> x) - else_if: collapse else blocks containing a lone if into else-if chains - overridden_assignment: remove initializers that are overwritten before being read
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Path to source file | |
| cleanupId | Yes | Clean-up to apply (e.g. 'convert_loops') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Explicitly states the output format (changed flag, label, full rewritten source) and clarifies that the file is NOT written. This goes beyond the input schema. No annotations are provided, but the description is transparent about the non-destructive nature and output.
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 highly concise and well-structured: a clear purpose statement, a usage example, output description, and an organized list of supported cleanups. Every sentence adds value without 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?
Covers the tool's purpose, parameters, valid values, output, and prerequisite. Missing output schema is compensated by describing the output. Could mention error handling or effect on project state, but overall sufficient for an AI agent.
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 coverage is 100% with basic descriptions. The description adds significant value by enumerating all valid cleanupId values with explanations for each, enriching the parameter semantics beyond the 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 clearly states it applies JDT code clean-ups to a file and returns rewritten source. It lists all supported cleanup IDs, distinguishing it from siblings like apply_quick_fix and convert_anonymous_to_lambda. However, it does not explicitly compare to siblings.
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 a usage example with parameters and a prerequisite ('Requires load_project to be called first'). Does not state when not to use or specify alternatives, but the example and list offer implicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_quick_fixA
Apply a fix by ID.
USAGE: apply_quick_fix(filePath="...", fixId="add_import:java.util.List") OUTPUT: Text edits to apply the fix
Fix ID formats:
add_import:{fullyQualifiedName} - Add an import statement
remove_import:{index} - Remove import at index
add_throws:{exceptionType} - Add throws declaration to method
surround_try_catch:{exceptionType} - Wrap statement in try-catch
IMPORTANT: Uses ZERO-BASED line numbers.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | No | Zero-based line number (required for some fixes like add_throws) | |
| fixId | Yes | The fix ID from get_quick_fixes (e.g., 'add_import:java.util.List') | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries full burden. Discloses actions (applies fix, outputs text edits) and zero-based line numbers. However, ambiguous whether fix is actually applied or just returns edits. Missing error handling or side effects.
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?
Well-structured with summary, usage example, fix format list, and important note. Every sentence adds value, no 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?
Covers purpose, parameters, prerequisites, and output. Could clarify whether fix is applied or only computed, but otherwise complete given no output schema.
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 covers all 3 parameters. Description adds value by explaining fix ID patterns and that line is zero-based and required for some fixes, going beyond schema descriptions.
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 clearly states 'Apply a fix by ID' with a specific verb and resource. It provides fix ID formats and output type, distinguishing it from siblings like get_quick_fixes which only lists fixes.
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?
Includes usage example, fix ID formats, and prerequisite (load_project first). Does not explicitly state when not to use or alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_method_signatureA
Change method signature (parameters, return type, or name) and update all call sites.
Returns text edits for the method declaration and every place that must change. The caller should apply these edits to perform the change.
USAGE: Position on method declaration, provide changes OUTPUT: Edits for the declarations and every place updated
The method changes together with every method it overrides, every method that overrides it and every method a subtype inherits together with it, as rename_symbol renames them: one declaration edit each, each keeping its own parameter names and unchanged parameter types, and every call of any of them. A method related to a method of a class file is refused, naming that method: it cannot change. A place JDT's search reports but cannot confirm as a call, where a type or name does not resolve, is never rewritten: potentialMatches lists every one, to review by hand. An element of an annotation type is refused: it has no parameters; rename it with rename_symbol.
Every place JDT's change-signature refactoring updates is updated: calls, including the arguments of enum constants; Javadoc references (#method(Type) and Type#method(Type) links); a single static import of the method, renamed, or followed by an import of the new name when a member it names keeps the old name; the parameters of each lambda expression implementing the method; and, when a constructor without parameters is given some, its implicit super() calls: super(...) is added to each constructor of a direct subclass that calls it implicitly, and a constructor calling super(...) to each direct subclass that declares none. A call nested in another changed place, such as a chained call, changes within that place's edit.
Each edit replaces a span (type replace, with oldText and newText, or oldSignature and newSignature for a declaration, isDeclaration true) or inserts text (type insert, with line, column, offset and newText). A file's edits come in this order: declarations, the other places the search reports, in source order, lambda expressions, implicit super() calls, static imports.
PARAMETER OPERATIONS:
Add new parameter with default value for existing calls
Remove parameter (will remove from calls)
Rename parameter: give it its new name and, as oldName, the name it has now. Each declaration and lambda expression that names it so takes the new name in its parameter list and every reference to it in its body, a declaration's @param tag naming it too, and a Javadoc reference naming it takes the new name; calls keep their arguments. A declaration or lambda expression that names it otherwise keeps its own name. An oldName that names no parameter of the method is INVALID_PARAMETER.
Reorder parameters (specify all parameters in new order)
A renamed parameter's @param tag and references follow its declaration's or lambda expression's edit, in source order. The edits of the lambda expressions come in source order, file by file, as the other places do.
Every declaration keeps each kept parameter's modifiers and annotations as written. A changed type replaces only the type: the parameter is varargs when the new type ends in ..., and dimensions written after its name are dropped, as JDT does.
Refused as JDT refuses them (INVALID_PARAMETER 'newParameters', with JDT's messages): a blank parameter name or one that is no Java identifier; two parameters of one name; a name the change gives that a method changed with it already gives one of its parameters, naming that method; and a rename that changes what a name refers to: a renamed reference a local variable would capture (in the body, an anonymous class or a lambda expression), or a reference to a field or another variable the renamed parameter would capture. Each collision names the declaration it lies in and its place, as the file is now.
Compile errors that follow from the requested change (a changed return or parameter type breaking a caller, a removed parameter still used) do not refuse it. introducedProblems lists every compile error the applied edits introduce in each file the change edits or reports a place in, and JDT's note for each removed parameter a body still uses, at its first use, also where the code compiles because a field of that name captures it. Each entry gives filePath, line and column, as the file is now, and message, which names the method, field, initializer or type the error lies in ("a lambda expression in" it when it lies in one; an anonymous class by its number, as in Outer$1). Entries come by file, then line and column, then message. introducedProblems is present only when it has an entry.
warnings lists JDT's warnings on the new parameter names, in the order of the parameters, then one for each file holding a method reference that cannot be updated, in the order of methodReferences.
IMPORTANT: Uses ZERO-BASED coordinates.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of method declaration | |
| column | Yes | Zero-based column number | |
| newName | No | New method name (optional, omit to keep current) | |
| filePath | Yes | Path to source file containing the method | |
| newParameters | No | New parameter list. Each item: {name, type, oldName?, defaultValue?}. Order matters. | |
| newReturnType | No | New return type (optional, omit to keep current) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so exhaustively: it discloses what gets rewritten (calls, Javadoc links, lambda parameters, implicit super() calls, static imports), how refusals surface (INVALID_PARAMETER with JDT messages), that compile errors do not refuse but appear in introducedProblems/warnings, that potentialMatches holds unconfirmed places, edit ordering, and ZERO-BASED coordinates. This is far richer than typical behavioral disclosure.
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?
Purpose, USAGE, and OUTPUT are correctly front-loaded, which helps orientation. However the body is extraordinarily long with dense, sometimes convoluted prose (e.g., the multi-clause override/inheritance sentence), and the sheer size makes it harder to scan than a complex refactoring tool strictly requires.
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?
There is no output schema, yet the description fully explains the return shape (text edits with replace/insert types, isDeclaration, oldText/newText, line/column/offset, per-file ordering) and the auxiliary result fields. For a 6-parameter mutation tool, nothing an agent needs to call it correctly 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 coverage is 100% (baseline 3), but the dedicated 'PARAMETER OPERATIONS' section adds real meaning beyond the schema: how to add a parameter with a defaultValue, remove one, rename via oldName (including how references and @param tags follow), and reorder, plus the INVALID_PARAMETER conditions. That exceeds what the schema's field descriptions convey.
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?
Opens with a specific verb+resource+scope: 'Change method signature (parameters, return type, or name) and update all call sites.' It distinguishes itself from the sibling rename_symbol (which it explicitly routes annotation-type elements to), so an agent can tell them apart without opening either schema.
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 'USAGE: Position on method declaration, provide changes' line plus the prerequisite 'Requires load_project to be called first' give clear invocation context, and it names rename_symbol as the alternative for annotation-type elements. It stops short of a full when/when-not contrast against refactoring siblings like extract_method or inline_method.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_anonymous_to_lambdaA
Convert an anonymous class implementing a functional interface to a lambda expression.
Returns the text edit needed to convert the anonymous class to a lambda. The caller should apply this edit to perform the conversion.
USAGE: Position cursor on the 'new' keyword of the anonymous class OUTPUT: Edit to replace anonymous class with lambda
IMPORTANT: Uses ZERO-BASED coordinates. REQUIREMENTS: The anonymous class must implement a functional interface (exactly one abstract method).
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of anonymous class (on 'new' keyword) | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes output as a text edit to be applied, zero-based coordinates, and prerequisite. No annotations exist, so description carries the burden and does so well, though could mention side effects.
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?
Structured with clear sections (USAGE, OUTPUT, IMPORTANT, REQUIREMENTS), concise and front-loaded with essential information.
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 usage, output type, coordinate system, prerequisites, and requirements. No output schema needed as return type is described.
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 coverage is 100%, but description adds detail like zero-based coordinates and positioning on 'new' keyword, enhancing meaning beyond 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 clearly states the tool converts an anonymous class to a lambda expression, specifying verb, resource, and result. It distinguishes from sibling refactoring 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 usage instructions (cursor on 'new' keyword), requirements (functional interface), and prerequisite (load_project). Lacks explicit when-not-to-use, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_and_fixA
Diagnose a file and compute the quick-fix edits in one call: runs diagnostics, resolves the available fixes per fixable problem, and returns the top fix's edits for each, combined as editsByFile.
USAGE: diagnose_and_fix(filePath="path/to/File.java") OUTPUT: problems (each with its chosen fix when one exists) and editsByFile with the computed edits. NOTHING is written - apply the returned edits yourself.
A file with no fixable diagnostics returns empty problems/edits.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that no changes are written ('NOTHING is written - apply the returned edits yourself'), and explains the output structure (problems, editsByFile) and behavior for files with no fixable diagnostics. No annotations are provided, so the description fully carries the transparency burden.
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 concise and well-structured: a purpose sentence, a usage line, an output description, a crucial note about not writing, and a condition for empty results. Every sentence adds value without 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 the single parameter, no output schema, and no annotations, the description fully covers the tool's input, output, behavior, and prerequisites. It explains the output format and the condition for empty results, leaving no significant gaps.
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 single parameter 'filePath' has a minimal schema description. The description adds context: it shows the usage format, confirms the file is a source file, and references the prerequisite that load_project must be called. This adds value beyond the schema alone.
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 clearly states the tool diagnoses a file and computes quick-fix edits in one call, specifying the verb (diagnose and fix) and resource (file). It distinguishes from siblings like get_diagnostics and apply_quick_fix by combining both steps.
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 a usage example and explicitly states the prerequisite 'load_project' must be called first. It also clarifies that the tool does not write edits. However, it does not explicitly contrast with alternatives like get_quick_fixes+apply_quick_fix, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
encapsulate_fieldA
Encapsulate a field: generate a getter/setter pair and rewrite all direct accesses (in this and other files) to go through them.
USAGE: Position on the field name; optionally name the accessors. OUTPUT: editsByFile with all required text edits; warnings from JDT's own condition checking, by the place each names (file, then position; those naming one place in JDT's order, those naming none last). Edits are returned as text - apply them yourself.
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of the field declaration | |
| column | Yes | Zero-based column number (on the field name) | |
| filePath | Yes | Path to source file containing the field | |
| getterName | No | Getter name (default: getX for field x) | |
| setterName | No | Setter name (default: setX for field x) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that edits are returned as text and must be applied by the caller ('apply them yourself'), that warnings come from JDT's condition checking, and that coordinates are zero-based. It lacks permission/scope or reversibility notes, so not a 5.
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 labeled sections (USAGE, OUTPUT, IMPORTANT) front-load the purpose and make scanning easy with zero filler sentences. The OUTPUT paragraph is dense but earns its place by describing a structure with no output 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 mutation/refactoring tool with no annotations and no output schema, the description covers the critical gaps: output shape (editsByFile, text edits, warnings), the prerequisite (load_project), and the coordinate convention. It could say more about cross-file side effects, but the essentials are present.
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 coverage is 100%, so the schema already documents all five parameters including getterName/setterName defaults. The description only restates 'position on the field name' and 'optionally name the accessors,' adding no syntax or format detail beyond the schema. Baseline 3 is appropriate.
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 gives a specific verb and resource ('Encapsulate a field') and immediately defines the mechanics: 'generate a getter/setter pair and rewrite all direct accesses (in this and other files) to go through them.' This clearly distinguishes it from siblings like rename_symbol, extract_method, or inline_method.
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?
'USAGE: Position on the field name; optionally name the accessors' tells the agent how to invoke it, and 'Requires load_project to be called first' gives a concrete prerequisite. It does not name a when-not condition or an explicit alternative refactoring, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_constantA
Extract an expression into a static final constant at class level.
Returns the text edits needed to extract the expression. The caller should apply these edits to perform the extraction.
USAGE: Select expression by providing start and end positions OUTPUT: Constant declaration and replacement edits
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| endLine | Yes | Zero-based end line of expression | |
| filePath | Yes | Path to source file | |
| endColumn | Yes | Zero-based end column of expression | |
| startLine | Yes | Zero-based start line of expression | |
| startColumn | Yes | Zero-based start column of expression | |
| constantName | Yes | Name for the constant (should be UPPER_SNAKE_CASE) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool returns text edits and that the caller must apply them, implying no direct modification. It also mentions zero-based coordinates. However, it lacks details on error handling, permissions, or side effects, which limits transparency.
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 concise with a clear structure: purpose, return value, usage, important notes, and prerequisite. Every sentence is necessary and informative, making it highly efficient.
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 complexity (6 parameters, no output schema, no annotations), the description covers the essential aspects: what it does, how to use it, and what it returns. It could mention error conditions or coordinate validation, but overall it is fairly complete.
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 coverage is 100%, so baseline is 3. The description adds no new parameter meaning beyond what the schema already provides (e.g., zero-based coordinates, constant name convention). It does not compensate for any missing schema details.
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 clearly states the tool's purpose: 'Extract an expression into a static final constant at class level.' This distinguishes it from sibling tools like extract_variable (local variable) or extract_method (method), making its purpose specific and unambiguous.
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 provides explicit usage guidance: 'USAGE: Select expression by providing start and end positions' and notes the prerequisite 'Requires load_project to be called first.' While it doesn't discuss when not to use the tool, it offers sufficient context for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_interfaceA
Extract an interface from a class containing selected public methods.
Returns the text for a new interface file and edits to add 'implements' clause to the original class. The interface imports each type its signatures name that it cannot see unimported, a member type by its canonical name (import pkg.Outer.Inner).
USAGE: Position on class, provide interface name, optionally specify methods OUTPUT: Interface file content and class modification edit
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of class declaration | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file containing the class | |
| methodNames | No | Specific method names to include (default: all public non-static methods) | |
| interfaceName | Yes | Name for the new interface |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses that a new interface file is produced and that the original class is edited with an 'implements' clause, plus import-handling rules and zero-based coordinates. It is slightly ambiguous about whether the class edit is applied automatically or merely returned.
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?
Purpose is front-loaded, then cleanly segmented with USAGE, OUTPUT, and IMPORTANT markers. The import-handling sentence is somewhat dense but earns its place by describing real behavior.
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 refactoring tool with no annotations and no output schema, the description covers output shape ('Interface file content and class modification edit'), prerequisite, and coordinate convention. Only the apply-vs-return ambiguity for the class edit keeps it from being fully complete.
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 coverage is 100%, so the schema already documents all five parameters including the default for methodNames. The description reinforces positioning and the default but adds no syntax or format detail beyond the schema, making the baseline 3 appropriate.
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+resource ('Extract an interface from a class containing selected public methods') and distinguishes itself from refactoring siblings like extract_method and extract_superclass. An agent can tell exactly what artifact is produced without opening the schema.
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 USAGE line gives concrete positioning ('Position on class, provide interface name, optionally specify methods') and the prerequisite 'Requires load_project to be called first' is spelled out. It does not name an explicit alternative refactoring to choose over this one, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_methodA
Extract a code block into a new method.
USAGE: Select code range, provide method name OUTPUT: Text edits for method declaration and call site
The tool analyzes the selected code to:
Determine which variables become parameters
Determine return type based on variables modified
Generate appropriate method signature
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| endLine | Yes | Zero-based end line of code to extract | |
| filePath | Yes | Path to source file | |
| endColumn | Yes | Zero-based end column | |
| startLine | Yes | Zero-based start line of code to extract | |
| methodName | Yes | Name for the new method | |
| startColumn | Yes | Zero-based start column |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains that the tool determines parameters and return type, generates method signature and call site, and emphasizes zero-based coordinates. This sufficiently discloses behavioral traits, though it could mention error handling or side effects.
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 concise and well-structured: a one-line summary, clear USAGE and OUTPUT labels, bullet points for analysis details, and a prominent note about zero-based coordinates. Every sentence serves a purpose, and key information 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?
For a refactoring tool with 6 required parameters and no output schema, the description covers usage, output format, behavioral analysis, coordinate system, and prerequisites. It lacks details on error conditions or return value structure, but overall it is sufficiently complete for correct tool invocation.
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?
Input schema coverage is 100%, so baseline is 3. The description adds context by explaining how parameters (e.g., selection range and method name) are used in the analysis and output generation. This goes beyond the schema's bare descriptions, providing deeper semantic meaning.
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 clearly states 'Extract a code block into a new method,' which is a specific verb+resource combination. It distinguishes from sibling tools like extract_constant or extract_variable by focusing on method extraction. Additional details about analyzing variables and return types reinforce the purpose.
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 provides a usage line ('Select code range, provide method name') and a prerequisite ('Requires load_project to be called first'). However, it does not offer guidance on when to use this tool vs. alternatives like extract_constant or inline_method, nor does it mention conditions to avoid using it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_superclassA
Extract a new superclass from a class: the member at the position moves up into a newly created superclass, and the class extends it.
USAGE: Position on the member to extract; provide the new superclass name. OUTPUT: createdFiles carries the new superclass file content; editsByFile carries the source class's edits; warnings, present only when there is one, JDT's findings from its condition checking, by the place each names (file, then position; those naming one place in JDT's order, those naming none last). Nothing is written - create the file and apply the edits yourself.
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of the member declaration | |
| column | Yes | Zero-based column number (on the member name) | |
| filePath | Yes | Path to source file containing the member | |
| superclassName | Yes | Name for the new superclass |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure: it explains that nothing is written and the caller must create the file and apply edits, details the output fields (createdFiles, editsByFile, warnings), and gives formatting rules for warnings. This is exactly the kind of side-effect and result-shape information an agent needs beyond structured fields.
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 front-loaded with its core purpose and uses clear USAGE/OUTPUT/IMPORTANT sections. However, the warnings-ordering sentence is dense and awkwardly phrased ('by the place each names... those naming one place in JDT's order, those naming none last'), which slightly reduces readability.
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 absence of annotations and an output schema, the description is complete enough: it covers prerequisites, invocation, coordinate system, output structure, and side effects. An agent has everything needed to call and interpret 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 100%, so the input schema already documents all four parameters, including zero-based coordinates. The description adds only minor emphasis ('Position on the member to extract', 'provide the new superclass name') and repeats the zero-based warning already present in the schema, so it does not add much semantic value beyond the 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 states a precise verb and resource: 'Extract a new superclass from a class', and describes the transformation (member moves up, class extends new superclass). This clearly differentiates it from sibling refactorings like extract_method, pull_up, and extract_interface.
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 invocation guidance: 'Position on the member to extract; provide the new superclass name', and states a prerequisite ('Requires load_project to be called first'). It does not, however, say when to prefer this tool over alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_variableA
Extract an expression at the given position into a local variable.
Returns the text edits needed to extract the expression. The caller should apply these edits to perform the extraction.
USAGE: Select expression by providing start and end positions OUTPUT: Variable declaration and replacement edits
An expression of type void, or a null literal alone, is refused (INVALID_PARAMETER): no variable can be declared for it.
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| endLine | Yes | Zero-based end line of expression | |
| filePath | Yes | Path to source file | |
| endColumn | Yes | Zero-based end column of expression | |
| startLine | Yes | Zero-based start line of expression | |
| startColumn | Yes | Zero-based start column of expression | |
| variableName | No | Name for the new variable (optional, will suggest if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the tool returns text edits rather than applying them ('The caller should apply these edits'), names a specific failure mode with its error code (void expression or null literal -> INVALID_PARAMETER), and flags the zero-based coordinate contract. It stops short of describing edge cases like overlapping/invalid selections or multi-edit ordering, so it is not fully exhaustive.
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 block is front-loaded with the core purpose and uses labeled sections (USAGE, OUTPUT, IMPORTANT) that scan quickly. There is mild redundancy between 'Returns the text edits needed to extract the expression' and 'OUTPUT: Variable declaration and replacement edits', which keeps it from a 5.
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 6-parameter mutation-style refactoring tool with no annotations and no output schema, the description covers the essentials: output shape, caller responsibility, error behavior, coordinate system, and the load_project prerequisite. The main omission is any statement of sibling alternatives, which is a routing gap rather than an invocation gap.
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 100%, so every parameter including the optional variableName is already documented in the schema. The description's zero-based coordinate warning and 'select expression by start/end positions' merely restate what the schema fields already say, adding no new parameter-level meaning beyond the baseline.
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 first sentence gives a specific verb (Extract) and resource (an expression at a given position into a local variable), which is concrete and actionable. However, it never distinguishes itself from the closely related siblings extract_method and extract_constant, so the agent must infer the boundary from the name 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 'USAGE' line tells the agent how to invoke it (select by start/end positions) and the description states the prerequisite 'Requires load_project to be called first', which is useful. But there is no guidance on when to prefer this over extract_method or extract_constant, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_affected_testsA
Find the test methods that exercise a symbol, directly or transitively.
USAGE: find_affected_tests(filePath="path/to/File.java", line=10, column=5) OUTPUT: Test methods (JUnit 4/5, TestNG) from which the symbol is reachable, with locations - the set of tests to run after changing it.
The caller walk follows calls, instantiations, field accesses, and override declarations (a test calling through an interface or superclass covers the implementation). Non-test intermediate methods are walked through but not reported. Disabled tests are included with disabled=true (they cover the code but will not run). A symbol no test reaches returns an empty set.
Supports project methods, fields, and types as the target symbol.
Options:
maxResults: cap the reported list (default 100)
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | File containing the symbol | |
| maxResults | No | Maximum test methods to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully covers behavioral traits: the caller walk mechanism, inclusion of disabled tests, handling of unreachable symbols, and support for methods, fields, types. It transparently describes what happens in various scenarios.
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 well-structured with clear sections: purpose, usage, output, details, options, prerequisite. It is concise yet comprehensive, using bullet points and plain language effectively.
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 no output schema, the description thoroughly explains the output format, including disabled tests and empty sets. It covers all necessary aspects of the tool's operation, making it complete and useful.
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 coverage is 100%, giving baseline 3. The description adds value by providing a usage example, explaining the coordinate parameters, and clarifying the maxResults option. This enhances understanding beyond the 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 clearly states the tool's purpose: 'Find the test methods that exercise a symbol, directly or transitively.' It provides a usage example and distinguishes itself from siblings like 'find_tests' by focusing on affected tests, not all tests.
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 includes a prerequisite ('Requires load_project to be called first') and explains the context ('the set of tests to run after changing it'). It does not explicitly state when not to use it, but it provides clear guidance for intended use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_annotation_usagesA
Find all usages of an annotation type in the project.
JDT-UNIQUE: This fine-grained search is not available in LSP.
USAGE: Provide fully qualified annotation name as typeName
OUTPUT: All locations where the annotation is applied
Examples:
find_annotation_usages(typeName="org.springframework.beans.factory.annotation.Autowired")
find_annotation_usages(typeName="org.junit.jupiter.api.Test")
find_annotation_usages(typeName="javax.persistence.Entity")
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified annotation type name (e.g., 'org.springframework.beans.factory.annotation.Autowired') | |
| maxResults | No | Maximum results to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It explains output semantics well, including the special `potentialMatches` field, its relation to unresolved types, and that those matches are never counted as real results. It could add more on permissions or result format, but the unusual search behavior is covered.
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 front-loaded with purpose and usage, then examples, then edge-case output behavior, and finally the prerequisite. The `potentialMatches` paragraph is somewhat wordy but earns its place because no output schema exists to explain that field.
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 no annotations, no output schema, and a simple search operation, the description is nearly complete. It covers the input requirement, output locations, the special `potentialMatches` semantics, and the `load_project` prerequisite. It omits only minor return-detail or pagination specifics already implied by `maxResults`.
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 100%, so the schema already documents both `typeName` and `maxResults`. The description reinforces that `typeName` must be fully qualified and gives multiple examples, but this largely duplicates the schema's own example and does not add syntax or format details beyond it.
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: finding all usages of an annotation type in the project. It also explicitly notes a differentiator, JDT-UNIQUE, indicating why this search is distinct from LSP-based sibling tools. An agent can identify the tool's purpose without opening the schema.
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 clear usage context: provide a fully qualified annotation name as `typeName`, and load_project must be called first. It does not explicitly say when not to use this tool or name an alternative sibling like find_references, but the annotation-specific scope is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_castsA
Find all casts to a type ((Foo) x expressions).
JDT-UNIQUE: This fine-grained search is not available in LSP.
USAGE: Provide fully qualified type name OUTPUT: All locations where casting to this type occurs
Useful for:
Identifying unsafe downcasts
Finding refactoring opportunities (replace cast with polymorphism)
Understanding type conversion patterns
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified type name to find casts to | |
| maxResults | No | Maximum results to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it documents the OUTPUT shape, the tricky potentialMatches semantics (possible-but-unconfirmed matches, never counted as results), and the load_project prerequisite. It does not explicitly state read-only/safety behavior, but 'find' plus the read-only nature is strongly implied.
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?
Front-loaded with the one-line purpose, then clearly sectioned USAGE/OUTPUT/Useful-for blocks. The potentialMatches paragraph is dense but earns its place by clarifying an otherwise confusing output edge case. Minor redundancy with the schema keeps it from a 5.
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?
With no output schema, the description correctly supplies return-value semantics, including the potentialMatches structure and its count/locations fields, and states the load_project prerequisite. An agent has everything needed to invoke and interpret results 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 100%, so both typeName and maxResults are already documented in the schema. The description's 'Provide fully qualified type name' only restates the schema's typeName description and says nothing about maxResults, so it adds no meaning beyond the structured fields. Baseline 3 is appropriate.
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+resource ('Find all casts to a type') and even supplies the syntactic form ((Foo) x). It positions itself against the broader toolset by noting the search is fine-grained and unavailable in LSP, so an agent can distinguish it from siblings like find_references or find_instanceof_checks.
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 clear when-to-use context via the 'Useful for' list (unsafe downcasts, refactoring, conversion patterns) and a hard prerequisite ('Requires load_project to be called first'). It stops short of naming alternative sibling tools or stating when not to use it, so it is context-rich but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_catch_blocksA
Find all catch blocks for an exception type (catch(ExceptionType e)).
JDT-UNIQUE: This fine-grained search is not available in LSP.
USAGE: Provide fully qualified exception type name as typeName
OUTPUT: All catch blocks that handle this exception type
Useful for:
Understanding exception handling patterns
Finding all handlers for a specific exception
Exception handling analysis and refactoring
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified exception type name (e.g., 'java.io.IOException') | |
| maxResults | No | Maximum results to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely succeeds: it discloses the JDT-unique nature, the output shape, the load_project precondition, and a nuanced explanation of potentialMatches (unconfirmed matches, counted/listed separately). It does not cover result truncation behavior or performance limits, so a small gap remains.
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?
Core purpose is front-loaded, and labeled sections (USAGE, OUTPUT, Useful for) make it scannable. The 'Useful for' bullets are somewhat redundant with the opening sentence, and the potentialMatches paragraph is dense, but nothing is off-topic.
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?
With no output schema and no annotations, the description compensates by explaining the return content and the special potentialMatches field, plus the load_project prerequisite. It is largely complete for a read-only search tool, missing only edge details like result capping behavior.
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 100% for both parameters, so the schema already documents typeName and maxResults with examples and defaults. The description's 'USAGE' line re-states the typeName format but adds no syntax or constraint detail beyond the schema, so the baseline of 3 applies.
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 ('Find all catch blocks for an exception type') and clarifies scope with the '(catch(ExceptionType e))' signature form. It is unmistakable what the tool does, though it never names a sibling (e.g. find_throws_declarations) to distinguish itself.
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 a prerequisite ('Requires load_project to be called first') and a concrete usage instruction ('Provide fully qualified exception type name as typeName'), plus a list of intended scenarios. It stops short of explicit when-not-to-use or alternative-tool routing, so it misses the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_circular_dependenciesA
Detect cycles in packages.
USAGE: find_circular_dependencies() USAGE: find_circular_dependencies(packageFilter="com.example") OUTPUT: List of circular dependency cycles
Uses Tarjan's SCC algorithm to efficiently detect all cycles. Reports cycle paths and affected packages.
maxCycleLength, the most packages a reported cycle joins, is 2 or more (a cycle joins at least two packages); below 2 is INVALID_PARAMETER.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| packageFilter | No | Package prefix to analyze (default: all project packages) | |
| maxCycleLength | No | Maximum cycle length to report, 2 or more (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the algorithm (Tarjan's SCC), what the output contains (cycle paths and affected packages), and the specific failure mode for maxCycleLength < 2 (INVALID_PARAMETER). It omits scale/performance characteristics and behavior when the project has no cycles.
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?
Front-loaded with the verb+resource, then labeled USAGE/OUTPUT blocks and a prerequisite line — easy to scan. Minor redundancy between "Detect cycles" and "circular dependency cycles," but nothing wasted.
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?
No output schema exists, and the description compensates by describing the return value (list of cycles with paths and affected packages). Combined with the prerequisite and validation rule, an agent has what it needs; only edge-case behavior (empty results, project size limits) is unspecified.
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 coverage is 100%, so baseline is 3, but the description adds real semantics beyond the schema: what maxCycleLength actually bounds ("the most packages a reported cycle joins") and a usage example showing packageFilter as a prefix. This goes past restating field descriptions.
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: detect cycles / circular dependency cycles in packages. The purpose is unambiguous and clearly distinct from graph-oriented siblings like get_dependency_graph or find_unused_code, though it never names those alternatives explicitly.
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 two concrete invocation patterns (bare and with packageFilter) and a hard prerequisite: "Requires load_project to be called first." It does not state when to prefer this over e.g. get_dependency_graph, so no 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_field_writesA
Find all write accesses (mutations) to a field.
USAGE: Position cursor on a field declaration or reference OUTPUT: List of locations where the field is modified
IMPORTANT: Uses ZERO-BASED coordinates.
Unlike find_references which returns all usages, this returns only locations where the field value is changed (assignments, increments, etc). Useful for data flow analysis and understanding state mutations.
maxResults outside 0 to 1000 is INVALID_PARAMETER.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file | |
| maxResults | No | Max write locations to return, 0 to 1000 (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it documents the zero-based coordinate convention, the INVALID_PARAMETER failure mode for out-of-range maxResults, and the unconfirmed-match semantics. It stops short of describing result ordering or whether the declaration site is included, which keeps it from a 5.
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?
Well-structured with USAGE/OUTPUT/IMPORTANT labels and the core purpose front-loaded. The potentialMatches paragraph is dense and worth its length since no output schema exists, though the definition is on the longer side.
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?
No output schema exists and no annotations are present, yet the description covers the return shape ('List of locations'), the conditional potentialMatches field with its count/locations substructure, prerequisites, and error semantics. It is complete for a position-based search tool of this complexity.
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 coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: it re-emphasizes zero-based coordinates, states the maxResults valid range and the exact error for violations, and describes the potentialMatches structure that the schema does not cover.
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?
Opens with a specific verb+resource ('Find all write accesses (mutations) to a field') and explicitly contrasts itself with the sibling find_references ('this returns only locations where the field value is changed'). An agent can distinguish it from the reference-finding tools without opening a schema.
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 an explicit precondition ('Position cursor on a field declaration or reference'), a dependency ('Requires load_project to be called first'), an alternative and the condition selecting it ('Unlike find_references which returns all usages'), and motivation ('useful for data flow analysis'). Nothing needed for correct invocation is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_implementationsA
Find implementations of an interface or extensions of a class.
USAGE: Position on a type (interface or class), find all implementors/subclasses OUTPUT: List of implementing/extending types with locations
IMPORTANT: Uses ZERO-BASED coordinates.
potentialMatches are the places naming the type, or one of its subtypes, as a supertype that JDT could not confirm: the class declaring each may be an implementation, and, for a method, may override it.
maxResults outside 0 to 1000 is INVALID_PARAMETER.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file | |
| maxResults | No | Max implementations to return, 0 to 1000 (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: it explains zero-based coordinates, maxResults validation ('outside 0 to 1000 is INVALID_PARAMETER'), the prerequisite load_project, and detailed semantics of potentialMatches including when it is present and why matches may be unconfirmed.
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 front-loaded with purpose, usage, and output, which is good. However, the explanation of potentialMatches is repetitive: it appears once as 'potentialMatches are the places...' and again in a longer paragraph, without enough added clarity to justify the duplication.
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 4-parameter tool with no output schema and no annotations, the description supplies everything needed: purpose, usage, output summary, coordinate convention, parameter constraints, prerequisite, and the special potentialMatches behavior. Nothing essential 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 100%, so the baseline is 3. The description adds meaning beyond the schema by specifying that maxResults outside 0 to 1000 is an INVALID_PARAMETER error and by reinforcing the zero-based coordinate convention for line and column.
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: 'Find implementations of an interface or extensions of a class.' This is distinct from sibling tools like find_references or get_type_hierarchy, and the agent can identify the operation directly from the first sentence.
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 provides clear invocation context with 'USAGE: Position on a type (interface or class), find all implementors/subclasses' and a prerequisite: 'Requires load_project to be called first.' It does not explicitly name alternatives or when-not conditions, but the context is sufficient for correct use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_instanceof_checksA
Find all instanceof checks for a type (x instanceof Foo).
JDT-UNIQUE: This fine-grained search is not available in LSP.
USAGE: Provide fully qualified type name OUTPUT: All locations where instanceof checks against this type occur
Useful for:
Identifying type checking patterns
Finding polymorphism opportunities (replace instanceof with virtual dispatch)
Understanding type discrimination logic
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified type name to find instanceof checks for | |
| maxResults | No | Maximum results to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses the OUTPUT shape, the load_project prerequisite, and a detailed semantics note that potentialMatches are unresolved/unconfirmed matches never counted or listed as results. It omits any statement about truncation behavior relative to maxResults, keeping it just under 5.
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 core purpose, uniqueness note, usage, and output are front-loaded before the longer potentialMatches explanation. The potentialMatches paragraph is verbose for the value it adds, but every part is relevant and no sentence is filler.
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?
There is no output schema, so the description correctly supplies the return semantics: where instanceof occurrences are reported and how the anomalous potentialMatches collection is structured and counted. Combined with the prerequisite and input format, an agent has everything needed to call and interpret this tool.
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 100%, so both typeName and maxResults are already documented in the schema. The description only restates 'fully qualified type name' for typeName and says nothing new about maxResults, so the baseline 3 applies.
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 precise verb+resource ('Find all instanceof checks for a type') and even disambiguates the syntax being matched with the example '(x instanceof Foo)'. The 'JDT-UNIQUE: not available in LSP' note plus the narrow construct focus clearly separates it from siblings like find_casts, find_type_instantiations, and find_references.
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 a concrete prerequisite ('Requires load_project to be called first') and an input instruction ('Provide fully qualified type name'), plus a useful-for list that implies when the tool applies. It does not explicitly name alternative tools (e.g., find_casts vs find_instanceof_checks) or state when NOT to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_large_classesA
Find classes that exceed size thresholds.
USAGE: find_large_classes(maxMethods=20, maxFields=10, maxLines=300) OUTPUT: List of classes exceeding any threshold with their metrics
Default thresholds:
maxMethods: 20 methods
maxFields: 10 fields
maxLines: 300 lines
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| maxLines | No | Maximum lines before flagging (default 300) | |
| maxFields | No | Maximum fields before flagging (default 10) | |
| maxMethods | No | Maximum methods before flagging (default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries the burden. It mentions output is a list of classes with metrics but doesn't disclose if it's read-only or any side effects. Basic information is present but additional behavioral details are missing.
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?
Concise and well-structured, with the main purpose upfront. The usage example and default thresholds are helpful without being verbose.
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 no output schema, the description adequately describes output format and prerequisites. Could mention error handling, but overall complete for a straightforward query tool.
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 coverage is 100%, and description reiterates defaults and meanings, adding little beyond the schema. Baseline 3 applies as description does not significantly enhance parameter understanding.
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 clearly states the tool finds classes exceeding size thresholds, with specific metrics (methods, fields, lines). Among siblings like find_unused_code, this tool stands out for its focus on size metrics.
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 a usage example with default thresholds and explicitly states 'Requires load_project to be called first.' However, it does not specify when to use this tool over other analysis tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_method_referencesA
Find all method reference expressions (Foo::bar lambda syntax).
JDT-UNIQUE: This fine-grained search is not available in LSP.
USAGE: Position on a method, or provide method details OUTPUT: All locations where the method is used as a method reference
Useful for:
Understanding functional programming patterns
Finding lambda-style usages of methods
Refactoring analysis
IMPORTANT: Uses ZERO-BASED coordinates.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of the method | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file containing the method | |
| maxResults | No | Maximum results to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the zero-based coordinate system, the load_project prerequisite, and detailed semantics of the potentialMatches field (count is exact, locations listed, never counted as results). Output format and prerequisite are covered; return pagination/interaction with maxResults is left implicit.
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?
Front-loads the purpose and the JDT-UNIQUE differentiator, which is the highest-value information. The potentialMatches paragraph is long and the 'Useful for' bullet list largely restates an already-clear purpose, adding mild bloat, but the important content is well ordered.
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?
Despite having no output schema and no annotations, the description covers what the tool returns (all reference locations plus potentialMatches), the entry coordinate convention, and the required prior step. An agent has everything needed to call and interpret this 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 100%, so line, column, filePath and maxResults are already documented with zero-based notes. The description restates the zero-based constraint and the position-or-details pattern but adds no syntax beyond what the schema provides, so the baseline 3 applies.
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 a precisely-scoped resource ('method reference expressions (Foo::bar lambda syntax)'), which distinguishes it from the sibling find_references. The explicit JDT-UNIQUE note further tells the agent this fine-grained search is not available elsewhere, removing ambiguity about which tool to pick.
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 concrete invocation context ('Position on a method, or provide method details') and a hard prerequisite ('Requires load_project to be called first'). It does not, however, name an explicit alternative tool or state when-not-to-use it versus find_references, so it stops just short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_naming_violationsA
Check code against standard Java naming conventions.
USAGE: find_naming_violations(filePath="path/to/File.java") OUTPUT: List of naming convention violations
Conventions checked:
Classes/interfaces/enums: PascalCase
Methods: camelCase
Fields: camelCase
Constants (static final): UPPER_SNAKE_CASE
Parameters: camelCase
If filePath is omitted, scans all project files.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | No | File to check (omit to scan all files) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses the tool's behavior: it checks naming conventions and lists violations. It enumerates the specific conventions checked. There's no mention of destructive actions, as it is a read-only analysis.
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 well-structured with a brief summary, usage pattern, output expectation, list of conventions, and additional notes. Every sentence adds value, and it is concise without being terse.
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 no output schema, the description adequately explains output as a list of violations. It covers the conventions checked, parameter behavior, and prerequisites, making it complete for an AI agent to understand and use 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 coverage is 100% with one parameter. The description adds value beyond the schema by providing a usage example and clarifying that omitting filePath scans all project files, which is not immediately clear from the schema description alone.
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 explicitly states 'Check code against standard Java naming conventions,' with a clear verb and resource. It distinguishes itself from siblings by focusing specifically on naming violations, a unique task among the listed 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?
The description provides a usage example, explains the optional filePath parameter, and mentions the prerequisite 'Requires load_project to be called first.' It lacks explicit when-not-to-use or alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_possible_bugsA
Find possible bugs and code quality issues.
USAGE: find_possible_bugs() USAGE: find_possible_bugs(filePath="path/to/File.java") OUTPUT: List of potential issues
Detects:
Null pointer risks (dereferencing potentially null values)
Resource leaks (unclosed streams, connections)
Empty catch blocks
Comparison issues (== on objects instead of equals)
Synchronization issues (sync on String)
severity (optional, compared case-insensitively): high, medium or low keeps the issues of that severity; all (the default) keeps every issue. Any other value is rejected with INVALID_PARAMETER.
A filePath naming no source file of the project is FILE_NOT_FOUND.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | No | Optional: specific file to check (default: all files) | |
| severity | No | Filter by severity, case-insensitive: high, medium, low or all (default: all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely delivers: it discloses error semantics (INVALID_PARAMETER for bad severity, FILE_NOT_FOUND for an unknown file), the default scope (all files), and the sequencing requirement (load_project first). It is silent on result granularity and runtime cost, which are secondary for a read-only analysis tool.
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?
Front-loaded with purpose, then detection categories, then parameter and error details in clearly delimited sections. The two near-duplicate USAGE lines and the OUTPUT line add slight padding, but nothing is misleading or wasted at length.
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 two-param, no-output-schema, no-annotation tool, the description covers purpose, scope, prerequisites, and error paths. The main gap is that the shape of the returned issue list (file, line, message fields) is not characterized, which an agent would want before rendering results.
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 coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: severity is compared case-insensitively, 'all' is the default, and any unrecognized value is rejected with INVALID_PARAMETER. The filePath semantics (default all files, must name a project source file) are also spelled out.
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+resource ('Find possible bugs and code quality issues') and enumerates exactly which bug classes it detects (null pointer risks, resource leaks, empty catch blocks, comparison issues, synchronization issues). This clearly separates it from siblings like validate_syntax, find_unused_code, and find_unreachable_code, which cover different concerns.
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 two concrete invocation examples (whole-project vs single file) and a hard prerequisite ('Requires load_project to be called first'). It does not explicitly name alternative tools for overlapping concerns such as syntax validation or unused-code detection, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_referencesA
Find all references to a symbol across the project.
USAGE: Position on symbol, find all usages OUTPUT: List of reference locations with context
The references of a symbol of a class file, such as a JDK method, are those in the project's source files. A position on a name the compiler cannot resolve has no symbol: SYMBOL_NOT_FOUND. maxResults outside 0 to 1000 is INVALID_PARAMETER.
IMPORTANT: Uses ZERO-BASED coordinates.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file | |
| maxResults | No | Max references to return, 0 to 1000 (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses the SYMBOL_NOT_FOUND error for unresolvable names, the INVALID_PARAMETER condition for maxResults, the zero-based coordinate convention, and the subtle semantics of potentialMatches (unconfirmed matches never counted as results). The load_project prerequisite is also stated, which is essential operational context.
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?
Front-loaded purpose then USAGE/OUTPUT headers make it scannable, and the prerequisite sits at the end where it is easy to catch. The potentialMatches paragraph is dense and somewhat long, but each clause explains a genuinely non-obvious return behavior, so the length is largely earned.
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?
There is no output schema, so the description must explain returns, and it does: 'List of reference locations with context' plus the detailed potentialMatches breakdown. Combined with error conditions and the load_project prerequisite, an agent has enough to call and interpret this tool correctly; only alternative-tool routing is absent.
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 coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it reinforces the zero-based convention as an 'IMPORTANT' caveat and restates the maxResults validity window (0-1000) as an error condition rather than just a default.
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+resource: 'Find all references to a symbol across the project.' An agent understands this is a usage-search tool. However, it does not distinguish itself from near-siblings like find_method_references or find_annotation_usages, so the boundary is inferred from the name rather than stated.
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?
'USAGE: Position on symbol, find all usages' implies you must first have a cursor position, and the closing line states the load_project prerequisite. There is no when-not guidance and no routing to alternative reference-search tools among the many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_reflection_usageA
Find places where Java reflection API is used.
USAGE: find_reflection_usage() OUTPUT: All reflection calls grouped by method type
Detects calls to:
Class.forName(), Class.newInstance()
Class.getMethod/getDeclaredMethod/getField/getDeclaredField
Class.getConstructor/getDeclaredConstructor
Method.invoke(), Field.get/set(), Constructor.newInstance()
These usages are invisible to static reference searches and can break when types or methods are renamed.
maxResults caps the calls listed for each reflection method, all its overloads together (default 100), in source order: by file, then position. summary counts every call of each reflection method, and totalCalls and meta.totalCount count every call; meta.truncated is true when calls are left out. potentialMatches lists, the first maxResults of each reflection method in source order, the calls JDT could not confirm, each with its reflection method.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Maximum results per reflection method (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses output grouping, truncation behavior (meta.truncated, meta.totalCount), how maxResults applies per method across overloads, and the special potentialMatches semantics (unresolved types never counted or listed as results). This is rich behavioral disclosure beyond what any structured field provides.
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?
Front-loaded with purpose and organized into USAGE/OUTPUT/Detects sections, but the potentialMatches explanation is verbose and partly redundant ('count is their exact number, and locations lists them, as many as the results it stands beside may list'). The load_project prerequisite is buried at the very end rather than surfaced up front.
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?
With no output schema, the description must explain return values and does: it covers summary counts, totalCalls, meta truncation flags, and the potentialMatches edge case. For a single-optional-param analysis tool, nothing an agent needs to interpret or call it correctly 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 coverage is 100%, so the baseline is 3, but the description adds real meaning: maxResults caps results 'for each reflection method, all its overloads together' in source order (by file, then position) – a per-method-across-overloads and ordering rule not present in the schema's terse 'Maximum results per reflection method'.
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 places where Java reflection API is used') and enumerates exactly which calls count (Class.forName, getDeclaredMethod, Method.invoke, etc.). It also distinguishes itself from sibling reference-search tools by noting these usages are 'invisible to static reference searches', so an agent can tell it apart from find_references without opening a schema.
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 a hard prerequisite ('Requires load_project to be called first') and an implicit when-to-use rationale (reflection calls that evade static reference searches). It does not name a specific sibling alternative or state exclusions, so it is clear context rather than explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_testsA
Find test classes and methods in the project.
USAGE: find_tests() OUTPUT: List of test classes with their test methods
Supports:
JUnit 4 (@Test, @Before, @After, etc.)
JUnit 5 (@Test, @BeforeEach, @AfterEach, etc.)
TestNG annotations
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | No | Filter test classes by name pattern (glob) | |
| includeDisabled | No | Include disabled/ignored tests (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description implies read-only operation via 'Find' and describes output format. Does not explicitly state absence of side effects or error conditions.
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?
Very concise, front-loads purpose, uses bullet-like structure. Every line adds value, no wasted words.
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 main purpose, prerequisites, supported frameworks, and output. Lacks details on return format, error handling, or behavior when pattern matches nothing.
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 100%; parameters are documented in schema. Tool description adds no extra parameter semantics beyond 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?
Description clearly states it finds test classes and methods, lists supported frameworks (JUnit 4, 5, TestNG). Distinct from sibling tools which focus on different analysis tasks.
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 a usage example and explicitly states prerequisite (require load_project). No comparison to alternatives, but context is clear enough for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_throws_declarationsA
Find all throws declarations of an exception type in method signatures.
JDT-UNIQUE: This fine-grained search is not available in LSP.
USAGE: Provide fully qualified exception type name as typeName
OUTPUT: All methods that declare 'throws ExceptionType'
Useful for:
Understanding exception flow in the codebase
Finding all methods that can throw a specific exception
Exception handling analysis
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified exception type name (e.g., 'java.io.IOException') | |
| maxResults | No | Maximum results to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden and does notable work: it discloses the load_project prerequisite and explains the non-obvious potentialMatches field (unconfirmed matches never counted or listed as results). It still does not state read-only status or rate/size limits explicitly, so it is strong but not exhaustive.
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?
Purpose is front-loaded in the first line, followed by differentiator, usage, output, and use cases in a scannable structure. The potentialMatches paragraph is dense and slightly long but each clause carries real semantic weight about result semantics.
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?
With no output schema and no annotations, the description compensates by describing the output ('all methods that declare throws ExceptionType') and the subtle potentialMatches sub-structure, plus the prerequisite. An agent has everything it needs to invoke and interpret the result.
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 coverage is 100%, so both parameters are already documented (typeName as fully qualified name, maxResults default 100). The description restates the typeName convention but adds no format or syntax detail beyond what the schema provides, matching the baseline for high coverage.
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 precise verb and resource ('Find all throws declarations of an exception type in method signatures') and immediately scopes what counts ('All methods that declare throws ExceptionType'). It is distinguishable from siblings like find_catch_blocks or find_references without opening the schema.
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 a 'Useful for' list of concrete scenarios and the hard prerequisite 'Requires load_project to be called first', plus the JDT-vs-LSP differentiation. It stops short of naming sibling tools that might be mistaken for it, so no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_type_argumentsA
Find all usages of a type as a generic type argument (List, Map<K, Foo>).
JDT-UNIQUE: This fine-grained search is not available in LSP.
USAGE: Provide fully qualified type name OUTPUT: All locations where the type is used as a generic argument
Useful for:
Understanding generic usage patterns
Finding all collections/containers of a type
API design analysis
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified type name to find in generic arguments | |
| maxResults | No | Maximum results to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the important load_project prerequisite and explains the potentialMatches field's semantics, including that unresolved types are never counted as results. It omits nothing critical for a read-only search, though it doesn't address result limits or error behavior beyond the schema's maxResults.
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 front-loaded with purpose, then blocks for JDT-UNIQUE, USAGE, OUTPUT, and the potentialMatches detail. Each section serves a purpose, though the 'Useful for' bullets lightly echo the opening sentence and the potentialMatches paragraph is dense, keeping it just short of maximally tight.
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?
With no output schema, the description must describe return values and it does: locations of generic-argument usages plus the nuanced potentialMatches structure. Combined with the load_project prerequisite and the LSP distinction, an agent has everything needed to invoke and interpret 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 100%, so typeName and maxResults are already documented structurally. The description's 'Provide fully qualified type name' reinforces the typeName constraint but adds little beyond the schema, and maxResults is untouched. Baseline 3 applies when the schema does the heavy lifting.
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+resource with concrete syntax examples (List<Foo>, Map<K, Foo>), and explicitly positions itself against alternatives by noting it is not available in LSP and that it searches only generic-argument positions. An agent can distinguish it from find_references, find_type_instantiations, and find_casts without opening any schema.
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?
Clear context is given via the 'USAGE' line and 'Useful for' scenarios, plus the JDT-UNIQUE note implying it covers ground other searches do not. However, it never names sibling tools as alternatives nor states explicit exclusions (e.g., 'use find_references for non-generic usages'), so the when-not guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_type_instantiationsA
Find all instantiations of a type (new Foo() calls).
JDT-UNIQUE: This fine-grained search is not available in LSP.
USAGE: Provide fully qualified type name OUTPUT: All locations where the type is instantiated with 'new'
Useful for:
Understanding object creation patterns
Identifying factory method candidates
Finding coupling points
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified type name (e.g., 'java.util.ArrayList') | |
| maxResults | No | Maximum results to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does meaningful work: it explains that potentialMatches holds unconfirmed/unresolved candidates that are never counted as results, and it discloses the load_project prerequisite. It does not state read-only safety or pagination behavior, leaving that gap.
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?
Purpose is front-loaded and the labeled sections (USAGE, OUTPUT, Useful for) scan quickly. The potentialMatches paragraph is dense and awkwardly worded ('as many as the results it stands beside may list'), which costs it a point.
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?
There is no output schema, so the description must explain return semantics, and it does: locations of `new` sites plus the potentialMatches structure and counting rules. The main omission is that the return shape is described in prose rather than a schema, and maxResults behavior is never addressed.
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 100%, so both typeName and maxResults are already documented in the schema; baseline is 3. The description only reiterates the fully-qualified-name requirement and says nothing about maxResults or default behavior, adding marginal value beyond the 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 gives a precise verb+resource (find all instantiations of a type, i.e. `new Foo()` calls) and even disambiguates from the LSP-equivalent tools by labeling itself 'JDT-UNIQUE'. An agent can distinguish it from siblings like find_instanceof_checks or find_method_references without opening any schema.
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 states the calling convention explicitly ('USAGE: Provide fully qualified type name'), lists concrete scenarios (object creation patterns, factory candidates, coupling points), and gives the prerequisite ('Requires load_project to be called first'). It does not name alternative tools or state when NOT to use it, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_unreachable_codeA
Find code unreachable from any entry point, project-wide.
USAGE: find_unreachable_code() OUTPUT: Members (types, methods, fields) that no entry point reaches, with visibility and location, plus the roots used.
Roots are public static void main(String[]) methods and detected test methods (JUnit 4/5, TestNG; disabled tests still count). Reachability follows calls, instantiations, field accesses, field initializers, and overrides (a call through an interface or superclass reaches every override). A type is reported only when neither it nor any of its members is reachable.
IMPORTANT: results mean "unreachable from declared entry points", not "safe to delete" - reflection, dependency injection, and serialization entry points are invisible to the graph.
Options:
includeTestRoots: count test methods as entry points (default true)
maxResults: cap the reported list (default 100)
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Maximum entries to return (default 100) | |
| includeTestRoots | No | Treat test methods as entry points (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully discloses behavior: how reachability is computed (calls, instantiations, field accesses, etc.), what counts as roots (main methods, test methods), and what the output includes (members with visibility and location). It also clarifies that disabled tests still count as entry points.
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 well-structured with clear sections (USAGE, OUTPUT, explanation of roots, IMPORTANT caveats, Options). It is concise yet comprehensive, with every sentence adding necessary information.
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 complexity, the description is complete: it explains the algorithm, the meaning of results, limitations (invisible entry points), and prerequisites. No output schema is provided, but the description sufficiently covers the output format.
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 100%, so baseline is 3. The description adds value by explaining defaults ('default true' for includeTestRoots, 'default 100' for maxResults) and context for the options, which goes beyond the schema's type descriptions.
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 clearly states the tool's purpose: 'Find code unreachable from any entry point, project-wide.' It distinguishes this from sibling tools like 'find_unused_code' by specifying the project-wide scope and entry point focus.
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 explicitly provides usage syntax, outlines options, and gives a critical caveat: results indicate unreachability from declared entry points, not safe-to-delete due to reflection and DI. It also notes the prerequisite 'Requires load_project to be called first.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_unused_codeA
Find unused private methods and fields in the project.
USAGE: find_unused_code() USAGE: find_unused_code(filePath="path/to/File.java") OUTPUT: List of unused private members
Detects:
Unused private methods
Unused private fields
Write-only fields (set but never read)
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | No | Optional: specific file to check (default: all files) | |
| includeFields | No | Include unused fields (default true) | |
| includeMethods | No | Include unused methods (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must carry full burden. It describes what it detects and the prerequisite, but does not explicitly state it is read-only (implied by 'find') or mention side effects, performance, or error conditions.
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?
Concise and well-structured: title, usage examples, output description, detection list, prerequisite. Every sentence is informative with no 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?
Covers purpose, usage, output format, detection categories, and prerequisite. Lacks error handling details and output schema (since none provided). Adequate for the tool's complexity.
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 coverage is 100%, so baseline is 3. The description adds value by showing usage examples with the optional filePath parameter and default behavior (includeFields/methods default true).
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 clearly states it finds unused private methods and fields, listing specific detection categories (unused private methods, unused private fields, write-only fields). This distinguishes it from sibling tools like find_references or find_method_references.
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 two usage examples and explicitly states that load_project must be called first. However, it does not differentiate from sibling tools or give when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_call_hierarchy_incomingA
Find all callers of a method (incoming calls).
USAGE: Position cursor on a method name OUTPUT: List of methods that call this method
IMPORTANT: Uses ZERO-BASED coordinates.
Useful for understanding who depends on a method before changing it.
The callers of a method of a class file, such as a JDK method, are those in the project's source files. maxResults outside 0 to 500 is INVALID_PARAMETER.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file | |
| maxResults | No | Max callers to return, 0 to 500 (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the maxResults bound and the INVALID_PARAMETER failure mode, the load_project prerequisite, the output shape, and how potentialMatches ('never counted or listed as results') behaves. It doesn't state read-only/reversibility explicitly, but the query nature is evident.
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?
Front-loads the core purpose and uses labeled USAGE/OUTPUT/IMPORTANT sections, which is easy to scan. It is somewhat long and mildly redundant ('all callers' restated as 'List of methods that call this method'), but nearly every sentence earns its place given the absent output 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 4-param query tool with no annotations and no output schema, the description covers output format, coordinate convention, bounds/error behavior, an edge case (potentialMatches) and a prerequisite. Nothing an agent needs to invoke it correctly 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 coverage is 100% (baseline 3), and the description adds real value on top: it stresses ZERO-BASED coordinates and specifies that maxResults outside 0-500 is INVALID_PARAMETER. These constraints are behavioral semantics the schema alone doesn't fully convey.
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+resource ('Find all callers of a method') and scopes it with '(incoming calls)', which cleanly distinguishes it from the sibling get_call_hierarchy_outgoing and other reference-style tools. An agent can identify the operation immediately.
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 clear context for use ('understanding who depends on a method before changing it'), a positional prerequisite ('Position cursor on a method name'), and a hard dependency ('Requires load_project to be called first'). It does not name explicit alternatives such as find_references, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_call_hierarchy_outgoingA
Find all methods called by a method (outgoing calls).
USAGE: Position cursor on a method name OUTPUT: List of methods that this method calls
A call in a lambda written in the method is the method's call; a call in the body of an anonymous or local class declared in it is a call of that class's member, as get_call_hierarchy_incoming reports it. Creating an anonymous class, and its arguments, are calls of the method; the creation is a call of the superclass constructor the anonymous class's constructor runs (Object() for an interface), returning the anonymous class.
IMPORTANT: Uses ZERO-BASED coordinates.
Useful for understanding what a method depends on.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return shape, the load_project prerequisite, zero-based coordinates, and non-obvious edge-case semantics (lambda calls belong to the enclosing method, anonymous-class body calls do not, and class creation resolves to the superclass constructor). It omits error behavior when the cursor is not on a method, keeping it short of a 5.
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?
Front-loaded with a one-line purpose followed by clearly labelled USAGE/OUTPUT/IMPORTANT blocks, which is easy to scan. The lambda/anonymous-class paragraph is dense and somewhat hard to parse, but it encodes genuine edge-case behavior that would otherwise be missing.
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?
There is no output schema, so the description must explain returns and does so ('List of methods that this method calls'), plus it covers the load_project prerequisite and coordinate convention. It is nearly complete for a position-based query tool; only failure modes when no method is under the cursor are unaddressed.
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 coverage is 100% and both 'line' and 'column' are already documented as zero-based, so the description's 'IMPORTANT: Uses ZERO-BASED coordinates' largely restates structured data. 'Position cursor on a method name' adds minor semantic value by indicating the coordinates must point at a method identifier, so baseline 3 applies.
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 all methods called by a method') with the directional qualifier '(outgoing calls)' that cleanly separates it from the sibling get_call_hierarchy_incoming, which it names explicitly. An agent can tell the two apart without opening either schema.
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?
'USAGE: Position cursor on a method name' tells the agent the required precondition and 'Requires load_project to be called first' gives the ordering dependency. It also states the analytical use case ('understanding what a method depends on'). It lacks an explicit when-not, but the incoming sibling reference covers the main alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_classpath_infoA
Get project classpath information.
USAGE: Call to get all classpath entries for the loaded project OUTPUT: Source folders, libraries, and classpath containers
Useful for understanding project structure and dependencies.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| includeSource | No | Include source folder entries (default true) | |
| includeLibraries | No | Include library entries (default true) | |
| includeContainers | No | Include container entries like JRE (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full burden. It describes output and a prerequisite but does not disclose side effects, errors, or performance implications. Adequate but lacks depth.
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?
Description is concise with a clear structure: purpose, usage, output, and prerequisite. No redundant sentences.
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 no output schema, the description explains the return content (source folders, libraries, containers) and a prerequisite. Could specify return format more precisely, but it is complete enough for most use cases.
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 coverage is 100% with clear parameter descriptions. The tool description adds value by mapping parameters to output categories (libraries, source, containers), enhancing understanding beyond the 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 clearly states the tool retrieves classpath information and lists output categories (source folders, libraries, containers). It is specific but does not explicitly differentiate from sibling tools like get_project_structure or get_dependency_graph.
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 a usage statement and a clear prerequisite ('Requires load_project to be called first'). However, no guidance is given on when to use this tool versus alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_complexity_metricsA
Get cyclomatic complexity, cognitive complexity, LOC.
USAGE: get_complexity_metrics(filePath="path/to/File.java") OUTPUT: The file's line counts, a summary and risk assessment over its methods and, with includeDetails (default true), each method's metrics with the type declaring it
Metrics:
Cyclomatic Complexity: Count of decision points (+1 for if/for/while/case/catch)
Cognitive Complexity: Penalizes nesting and breaks in linear flow
LOC: Physical and logical lines of code
Risk levels:
High: CC > 10
Medium: CC 6-10
Low: CC <= 5
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Path to source file | |
| includeDetails | No | Include per-method breakdown (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it describes the output structure, the default behavior of includeDetails, and how risk levels are derived. It does not explicitly state read-only behavior or error conditions, but otherwise gives strong behavioral context.
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 front-loaded with the core purpose and organized into usage, output, metrics, and risk sections. It is reasonably concise, though some metric and risk-level detail could be considered supplementary rather than essential.
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?
There is no output schema and no annotations, so the description must explain return values and behavior. It does so effectively by describing line counts, summary/risk assessment, per-method details, and risk thresholds. Minor gaps remain around read-only guarantees and error behavior.
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 100%, so both parameters are already documented. The description repeats the includeDetails default and gives a filePath example, but does not add substantial meaning beyond what the schema already provides.
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: retrieve cyclomatic complexity, cognitive complexity, and LOC for a file. It is clearly distinguishable from most siblings by resource, though it does not explicitly differentiate itself from related analysis tools like analyze_file or analyze_method.
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 a usage example and the prerequisite that load_project must be called first, which is useful context. However, it does not explain when to choose this tool over alternatives such as analyze_file, analyze_method, or health_check, so usage guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dependency_graphA
Get package/type dependencies.
USAGE: get_dependency_graph(scope="type", name="com.example.OrderService") USAGE: get_dependency_graph(scope="package", name="com.example.service") OUTPUT: Dependency graph with nodes and edges
Each node has a name and a kind. A node that denotes a type is named by the type's fully qualified name with '$' between nested types (com.example.Outer$Inner), however the source names it, so each type is one node. A node that denotes a type, or a member of one (a static import), also has the package of that type as JDT resolves it ("(default package)" for the default package). A node that denotes a package (every node at package scope, and an on-demand package import) has no package; neither has a name that does not resolve.
At package scope the graph covers the package and its subpackages: each import is an edge from the package of the file declaring it to the package it imports, and every edge's source and target is a node, as is the requested package. A name that is no package of the project's source folders, a library's package such as java.util included, is SYMBOL_NOT_FOUND.
depth is 1 or more at either scope; below 1 is INVALID_PARAMETER. At type scope it is how many steps of dependencies are followed from the type: 1 lists the type's own dependencies, 2 also those of each dependency with source, and so on. Package scope does not use it.
Dependency types tracked:
import: Direct imports
extends: Superclass inheritance
implements: Interface implementation
field: Field type dependencies
parameter: Method parameter types
return: Method return types
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Type name (fully qualified) or package name | |
| depth | No | How deep to follow dependencies, 1 or more (default: 1) | |
| scope | Yes | Scope: 'type' or 'package' | |
| includeExternal | No | Include JDK/library dependencies (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: it explains node naming, package-scope coverage, edge semantics, dependency types tracked, depth behavior, and error codes. It also discloses the load_project prerequisite.
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 front-loaded with purpose and usage, then structured with output details and dependency types. It is somewhat long, but for a dependency-graph tool most of the detail is relevant and earns its place.
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 absence of an output schema and annotations, the description explains the returned graph, node identity, package semantics, depth behavior, and failure modes. An agent has enough information to call 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 coverage is 100%, so parameter definitions are already strong, but the description adds meaningful semantics for scope, depth, node resolution, and package-scope behavior. It does not explicitly explain the includeExternal parameter, which keeps it from a 5.
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: "Get package/type dependencies." Examples for type and package scope make the operation unambiguous, but the description does not explicitly contrast itself with nearby tools such as get_type_hierarchy or find_circular_dependencies.
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 invocation examples for both scopes and notes that load_project must be called first. It also defines depth and error behavior, but does not say when to choose this tool over sibling dependency-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diagnosticsA
Get compilation diagnostics (errors and warnings) for a file or project.
USAGE: get_diagnostics() for all files, or get_diagnostics(filePath="...") for one file OUTPUT: List of compilation errors and warnings with locations
Useful for finding syntax errors, type mismatches, missing imports, etc.
severity (optional, compared case-insensitively): error or warning keeps the diagnostics of that severity; all (the default) keeps both. Any other value is rejected with INVALID_PARAMETER.
Every file is checked and every diagnostic kept is counted in totalDiagnostics, errorCount and warningCount; maxResults limits only the diagnostics listed, and meta.truncated says when the list is cut.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | No | Optional path to source file. If omitted, checks all files. | |
| severity | No | Filter by severity, case-insensitive: 'error', 'warning' or 'all' (default: 'all') | |
| maxResults | No | Max diagnostics to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that unrecognized severity values are rejected with INVALID_PARAMETER, that filtering is case-insensitive, that all files are checked and counted even when maxResults truncates the list, and that meta.truncated signals truncation. It does not cover permissions or performance on very large projects, but the operational semantics are unusually well documented.
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?
USAGE and OUTPUT are front-loaded before the finer filtering rules, so an agent gets the essential call shape immediately. The description is on the long side and the 'Useful for finding syntax errors, type mismatches, missing imports, etc.' sentence is largely filler, but the labeled structure keeps it scannable.
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 3-parameter read tool with no annotations and no output schema, the description covers the invocation modes, the prerequisite, the meaning of each parameter, the shape of the return value (diagnostics with locations plus counts and a truncation flag), and the error path. Nothing an agent needs to call it correctly 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 coverage is 100%, so the baseline is 3, but the description earns extra credit by adding semantics the schema does not: case-insensitive severity matching with INVALID_PARAMETER rejection, and the non-obvious interaction where maxResults limits only the listed diagnostics while totalDiagnostics/errorCount/warningCount count everything.
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 opening sentence gives a specific verb and resource ('Get compilation diagnostics (errors and warnings)') plus the scope (file or project). It is distinguishable from nearby siblings like validate_syntax or analyze_file because it names the artifact being returned (errors and warnings) rather than a generic analysis.
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 USAGE line explicitly shows the two invocation modes: no-arg for all files and filePath for a single file, and it states the prerequisite 'Requires load_project to be called first.' It stops short of saying when to prefer this over siblings such as validate_syntax or find_possible_bugs, so it is clear context without alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_di_registrationsA
Find all dependency injection registrations in the project.
USAGE: get_di_registrations() OUTPUT: Components, configurations, beans, and injection points
Scans for:
Spring components: @Component, @Service, @Repository, @Controller, @RestController
Configuration: @Configuration
Bean definitions: @Bean
Injection points: @Autowired, @Inject (javax and jakarta)
Returns empty categories for non-Spring projects (does not error).
maxResults caps the matches listed for each annotation type (default 200). Each summary count is the exact number of registrations in its category; meta.totalCount counts every registration, meta.returnedCount those listed, and meta.truncated is true when an annotation type has more matches than maxResults. potentialMatches lists, the first maxResults of each annotation type, the annotations JDT could not confirm, each with the annotation it names; none is a registration.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Maximum results per annotation type (default 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that non-Spring projects return empty categories rather than erroring, explains the maxResults cap and its interaction with meta.totalCount/returnedCount/truncated, and carefully defines potentialMatches as unconfirmed, never-counted results. That is exactly the kind of behavioral context annotations would otherwise have to supply.
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?
Front-loading is good (purpose, then USAGE/OUTPUT, then semantics), but the potentialMatches passage is verbose and grammatically tangled ('as many as the results it stands beside may list'), requiring re-reading. The meta/potentialMatches detail is repeated and could be tightened substantially.
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?
No output schema and no annotations, yet the description fully specifies the return shape (categories, meta counters, potentialMatches), the prerequisite, and edge-case behavior. An agent has everything needed to invoke and interpret the result 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 coverage is 100% and the single parameter's description ('Maximum results per annotation type (default 200)') is essentially duplicated in the prose. The description adds only marginal nuance about per-type truncation, which the schema text already conveys. Baseline 3 is correct.
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 all dependency injection registrations') and then enumerates exactly what it scans for (Spring components, @Configuration, @Bean, @Autowired/@Inject). An agent can distinguish this from generic siblings like find_annotation_usages or get_dependency_graph without opening the schema.
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 a clear prerequisite ('Requires load_project to be called first') and an explicit USAGE signature. However, it never names an alternative tool or states when NOT to use it (e.g., versus find_annotation_usages for a single annotation), so guidance stops short of the 5-level routing clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_symbolsA
Get all symbols (types, methods, fields) in a source file.
USAGE: Provide a file path to get all symbols in that file OUTPUT: Hierarchical list of all types, methods, fields, and nested types
Returns symbols with their locations, kinds, and modifiers. A record's components are listed as its first children.
Types are listed as declared at top level and as members of other types. Local and anonymous classes, those declared in method, field or initializer bodies, are not listed.
maxResults outside 0 to 2000 is INVALID_PARAMETER.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Path to source file | |
| maxResults | No | Maximum symbols to return, 0 to 2000 (default 500) | |
| includePrivate | No | Include private members (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses output shape (hierarchical), edge-case filtering (local/anonymous classes excluded, record components as first children), and the error behavior for out-of-range maxResults (INVALID_PARAMETER). It does not state cost/latency or behavior for a nonexistent file path, keeping it from a 5.
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?
Front-loads the purpose, then uses USAGE/OUTPUT labels for scannability, and every sentence (including the local-class exclusion) carries real information. Slightly fragmented line breaks and some redundant restatement of return contents keep it from a 5.
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?
No output schema exists, yet the description explains the return structure, nesting, and what is deliberately omitted, plus the load_project precondition. For a 3-parameter read tool, an agent has everything needed 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 100%, so filePath, maxResults and includePrivate are already fully documented. The description's mention of the maxResults valid range and INVALID_PARAMETER outcome largely restates the schema, and it never mentions includePrivate — baseline 3 applies.
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 ('Get all symbols') plus the concrete contents (types, methods, fields) and scoping ('in a source file'). This lets an agent distinguish it from project-wide siblings like search_symbols, though no sibling is named explicitly.
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 a clear usage line ('Provide a file path to get all symbols in that file') and, importantly, a hard prerequisite ('Requires load_project to be called first'). It stops short of naming alternatives such as search_symbols for cross-file lookups, so no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_enclosing_elementA
Get the enclosing element at a position.
USAGE: Position anywhere in code OUTPUT: Enclosing method, type, and package info
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description mentions zero-based coordinates and prerequisite. Lacks detail on return format or edge cases (e.g., what if position is not inside any element). Could be more transparent.
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?
Very concise: 5 lines with clear sections (USAGE, OUTPUT, IMPORTANT, requirement). Front-loaded with main purpose, no unnecessary words.
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?
Tool is simple with 3 params and no output schema. Description covers purpose, usage, output type, coordinate system, and prerequisite. Lacks error handling details but still fairly complete for an information retrieval tool.
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 coverage is 100% and already documents zero-based coordinates. Description merely repeats this information, adding no new semantics beyond the 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?
Description clearly states 'Get the enclosing element at a position' and specifies output as enclosing method, type, and package info. It distinguishes from siblings like get_field_at_position and get_method_at_position by being more generic.
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?
Explicit usage instruction ('Position anywhere in code') and prerequisite ('Requires load_project to be called first'). No comparison with alternatives but sufficient for basic usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_field_at_positionA
Get field information at a specific position.
USAGE: Position on a field reference or declaration OUTPUT: Field type, modifiers, constant value if applicable
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses zero-based coordinates and output contents (type, modifiers, constant value). No annotations exist, so description carries full burden; it covers key behavioral traits without contradiction.
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?
Five sentences organized with clear sections (USAGE, OUTPUT, IMPORTANT), no redundant information, and highly efficient.
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 3 required parameters and no output schema, the description explains inputs, coordinate system, output, and prerequisite. Fully adequate for selecting and invoking the tool.
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 descriptions cover all 3 parameters (100% coverage). Description adds value by emphasizing zero-based coordinates and output details, exceeding the baseline of 3.
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 clearly states 'Get field information at a specific position' and specifies usage on a field reference or declaration. This distinguishes it from sibling tools like get_method_at_position and get_type_at_position.
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 usage context: 'Position on a field reference or declaration' and prerequisite 'Requires load_project to be called first.' No exclusion criteria, but sufficient for general use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hover_infoA
Get hover information (documentation) for a symbol at a position.
USAGE: Position on any symbol OUTPUT: Signature, Javadoc, and quick info similar to IDE hover
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses zero-based coordinates, prerequisite, and output nature (signature, javadoc, quick info). A minor gap: no mention of behavior on invalid positions.
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?
Extremely concise with clear headers (USAGE, OUTPUT, IMPORTANT). Every sentence serves a purpose, no 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?
For a simple read tool, covers purpose, usage, output, prerequisite. Lacks details on error handling or empty results, but overall complete for typical use.
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 coverage is 100%, baseline 3. Description adds value by explaining coordinates represent a symbol position and that they are zero-based, enhancing semantic understanding.
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 clearly states it gets hover information (documentation) for a symbol at a position, specifying output as signature, Javadoc, and quick info. It distinguishes from siblings like get_javadoc and get_signature_help by mentioning 'hover' context, and notes zero-based coordinates.
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 usage guidance: 'Position on any symbol' and prerequisite 'Requires load_project to be called first.' However, it does not explicitly compare to similar position-based tools like get_method_at_position.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_http_endpointsA
Assemble the project's HTTP route table.
USAGE: get_http_endpoints() OUTPUT: route -> handler entries (HTTP method, effective path, handler method, framework, location), sorted by path.
Supports:
Spring verb shortcuts: @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping; the class-level @RequestMapping value is composed as the path prefix.
JAX-RS (jakarta.ws.rs and javax.ws.rs): @GET/@POST/... verbs with class-level and method-level @Path composed.
Method-level @RequestMapping(method=...) routes are not assembled; verb-shortcut annotations are the supported Spring form.
Handlers are listed where a framework can register them: in a named top-level or static member class, interface, record or enum. A verb-annotated method of an anonymous class, a local class or a non-static inner class, or an element of an annotation type, is no route and is not listed. A handler whose signature names a type that does not resolve is listed like any other.
Projects without these frameworks return an empty table.
potentialMatches lists, the first maxResults by file and position, the verb annotations JDT could not confirm, each with the annotation it names; none is a route.
Options:
maxResults: cap the reported endpoints (default 200)
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Maximum endpoints to return (default 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden and does so unusually well: it discloses the supported Spring verb shortcuts, the explicitly unsupported method-level @RequestMapping form, the class-shape rules for what counts as a registrable handler (excluding anonymous/local/non-static inner classes and annotation-type elements), that handlers with unresolvable signature types are still listed, and the precise semantics of potentialMatches including that they are never counted or listed as results.
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 purpose and prerequisite are front-loaded, but the body is sprawling and the potentialMatches behavior is covered twice, once in a garbled fragment ('potentialMatches lists, the first maxResults by file and position, the verb annotations JDT could not confirm') and again later in coherent prose. A tighter single paragraph would carry the same information with less risk of confusing the agent.
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 complex, zero-annotation, no-output-schema analysis tool, the description covers output shape, supported and unsupported annotation forms, handler-eligibility rules, the empty-project case, the potentialMatches payload and its limits, and the load_project dependency. Nothing an agent needs to call it correctly 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?
There is a single optional parameter and schema description coverage is 100%, so the schema already documents maxResults. The description restates it ('cap the reported endpoints (default 200)') without adding format, range, or interaction details, which is the baseline 3 for a schema that does the heavy lifting.
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 opening line states a concrete verb and resource: 'Assemble the project's HTTP route table.' The chrome of what the table contains (method, effective path, handler, framework, location) is spelled out, and no sibling tool in the list produces HTTP routes, so the agent can distinguish it immediately from get_di_registrations, get_jpa_model, or find_annotation_usages.
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?
'Requires load_project to be called first' gives a hard prerequisite, and 'Projects without these frameworks return an empty table' tells the agent what a null-looking result means. It does not name a when-not case or point at an alternative tool, so it stops short of the explicit routing guidance that earns a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_javadocA
Get parsed Javadoc documentation for a symbol.
USAGE: Position on any documented symbol OUTPUT: Parsed Javadoc with summary, @param, @return, @throws, etc.
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries burden. It mentions zero-based coordinates and prerequisite, adding context. Does not disclose behavior for undocumented symbols or other traits.
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?
Very concise, front-loaded purpose, sections clearly label usage and output. Every sentence is necessary and informative.
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?
Explains output format, prerequisite, and zero-based coordinate system. No output schema, but output description suffices. Good for a moderate-complexity tool.
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 coverage is 100% with basic descriptions. Description adds critical context that line and column are zero-based, enhancing parameter meaning.
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 clearly states it gets parsed Javadoc for a symbol, which is a specific verb+resource. However, it does not differentiate from siblings like get_hover_info or get_symbol_info.
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 clear usage: position on documented symbol and prerequisite (load_project). Lacks explicit when-not-to-use or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jpa_modelA
Assemble the project's JPA entity model.
USAGE: get_jpa_model() OUTPUT: Entities with table name, id field, and relationships (kind, target entity, mappedBy side), with locations.
Scans @Entity types (jakarta.persistence and javax.persistence) and reads @Table, @Id, and @OneToMany/@ManyToOne/@OneToOne/ @ManyToMany field annotations. Relationship targets are resolved from the field's type binding, including through collection type arguments (List -> Order).
Projects without JPA on the classpath return an empty model.
potentialMatches lists, the first maxResults by file and position, the @Entity annotations JDT could not confirm, each with the annotation it names; none is an entity.
Options:
maxResults: cap the reported entities (default 100)
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Maximum entities to return (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly succeeds: it explains that relationship targets are resolved through collection type arguments, that unresolvable types surface in potentialMatches and are never counted or listed as results, and that a non-JPA project returns an empty model rather than erroring. It never explicitly states the operation is read-only, but 'Scans/reads' makes the non-mutating nature clear.
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 text is bloated and visibly damaged: potentialMatches is explained twice (an orphaned fragment near the top and again in a full paragraph at the bottom), and the fragment 'potentialMatches lists, the first maxResults by file and position, the @Entity annotations JDT could not confirm…' reads as a mis-pasted sentence. Redundant and garbled content hurts front-loading and clarity.
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?
With no output schema and no annotations, the description correctly takes on both the return contract (OUTPUT: entities with table name, id field, relationships and locations) and the edge-case behavior. It is complete enough to call and interpret the tool, though the duplicated/garbled potentialMatches prose slightly muddies the return contract.
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 100% and there is a single parameter, so the schema already documents maxResults fully; the description's 'cap the reported entities (default 100)' simply restates it. Baseline 3 is correct when the schema does the heavy lifting.
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?
It names a specific action and artifact — 'Assemble the project's JPA entity model' — and then specifies exactly what is scanned (@Entity types from jakarta/javax persistence plus @Table, @Id, and relationship annotations), which distinguishes it from generic type/hierarchy siblings like get_type_hierarchy or analyze_type.
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 states a hard prerequisite ('Requires load_project to be called first') and a boundary condition ('Projects without JPA on the classpath return an empty model'), which tells the agent when the call is meaningless. However it names no alternative sibling and gives no explicit 'use this instead of X when…' routing, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_method_at_positionA
Get method information at a specific position.
USAGE: Position on a method reference or declaration OUTPUT: Method signature, parameters, return type, modifiers, exceptions
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Emphasizes zero-based coordinates and load_project dependency. Lacks explicit statement about read-only nature, but the purpose implies no side effects.
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?
Well-structured with clear sections, no wasted words, and front-loaded important information (purpose and usage).
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?
Describes output fields (signature, parameters, etc.) despite no output schema, and covers all necessary context for a simple positional lookup tool.
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 coverage is 100%, but description adds value by mentioning zero-based coordinates for line and column, which is critical for correct usage.
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?
Specific verb 'Get' and resource 'method information at a specific position', clearly distinguishing from sibling tools like get_field_at_position or get_type_at_position.
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?
States usage on 'method reference or declaration' and prerequisite 'load_project', but does not explicitly exclude cases where other tools (e.g., get_type_at_position) would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_structureA
Get project structure showing package hierarchy.
USAGE: Call to see the package tree of the loaded project OUTPUT: Source roots with packages and file counts
maxDepth outside 1 to 20 is INVALID_PARAMETER.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| maxDepth | No | Maximum package depth to show, 1 to 20 (default 10) | |
| includeFiles | No | Include file names in each package (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the output shape ('Source roots with packages and file counts'), the load_project prerequisite, and the failure mode for bad input ('maxDepth outside 1 to 20 is INVALID_PARAMETER'). It still does not say whether the call is safe/read-only, whether it can be slow on large projects, or whether results are cached, keeping it out of 5 territory.
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?
Labeled USAGE/OUTPUT blocks keep it front-loaded and scannable, with no filler sentences. The maxDepth validity line duplicates the schema range, a small redundancy that costs it a perfect score.
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?
There is no output schema, so the description properly summarizes the return value, and it states the load_project prerequisite plus the invalid-input behavior. For a two-optional-parameter read tool that is essentially complete; only edge cases (large-project performance, empty/unloaded project) remain unaddressed.
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 coverage is 100%, so both parameters are already documented; the description only restates the maxDepth range plus an error code, and says nothing about includeFiles or default behavior. Baseline 3 is correct when the schema does the heavy lifting.
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 ('Get project structure showing package hierarchy') and the scope is clearly project-wide, which separates it from the symbol-level siblings like get_symbol_info or go_to_definition. It does not name an overlapping sibling (e.g., get_dependency_graph) to draw the boundary explicitly, so it stops short of a 5.
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?
'USAGE: Call to see the package tree of the loaded project' gives a clear context, and the prerequisite 'Requires load_project to be called first' is exactly the kind of guidance an agent needs. No explicit when-not or alternative-sibling routing is given, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quick_fixesA
List available fixes for a problem at position.
USAGE: get_quick_fixes(filePath="...", line=10) OUTPUT: List of quick fixes with fixId, label, and category
Supported fixes:
UndefinedType: Suggest imports for unresolved types, each fixId naming the type as an import does (add_import:pkg.Outer.Inner for a member type); a type in the default package, or in a package its module does not export to the project (such as the JDK's internal packages), cannot be imported and is never suggested; the package's name never decides. Every candidate is ranked by relevance (equally relevant ones by name), then the 10 most relevant are listed
UnusedImport: Remove unused import
UnhandledException: Add throws or surround with try-catch
Fixes are listed by relevance. meta.totalCount counts every fix for the problems at the position, meta.returnedCount those listed, and meta.truncated is true when import candidates are left out.
IMPORTANT: Uses ZERO-BASED line numbers.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | No | Zero-based column number (optional, uses whole line if omitted) | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description carries the full burden and does so: it discloses the ranking/selection behavior ('ranked by relevance ... then the 10 most relevant are listed'), the truncation semantics of meta.totalCount/returnedCount/truncated, the zero-based line convention, and the non-obvious import constraint that non-exported packages are never suggested. These are behavioral traits an agent could not recover from the schema.
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?
Well front-loaded: purpose, then USAGE, OUTPUT, supported fixes, and truncation semantics in descending priority. A few sentences are dense and slightly convoluted (the UndefinedType bullet), but every block contributes information the agent needs.
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?
There is no output schema, and the description compensates by naming the return shape (fixId, label, category) plus the meta counters and truncation flag. Combined with the prerequisite and line-numbering warning, nothing material is missing for correct invocation.
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 100%, so the schema already documents filePath, line, and column, including the zero-based convention that the description repeats in caps. The 'uses whole line if omitted' behavior for column is also in the schema, so the description adds no real parameter meaning beyond the structured data.
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 ('List available fixes for a problem at position') and enumerates the concrete fix categories it can return. It never names the adjacent tool apply_quick_fix, so the read-vs-apply distinction from siblings is left to be inferred from the OUTPUT line rather than stated.
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 a concrete invocation example and a hard prerequisite ('Requires load_project to be called first'), which is exactly the context an agent needs before calling. It does not state when NOT to use it or explicitly route to apply_quick_fix, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signature_helpA
Get method signature help at a position.
USAGE: Position on a method call or declaration OUTPUT: Method signatures with parameter info
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description clearly states the output type (method signatures with parameter info) and the zero-based coordinate system, which is a critical behavioral detail for correct invocation.
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?
Extremely concise with a clear structure: line for purpose, bullet for usage, line for output, important note, and prerequisite. Every sentence adds value with no 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?
For a signature help tool with no output schema, the description adequately covers input context (zero-based coordinates, prerequisite), output expectation (signatures with param info), and usage context. No missing critical information.
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 100% with each parameter clearly documented. The description adds no additional semantic value beyond reiterating zero-based coordinates (already in schema). Baseline score of 3 applies.
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?
Clearly states the tool retrieves method signature help at a given position, and specifies it is for method calls or declarations, distinguishing it from sibling tools like get_hover_info or get_method_at_position.
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 usage context (position on method call/declaration) and a critical prerequisite (load_project). Does not discuss alternatives or when to avoid, but the usage is well-scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_super_methodA
Find the method that this method overrides or implements.
USAGE: Position on a method that overrides/implements another OUTPUT: The superclass/interface method being overridden
The overridden method is the one the compiler binds: the nearest declaration in the superclass chain, else in the interfaces, visible from the method's package. unresolvedSupertypes, present only when there are any, names each supertype of the declaring type the compiler cannot resolve (a missing dependency), as the declaration writes it, with the type whose declaration names it: the method may override a method of one of them.
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so substantively: it explains the compiler binding rule (nearest superclass declaration, else interface, visible from the method's package), the conditional unresolvedSupertypes output field, the zero-based coordinate system, and the load_project prerequisite. It omits error behavior for positions that are not on a method, but the disclosure is well above average for an annotation-free tool.
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?
Purpose is correctly front-loaded and the USAGE/OUTPUT labels aid scanning. The unresolvedSupertypes paragraph is a dense, hard-to-parse run-on that is longer than its practical value warrants, dragging down an otherwise tight structure.
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?
There is no output schema, so the description must describe returns, and it does ('OUTPUT: The superclass/interface method being overridden'), plus it covers the extra unresolvedSupertypes field and the load_project prerequisite. Only the failure mode (position not on an overriding method) is left unaddressed.
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 100% and all three parameters are documented in the schema, including the zero-based convention, so the baseline is 3. The description's 'IMPORTANT: Uses ZERO-BASED coordinates' repeats what the schema already states rather than adding format or semantics beyond it.
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 the method that this method overrides or implements.' An agent immediately grasps the operation. However, it never distinguishes itself from adjacent siblings such as find_implementations (the inverse direction) or get_type_hierarchy, which an agent could confuse with this tool.
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?
'USAGE: Position on a method that overrides/implements another' gives a clear precondition for invocation, and 'Requires load_project to be called first' states a required prerequisite. It does not, however, name when to prefer this over find_implementations or get_type_hierarchy, so there is no exclusion/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_symbol_infoA
Get detailed information about any symbol at a position.
USAGE: Position on any symbol (type, method, field, variable) OUTPUT: Comprehensive info including kind, modifiers, signature, location
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It reveals that the tool uses zero-based coordinates and requires load_project. It also summarizes output content ('kind, modifiers, signature, location'), providing insight into behavior beyond a simple fetch.
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 brief yet comprehensive, using clear sections (USAGE, OUTPUT, IMPORTANT) without redundancy. Every sentence adds value, making it easy for an AI agent to parse.
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 no output schema and three parameters, the description covers purpose, usage, output summary, coordinate system, and prerequisite. There are no obvious gaps for an information retrieval tool of this complexity.
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 coverage is 100%, but the description adds critical meaning by highlighting that coordinates are zero-based. This is essential for correct parameter usage and goes beyond the schema's basic descriptions.
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 clearly states the verb 'Get' and the resource 'detailed information about any symbol at a position', distinguishing it from similar tools like get_type_at_position or get_method_at_position. It specifies that it works on any symbol (type, method, field, variable).
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 provides explicit usage instructions: 'Position on any symbol (type, method, field, variable)', notes coordinate system ('Uses ZERO-BASED coordinates'), and states prerequisite 'Requires load_project to be called first'. It does not explicitly compare with siblings but gives sufficient context for correct use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_type_at_positionA
Get type information at a specific position.
USAGE: Position on a type reference or declaration OUTPUT: Type details including kind, modifiers, superclass, interfaces
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full transparency burden. It discloses zero-based coordinates and the need for a loaded project, but does not specify error behavior (e.g., if the position is not on a type) or side effects. Output details are partially mentioned.
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 concise (3 sentences) and well-structured with headings (USAGE, OUTPUT, IMPORTANT). It gets to the point quickly, though the OUTPUT section could be integrated into the main sentence for further brevity.
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 lack of output schema, the description usefully lists output fields (kind, modifiers, superclass, interfaces). It covers usage context and prerequisites. However, missing details on error handling and edge cases prevent a higher score.
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 has 100% coverage, with descriptions for filePath, line, column including 'Zero-based' in the line and column descriptions. The tool description reiterates zero-based coordinates but adds no significant meaning beyond the 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 clearly states the tool's purpose: 'Get type information at a specific position.' It positions itself as a position-aware type query tool, distinct from tools like get_type_hierarchy or get_type_members, but does not explicitly differentiate from similar position-based tools like get_field_at_position or get_method_at_position.
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 provides a usage hint ('Position on a type reference or declaration') and a prerequisite ('Requires load_project to be called first'). However, it lacks guidance on when not to use this tool versus alternatives. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_type_hierarchyA
Get the type hierarchy (supertypes and subtypes) for a Java type.
USAGE: Position on a type, returns full inheritance chain OUTPUT: Superclasses, interfaces, and all subtypes
Can be called with either:
File position (filePath, line, column) - finds type at cursor
Type name (typeName) - looks up type by qualified name
IMPORTANT: Uses ZERO-BASED coordinates when using file position.
unresolvedSupertypes, present only when there are any, names each supertype the compiler cannot resolve (a missing dependency), as the declaration writes it, with the type whose declaration names it: this type or one of its supertypes. The superclasses then run to the last that resolves and end with java.lang.Object. potentialMatches are the places naming the type, or a subtype, as a supertype that JDT could not confirm.
maxResults, the most entries each of superclasses, interfaces and subtypes lists (totalSuperclasses, totalInterfaces and totalSubtypes count all of them, and meta.truncated says when a list is cut), is 1 to 50; outside that range is INVALID_PARAMETER.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | No | Zero-based line number | |
| column | No | Zero-based column number | |
| filePath | No | Path to source file (for position-based lookup) | |
| typeName | No | Fully qualified type name (alternative to position) | |
| maxResults | No | Most entries each list holds, 1 to 50 (default 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it documents zero-based coordinates, the 1-50 maxResults bound with an INVALID_PARAMETER error for out-of-range values, truncation via meta.truncated, conditional unresolvedSupertypes/potentialMatches fields, and a load_project prerequisite. This is unusually rich behavioral disclosure for a read tool.
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 purpose and usage are front-loaded, but the output paragraphs are dense, convoluted run-on sentences (e.g., the nested maxResults clause with parenthetical total counters) and repeat details already present in the schema. It is information-rich but not tightly written.
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?
There is no output schema, so the description must explain return values, and it does: superclasses, interfaces, subtypes, totals, truncation flags, unresolvedSupertypes, and potentialMatches semantics. An agent has everything needed to call and interpret 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 coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains that filePath/line/column and typeName are alternative lookup modes, reinforces zero-based coordinates, and specifies the INVALID_PARAMETER consequence of an out-of-range maxResults.
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: 'Get the type hierarchy (supertypes and subtypes) for a Java type,' and the OUTPUT line clarifies it returns the full inheritance chain. It does not explicitly distinguish itself from overlapping siblings like find_implementations, get_type_members, or analyze_type, so it falls short of a 5.
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 USAGE line and the two-mode explanation (file position vs typeName) tell the agent how to invoke it, and 'Requires load_project to be called first' supplies a clear prerequisite. However, it gives no when-to-use-vs-alternative guidance relative to siblings such as find_implementations, so no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_type_membersA
Get all members (methods, fields, nested types) of a specific type.
USAGE: Provide a type name to get all its members OUTPUT: Lists of methods, fields, and nested types with their details
Options:
includeInherited: Also include members from superclasses/interfaces
memberKind: Filter to "method" (constructors included), "field" or "type" only, compared case-insensitively. "field" returns every field, including static final constants and enum constants; each field's kind is field, constant or enumConstant. Any other value is rejected with INVALID_PARAMETER.
With includeInherited, unresolvedSupertypes, present only when there are any, names each supertype the compiler cannot resolve (a missing dependency), as the declaration writes it, with the type whose declaration names it: the members it would give are not listed.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified or simple type name | |
| memberKind | No | Filter, case-insensitive: 'method', 'field' (every field, constants and enum constants included) or 'type'; omit for all | |
| includeInherited | No | Include inherited members (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and discloses useful details: case-insensitive memberKind filtering, rejection of invalid values with INVALID_PARAMETER, and unresolvedSupertypes behavior when includeInherited is set. It still does not explicitly state that the operation is read-only or whether it has side effects, but it covers most invocation-relevant 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 front-loaded with purpose and then organized into USAGE, OUTPUT, and Options sections. The unresolvedSupertypes paragraph is dense and somewhat awkwardly placed, but it contains relevant behavioral information for a tool without an output 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?
Given no annotations and no output schema, the description is complete enough for correct invocation: it states the purpose, required load_project prerequisite, output shape, parameter filtering semantics, inherited-member behavior, and unresolved-supertype handling. An agent can select and call this tool without needing to infer missing critical details.
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 coverage is 100%, but the description adds substantial meaning beyond the schema: it clarifies that memberKind is case-insensitive, that 'method' includes constructors, that 'field' includes constants and enum constants, and that invalid values are rejected with INVALID_PARAMETER. It also explains the includeInherited behavior and the unresolvedSupertypes output detail.
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 gives a specific verb and resource: 'Get all members (methods, fields, nested types) of a specific type.' This clearly separates it from siblings like get_type_hierarchy or get_document_symbols, which address hierarchy or document scope rather than direct member enumeration.
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 includes a short USAGE line, 'Provide a type name to get all its members,' and a prerequisite, 'Requires load_project to be called first.' However, it does not explain when to choose this tool over alternatives such as get_symbol_info or analyze_type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_type_usage_summaryA
Get comprehensive usage summary for a type across the codebase.
USAGE: get_type_usage_summary(typeName="com.example.Foo") OUTPUT: Instantiations, casts, instanceof checks, type arguments, annotations
Aggregates all usage patterns in a single call:
Instantiations (new Foo())
Casts ((Foo) x)
Instanceof checks (x instanceof Foo)
Type arguments (List)
Annotation usages (if annotation type)
Each category's count is the exact number of its usages; its locations list holds the first maxPerCategory of them (1 to 50, default 10; any other value is rejected with INVALID_PARAMETER). totalUsages and meta.totalCount count every usage, meta.returnedCount the locations listed, and meta.truncated is true when a category lists fewer locations than its count. A category's potentialMatches stand beside its locations.
Use this to understand how a type is used throughout the project.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Fully qualified or simple type name | |
| maxPerCategory | No | Maximum locations listed per category, 1 to 50 (default 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it specifies counting semantics (count is exact, locations limited to maxPerCategory), truncation signaling (meta.truncated), the INVALID_PARAMETER rejection for out-of-range maxPerCategory, the prerequisite call, and the meaning of potentialMatches as unconfirmed results never counted as results. This is unusually rich behavioral disclosure.
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?
Front-loaded with purpose, then labeled USAGE/OUTPUT sections, and every paragraph carries real information. Minor waste: the category list appears once in the OUTPUT line and again as bullets, and the potentialMatches paragraph is dense enough to require a second read.
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?
There is no output schema, so the description must describe the return shape, and it does thoroughly (per-category counts, locations, totalUsages, meta.totalCount/returnedCount/truncated, potentialMatches). For a two-param aggregate query this leaves nothing an agent needs 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 coverage is 100%, so both parameters are already documented, but the description goes beyond the schema by stating that any maxPerCategory value other than 1-50 is rejected with INVALID_PARAMETER and by explaining the truncation semantics tied to that parameter. That added meaning lifts it above the baseline 3.
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 scoped to 'a type across the codebase' and enumerates the exact usage categories it aggregates (instantiations, casts, instanceof, type arguments, annotations), which effectively maps it apart from the single-category siblings find_type_instantiations, find_casts, find_instanceof_checks, find_type_arguments and find_annotation_usages. An agent can tell it is the aggregator without opening the schema.
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?
'Use this to understand how a type is used throughout the project' gives clear context, and 'Requires load_project to be called first' states an explicit prerequisite. It does not explicitly say when to prefer this over the individual find_* siblings, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
go_to_definitionA
Navigate to symbol definition.
USAGE: Position cursor on a symbol reference, returns definition location. OUTPUT: File path, line, column of the definition.
IMPORTANT: Uses ZERO-BASED coordinates. If editor shows 'Line 14, Column 5', pass line=13, column=4
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file (absolute or relative to project) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. Discloses zero-based coordinates and prerequisite, but does not mention error handling (e.g., if symbol not found) or read-only nature.
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?
Very concise, with bullet-like structure. Each sentence adds necessary information. No wasted words.
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?
No output schema, but description explains return values (file path, line, column) and includes zero-based hint. Missing error behavior, but overall fairly complete for a simple navigation tool.
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 has 100% coverage with descriptions. Description adds value by explaining zero-based context and that filePath can be absolute or relative, which clarifies usage beyond 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?
Description clearly states 'Navigate to symbol definition', which is a specific verb and resource. It distinguishes from siblings like 'find_references' by focusing on definition location.
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 usage: position cursor, returns definition location. Mentions prerequisite 'load_project' and zero-based coordinates. Lacks explicit when-not-to-use, but purpose is narrow enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkA
Check server status and project state.
USAGE: Call on startup to verify server is operational. OUTPUT: Server status, project info if loaded (a loaded project reports its buildModel summary and any load warnings, as load_project does), capabilities. configuration.timeoutSeconds is the time limit on each tool call that JAVALENS_TIMEOUT_SECONDS sets (5 to 300), or null when no limit is set; a call past the limit answers TIMEOUT. load_project and health_check are never limited.
WORKFLOW:
Call health_check to verify server is running
If no project loaded, call load_project next
Use returned capabilities to understand available features
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It discloses the output shape (server status, project info/buildModel summary, capabilities) and explains timeout behavior, including the JAVALENS_TIMEOUT_SECONDS range and the fact that health_check and load_project are never limited.
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 front-loaded with the core purpose, then cleanly organized into USAGE, OUTPUT, and WORKFLOW sections. Every section adds useful information without wasted wording.
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 zero-parameter, no-annotation, no-output-schema tool, the description is complete: it explains purpose, usage timing, expected return content, timeout behavior, and the recommended next step. An agent can call it correctly without consulting other fields.
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 tool has zero input parameters, so parameter semantics are not applicable. The description does mention a timeout configuration value, but that is not an invocation parameter; baseline 4 is appropriate for a no-parameter tool.
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: 'Check server status and project state.' It is clearly a startup/health diagnostic tool, distinct from siblings such as load_project, and it explains the relationship between them.
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 explicitly says to call on startup, provides a numbered workflow, and names load_project as the next step when no project is loaded. The conditions for use and the alternative path are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inline_methodA
Inline a method call by replacing it with the method body.
Returns the text edit needed to inline the method call. The caller should apply this edit to perform the inlining.
USAGE: Position cursor on a method call OUTPUT: Edit to replace call with method body
IMPORTANT: Uses ZERO-BASED coordinates.
LIMITATIONS:
Method must be in the same project (source available)
Works best with simple methods (no complex control flow)
Single return statement is handled, multiple returns may need review
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of method call | |
| column | Yes | Zero-based column number (on method name) | |
| filePath | Yes | Path to source file containing the method call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully describes behavioral aspects: it returns an edit to be applied, uses zero-based coordinates, and lists limitations. This gives the agent a clear understanding of what to expect.
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 concise and well-structured: purpose, usage, output, important note, limitations, prerequisite. Every sentence adds value, and key information 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?
The description covers purpose, usage, output, limitations, and prerequisites. It lacks details on error handling or edge cases, but for a refactoring tool with no output schema, it is sufficiently complete.
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?
Input schema has 100% coverage, but the description adds valuable context: zero-based coordinates and that column refers to the method name. This goes beyond the schema's field descriptions.
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 clearly states the tool inlines a method call by replacing it with the method body, distinguishing it from siblings like inline_variable which handle variables. The verb 'inline' and resource 'method call' are specific and unambiguous.
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 provides explicit usage instructions ('Position cursor on a method call') and prerequisites ('Requires load_project to be called first'). Limitations are stated (same project, simple methods) but alternative tools like inline_variable are not mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inline_variableA
Inline a local variable by replacing all usages with its initializer expression.
Returns the text edits needed to inline the variable. The caller should apply these edits to perform the inlining.
USAGE: Position cursor on variable declaration or usage OUTPUT: Edits to delete declaration and replace usages with initializer
IMPORTANT: Uses ZERO-BASED coordinates. SAFETY: Will refuse if variable is modified after initialization.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of variable declaration or usage | |
| column | Yes | Zero-based column number | |
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Includes safety check (refuses if variable modified after init), zero-based coordinate reminder, and states that edits need to be applied. Discloses key behavioral traits beyond basic function.
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?
Extremely concise: three short paragraphs with clear headings. First sentence immediately states primary action. Every sentence adds necessary information with no 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?
Covers all critical aspects: prerequisite (load_project), coordinate system, safety condition, and return type (text edits). No output schema, but return type is described. Minor gap: could mention if edits are a list or single, but not essential.
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 coverage is 100% but description adds value by clarifying that line and column reference cursor position on variable declaration or usage, and reminding of zero-based coordinates. This aids correct parameter population.
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?
Clearly states the tool inlines a local variable by replacing usages with initializer, returning text edits. Distinguished from similar siblings like extract_variable by specifying the action of replacing usages.
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 usage instructions: position cursor on declaration or usage, requires load_project first, and mentions safety refusal condition. Lacks explicit 'when not to use' but gives sufficient context for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
introduce_parameter_objectA
Bundle a method's parameters into a new parameter-object class and rewrite the method and all callers to use it. The class is generated as a member of the declaring type.
USAGE: Position on the method name; optionally name the class and parameter. OUTPUT: editsByFile with all required edits; warnings from JDT's condition checking, by the place each names (file, then position; those naming one place in JDT's order, those naming none last). Edits are returned as text - apply them yourself.
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of the method declaration | |
| column | Yes | Zero-based column number (on the method name) | |
| filePath | Yes | Path to source file containing the method | |
| className | No | Name for the parameter-object class (default: <MethodName>Parameters) | |
| parameterName | No | Name for the new parameter (default: parameterObject) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the prerequisite (load_project), that edits are returned as text and must be applied by the caller, and that coordinates are zero-based. It does not discuss safety/reversibility, but for a refactoring generator that is minor.
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?
Front-loaded purpose followed by clearly labeled USAGE, OUTPUT, IMPORTANT, and prerequisite sections. The warning-ordering sentence is dense but informative; overall it earns its length with no filler.
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?
There is no output schema or annotations, so the description must explain the return, and it does: editsByFile with edits and warnings, plus the ordering rule and the apply-it-yourself instruction. Combined with the load_project prerequisite, an agent has enough to invoke and use 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 coverage is 100%, so the schema already documents all five parameters including defaults. The description only restates that class and parameter names are optional, adding no syntax or format detail beyond the schema. Baseline 3 applies.
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 refactoring verb and resource: bundle parameters into a new parameter-object class and rewrite the method plus all callers. It is clearly distinguishable from siblings like extract_method, extract_variable, and change_method_signature.
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 USAGE line says where to position (on the method name) and that class/parameter naming is optional, and it names the prerequisite 'Requires load_project to be called first.' It does not explicitly contrast with alternative refactorings, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_projectA
Load a Java project for analysis. MUST be called before using other analysis tools.
USAGE: load_project(projectPath="/path/to/project") OUTPUT: Project structure summary including packages, source files, buildModel (build system, source of the structure: build-tool, static-read or convention, analysis level, modules) and warnings (present only when the load was degraded)
Supports:
Maven projects (pom.xml)
Gradle projects (settings.gradle, settings.gradle.kts, build.gradle or build.gradle.kts)
Bazel projects (MODULE.bazel or WORKSPACE)
Plain Java projects with src/ directory
WORKFLOW:
Call load_project with absolute path to project root
Wait for project to load (may take a few seconds for large projects)
Use health_check to verify project is loaded
Begin using analysis tools (search_symbols, find_references, etc.)
SYNC (strict mode): answers are always verified against the files on disk - no reload is needed after editing, adding, or deleting source files. Call load_project only on first use, when a response reports RELOAD_REQUIRED (a file the build reads changed), or to rebuild everything from scratch.
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | Yes | Absolute path to the project root directory containing pom.xml or build.gradle |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: supported project types, expected output structure, possible latency ('may take a few seconds'), degraded-load warnings, and strict-mode sync semantics ('answers are always verified against the files on disk - no reload is needed after editing...'). This is rich, non-obvious context.
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 front-loaded with the core purpose and prerequisite status, then uses clear sections (USAGE, OUTPUT, Supports, WORKFLOW, SYNC) to organize the remaining detail. Despite its length, each section serves a distinct operational need.
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 lack of annotations and output schema, the description supplies everything an agent needs: output summary, supported project layouts, workflow order, and reload behavior. No critical context for correct invocation appears to be 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 coverage is 100%, so the schema already defines projectPath as an absolute path to the project root. The description adds an example invocation and expands the supported project files beyond the schema's mention of pom.xml/build.gradle (Bazel, plain Java), which slightly enhances parameter interpretation.
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: 'Load a Java project for analysis.' It immediately distinguishes the tool as a prerequisite ('MUST be called before using other analysis tools'), which cleanly separates it from the many analysis siblings.
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 explicit when-to-use instructions via the WORKFLOW section and the SYNC note, and states when not to call it ('Call load_project only on first use, when a response reports RELOAD_REQUIRED... or to rebuild everything from scratch'). It also names health_check as the verification step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_type_to_new_fileA
Move a member (nested) type into its own top-level file. Non-static member types gain a field referencing the former enclosing instance.
USAGE: Position on the nested type's name. OUTPUT: createdFiles carries the new top-level file content; editsByFile carries the enclosing file's edits; warnings, present only when there is one, JDT's findings from its condition checking, by the place each names (file, then position; those naming one place in JDT's order, those naming none last). Nothing is written - create the file and apply the edits yourself.
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of the nested type declaration | |
| column | Yes | Zero-based column number (on the type name) | |
| filePath | Yes | Path to source file containing the nested type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses the semantic side effect for non-static member types, explains that 'Nothing is written' and the caller must create the file and apply edits, describes the warnings ordering, and flags zero-based coordinates. These are exactly the traits an agent needs before invoking.
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 USAGE/OUTPUT/IMPORTANT headers are a good structural choice and the purpose is front-loaded. However, the OUTPUT sentence is a single convoluted run-on ('warnings, present only when there is one, JDT's findings ... by the place each names (file, then position; ...)') that is hard to parse and undercuts the otherwise tight structure.
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?
With no output schema and no annotations, the description must cover return values and behavior, and it largely does: it names createdFiles, editsByFile, and warnings, plus the non-writing semantics and prerequisite. The only weakness is the dense, hard-to-follow wording of the warnings ordering, which leaves that detail less clear than it could be.
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 100%, so all three parameters are already documented as zero-based. The description reinforces this ('ZERO-BASED coordinates') and clarifies that position must be on the type name, but adds little beyond what the schema already states. Baseline 3 applies.
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: 'Move a member (nested) type into its own top-level file.' This is unmistakably distinct from sibling refactorings like extract_method, pull_up, or push_down. An agent can identify the operation without opening the schema.
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 positioning guidance ('Position on the nested type's name') and a hard prerequisite ('Requires load_project to be called first'). It does not name alternatives or exclusions, but no sibling is a plausible substitute for this specific refactoring, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
organize_importsA
Organize imports in a Java file.
Removes unused imports and sorts remaining imports alphabetically. Returns the organized import block that should replace the existing imports.
USAGE: organize_imports(filePath="path/to/File.java") OUTPUT: Organized import statements and list of changes
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Path to source file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the action (remove unused, sort) and output (organized block and changes), but does not fully disclose whether the file is modified directly or if permissions are needed. No annotations are provided to supplement.
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 concise and front-loaded with the main action. It includes a usage example, output description, and prerequisite without 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?
Sufficient for a simple tool with one parameter and clear output, but lacks details on error handling or edge cases. No output schema is provided, but the description explains the return value.
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 single parameter 'filePath' has a schema description of 'Path to source file', and the description adds no additional semantics. With 100% schema coverage, the baseline score of 3 is appropriate.
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 clearly states the tool organizes imports in a Java file by removing unused imports and sorting alphabetically. It distinguishes from sibling tools like 'suggest_imports' by focusing on organization rather than suggestion.
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 a usage example and explicitly requires 'load_project' to be called first. It does not mention when not to use it or alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pull_upA
Pull a method or field up into the superclass and remove it from the declaring subclass.
USAGE: Position on the member name in the subclass. OUTPUT: editsByFile covering the superclass (member added) and the subclass (member removed); warnings from JDT's condition checking, by the place each names (file, then position; those naming one place in JDT's order, those naming none last). Edits are returned as text - apply them yourself.
The superclass is the Java model's, for local and anonymous classes in and after lambda bodies too. A member is refused when JDT's own type hierarchy leaves that superclass out (a class declared in a lambda body, a local class read by the handle of another of the same name), naming it: JDT's pull up would act on another class. A member is also refused when the superclass has a subclass declared in a lambda body, naming it: JDT's pull up cannot read that class. And a member is refused when JDT's own type hierarchy of the superclass does not hold every subtype with source as the Java model does (a class declared in a lambda body at any depth, a local class held by the handle of another of the same name), naming each type it leaves out and each it holds that is no subtype: JDT's pull up reads the subtypes from that hierarchy.
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of the member declaration | |
| column | Yes | Zero-based column number (on the member name) | |
| filePath | Yes | Path to source file containing the member |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and largely does: it discloses output shape (editsByFile per file), that edits are returned as text and must be applied manually, and the many refusal conditions tied to JDT's type hierarchy quirks. This is substantial behavioral context beyond what any structured field provides.
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 usage/output/prerequisite lines are front-loaded and efficient, but the refusal prose is dense and repetitive, enumerating the same lambda-body and local-class cases multiple times. It is informative yet overlong for the value of the distinction.
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?
With no output schema, the description does explain return values and manual-apply semantics, plus prerequisite and refusal edge cases. It is complete enough to call correctly, only slightly marred by convoluted phrasing of the refusal rules.
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 coverage is 100%, so line/column/filePath are already documented, giving baseline 3. The description adds that coordinates are ZERO-BASED and that the position must land on the member name, which meaningfully sharpens how to supply line and column.
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 (pull up) and resource (method or field) plus the effect (moved to superclass, removed from declaring subclass). This clearly distinguishes it from push_down and extract_superclass among siblings.
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 a positional instruction ("Position on the member name in the subclass") and a prerequisite (load_project), but never says when to choose this over push_down, extract_superclass, or move_type_to_new_file. Usage is implied by the positioning hint rather than stated against alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
push_downA
Push a method or field down into the declaring class's subclasses and remove it from the declaring class.
USAGE: Position on the member name in the superclass. OUTPUT: editsByFile covering the superclass (member removed) and each subclass (member added); warnings from JDT's condition checking, by the place each names (file, then position; those naming one place in JDT's order, those naming none last). Edits are returned as text - apply them yourself.
The direct subclasses are those of the Java model, local and anonymous classes in and after lambda bodies included. A member whose class has an anonymous direct subclass is refused, naming each anonymous subclass: push down cannot add a member to an anonymous class. A member whose class has a direct subclass that JDT's own type hierarchy leaves out (a class declared in a lambda body, a local class read by the handle of another of the same name) is refused, naming each such subclass: JDT's push down would not write the member into it.
IMPORTANT: Uses ZERO-BASED coordinates.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number of the member declaration | |
| column | Yes | Zero-based column number (on the member name) | |
| filePath | Yes | Path to source file containing the member |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: it discloses the output shape (editsByFile per superclass/subclass, warnings ordering), that edits are returned as text and must be applied manually, and the precise refusal conditions (anonymous direct subclasses, JDT-hierarchy-omitted subclasses) with the reasons. This is exactly the behavioral context a mutation tool needs.
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?
Front-loads purpose, then USAGE/OUTPUT/refusals in scannable blocks; nearly every sentence earns its place by conveying a distinct constraint. Slightly verbose in the refusal explanations and the trailing IMPORTANT restates the schema's zero-based note, keeping it out of 5 territory.
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?
No output schema exists, and the description fully covers the return shape, ordering, refusal behavior, and prerequisite; for a refactoring tool with no annotations this is complete enough for an agent to call it correctly and interpret results.
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 coverage is 100%, so line/column/filePath are already documented, giving a baseline of 3. The description adds semantic meaning beyond the schema: coordinates must sit on the member NAME, the target is the declaration in the superclass, and it emphasizes the zero-based convention that the schema only mentions in passing.
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+resource ('Push a method or field down into the declaring class's subclasses and remove it from the declaring class') and the inverse relationship makes it easily distinguishable from the sibling pull_up. An agent can identify the operation without opening the schema.
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 a clear precondition ('Requires load_project to be called first') and placement instruction ('Position on the member name in the superclass'), plus explicit refusal cases that tell the agent when the tool will not work. It does not, however, explicitly contrast with alternatives like pull_up or move_type_to_new_file when the user's intent is ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_symbolA
Rename a symbol (variable, method, field, class, etc.) across the project.
Returns text edits for all occurrences that need to be changed. The caller should apply these edits to perform the rename.
USAGE: Position on symbol, provide new name OUTPUT: List of text edits to apply, and the files to rename
Each edit replaces exactly the symbol's simple name, also where a reference is qualified (an import, a static import, a qualified name in code or in a Javadoc link). An annotation element written as the single value of its annotation, @Tag("x"), is named before that value: @Tag(label = "x").
A type is renamed with its explicit constructors. A top-level type whose file is named after it renames that file: renamedFiles lists it, as {filePath, newFilePath}; apply the edits (editsByFile is keyed by the current paths), then rename the file. renamedFiles is present only when a file is renamed. A top-level type renamed to the name of a file that already exists in its folder is refused: INVALID_PARAMETER.
A method is renamed together with every method it overrides, every method that overrides it and every method a subtype inherits together with it, in and after lambda bodies included, and every call of them. A method of a class file, or a method renamed together with one, is refused, naming that method: it cannot be renamed.
A rename JDT's rename refactoring finds a conflict for is refused: INVALID_PARAMETER for newName, naming every conflict in JDT's words, by the place each names (a name another declaration in scope already has, a reference the renamed element would take over or lose, a unit with syntax errors, a native method, a static import of the new name). The conflicts of a type, a field, a local variable, a type parameter and a private, static or constructor method are those JDT's rename processors find; those of any other method are the conditions of JDT's method rename (RenameMethodProcessor, RenameVirtualMethodProcessor) checked on the Java model's own hierarchy, local and anonymous classes in lambda bodies included. JDT's warnings on a rename that goes ahead (such as a discouraged name, a constructor's name, or a method of the hierarchy with the new name and other parameter types) are listed in warnings, by place; warnings is present only when there is one.
A place JDT's search reports but cannot confirm as a reference, where a type or name does not resolve, is never edited: potentialMatches lists every one, to review by hand. A position on a name the compiler cannot resolve has no symbol to rename: SYMBOL_NOT_FOUND.
IMPORTANT: Uses ZERO-BASED coordinates.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
A module is renamed in its declaration and its references. A package (renamed with its folder, which no text edit does), a package declaration, an import declaration or the import list is refused: INVALID_PARAMETER for position, naming it. So is a type, field or method of a library (binary), which has no source to edit.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | Zero-based line number | |
| column | Yes | Zero-based column number | |
| newName | Yes | New name for the symbol | |
| filePath | Yes | Path to source file containing the symbol |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations provided, the description carries the full behavioral burden and does so exhaustively: it discloses the return shape (text edits to apply, renamedFiles keyed structure), error codes (INVALID_PARAMETER, SYMBOL_NOT_FOUND), which renames are refused and why, warnings semantics, and the zero-based coordinate convention. This is far beyond what the schema conveys.
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 purpose is front-loaded, but the body runs several hundred words of JDT-implementation detail (RenameMethodProcessor, RenameVirtualMethodProcessor, hierarchy checks) that is well past what an agent needs to select and call the tool. potentialMatches is effectively described twice, signaling redundancy rather than economy.
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?
There is no output schema, so the description must explain return values — and it does, covering the edit list, renamedFiles, warnings, and potentialMatches. For a refactoring tool of this complexity, nothing needed to invoke it correctly 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 100%, so the baseline is 3. The description adds real meaning beyond the schema: it explains what newName must satisfy (conflicts are refused), that position on unresolvable names yields SYMBOL_NOT_FOUND, and that positions on packages/imports are refused. This exceeds the baseline.
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 opening states a specific verb+resource+scope: 'Rename a symbol (variable, method, field, class, etc.) across the project.' This clearly distinguishes it from siblings like change_method_signature or move_type_to_new_file, which the agent can rule out without opening schemas.
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 provides clear invocation context ('USAGE: Position on symbol, provide new name') and a hard precondition ('Requires load_project to be called first'). It does not, however, name an alternative refactoring tool or give explicit when-not-to-use conditions beyond the refusal cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_symbolsA
Search the project's source declarations by name pattern. Supports glob patterns: * (any chars), ? (single char)
USAGE: search_symbols(query="*Service", kind="class") OUTPUT: One page of matching declarations with locations
KIND (optional, compared case-insensitively):
class, interface, enum, record, annotation: exactly the types of that kind (class excludes interfaces, enums, records and annotation types)
method: method declarations (constructors are not included, and lambda expressions are not method declarations)
field: every field declaration, including static final constants and enum constants; each result's kind is field, constant or enumConstant (record components are not field declarations) Without kind, every type is searched (no methods or fields). Any other kind is rejected with INVALID_PARAMETER. Anonymous classes have no name to match and are never results.
A method's or field's containingType is its declaring type's fully qualified name (pkg.Outer$Inner; an anonymous class is pkg.Outer$1). A type in the default package reports its package as "(default package)".
EXAMPLES:
search_symbols(query="Order*") - types starting with Order
search_symbols(query="*Repository", kind="interface")
search_symbols(query="get*", kind="method")
search_symbols(query="log", kind="field")
PAGINATION: the kind and pattern filters apply first, then offset and maxResults select the page. meta.totalCount counts every matching declaration; pagination.hasMore (and meta.truncated) is true when more follow this page, so request offset + returned next. maxResults outside 0 to 1000 is INVALID_PARAMETER.
A query naming the declaring type (Type.member) makes JDT resolve each declaration of the name and keep those of that type and its subtypes; one in a type whose own supertypes do not all resolve may be in that hierarchy, and is a potential match, never a result.
potentialMatches, present only when there are any, holds the places JDT's search reports as possible matches but cannot confirm, because a type or name there does not resolve (a missing dependency or a compile error): count is their exact number, and locations lists them, as many as the results it stands beside may list. They are never counted or listed as results.
IMPORTANT: Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Optional, case-insensitive: class, interface, enum, record, annotation, method or field. Omit to search every type. field includes static final constants and enum constants. | |
| query | Yes | Search pattern - supports * and ? wildcards | |
| offset | No | Skip the first N matching declarations (default 0) | |
| maxResults | No | Max results to return, 0 to 1000 (default 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses pagination mechanics (filters apply before offset/maxResults, hasMore/truncated semantics), INVALID_PARAMETER rejection for bad kind and out-of-range maxResults, case-insensitive kind matching, anonymous classes never being results, and the potentialMatches caveat for unresolvable types. This is unusually rich behavioral disclosure for a search tool.
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?
Front-loaded correctly with purpose, usage, output, then per-kind detail, pagination, and edge cases. It is long, but for a tool with this many subtle semantics most sentences earn their place; the JDT-resolution and potentialMatches paragraphs are the most verbose and could be tightened.
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?
No output schema exists, so the description must explain returns, and it does: one page of matching declarations with locations, the meta.totalCount/pagination.hasMore fields, and the conditional potentialMatches structure. Combined with the load_project prerequisite, an agent has everything needed to call and interpret this 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 coverage is already 100%, but the description adds substantial meaning beyond it: exactly what each kind includes and excludes (class excludes interfaces/enums/records; method excludes constructors and lambdas; field covers constants and enum constants), the case-insensitive comparison, and the ordering of filter vs pagination parameters.
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: 'Search the project's source declarations by name pattern,' with the glob semantics made explicit. It is clearly distinct from usages-oriented siblings like find_references, but it never names or contrasts any sibling explicitly, so it falls short of the 5 bar.
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 a concrete USAGE line, four worked examples, and states the prerequisite ('Requires load_project to be called first') plus the kind-omitted behavior. However, it never says when to prefer this over sibling search tools such as get_document_symbols or find_references, so no explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_importsA
Find import candidates for unresolved type.
USAGE: suggest_imports(typeName="List") OUTPUT: List of matching types with fully qualified names and relevance
Searches project sources, JDK, and libraries for types matching the simple name that the project can import: a type in the default package, or in a package its module does not export to the project (such as the JDK's internal packages), is never a candidate; the package's name never decides. Every candidate is ranked by relevance (java.util types ranked higher than java.awt, etc.; equally relevant ones by fully qualified name), then the first maxResults are returned. totalCandidates and meta.totalCount count every candidate; meta.truncated is true when candidates are left out.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| typeName | Yes | Simple type name to find imports for (e.g., 'List', 'Map') | |
| maxResults | No | Maximum candidates to return (default 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does so: it discloses the search scope (project sources, JDK, libraries), the exclusion rule (default-package and non-exported packages are never candidates), the ranking algorithm (relevance, then fully qualified name), and the truncation contract (totalCandidates/meta.totalCount count all candidates while meta.truncated flags omissions). That is unusually rich behavioral disclosure for a read-only query tool.
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?
Front-loaded with purpose, then USAGE, then OUTPUT, then the detailed rules — a well-ordered structure. The middle paragraph is dense and slightly run-on around the package-export clause, but every sentence carries information an agent needs to interpret candidate eligibility and ordering.
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?
There is no output schema, yet the description still specifies the return shape (matching types with fully qualified names and relevance) plus the count/truncation metadata, and it names the load_project prerequisite. For a two-parameter query tool, nothing an agent needs to call it correctly 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 coverage is 100%, so typeName and maxResults are already documented, establishing a baseline of 3. The description goes beyond that by explaining what maxResults actually cuts ('then the first maxResults are returned') and how it relates to totalCandidates and meta.truncated, which is genuine semantic value not present in the 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 import candidates for unresolved type') and immediately scopes it to the missing-import problem, which cleanly separates it from siblings like organize_imports (which applies imports) and search_symbols (which searches by name without import viability filtering). An agent can route to it without opening the schema.
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 USAGE line gives a concrete invocation example and 'Requires load_project to be called first' supplies a hard prerequisite that would otherwise cause a failed call. It stops short of explicitly naming organize_imports or stating when-not-to-use it, so 5 is not warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_syntaxA
Quick syntax-only validation for a file or inline code.
USAGE: validate_syntax(filePath="...") or validate_syntax(content="...") OUTPUT: Syntax errors (no semantic analysis for speed)
Much faster than get_diagnostics - use for quick syntax checks.
Requires load_project to be called first.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | Inline Java source code to validate (alternative to filePath) | |
| fileName | No | Optional filename for inline content (default: Untitled.java) | |
| filePath | No | Path to source file to validate |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses no semantic analysis and output type (Syntax errors), but lacks details on error format. No annotations provided, so description carries burden; the disclosure is adequate.
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?
Four sentences, front-loaded with purpose, every sentence earns its place.
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 purpose, usage, prerequisite, and output nature well for a simple tool, but could briefly mention return type or format.
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 coverage is 100%, baseline 3. Description adds usage examples and optional filename context, adding value.
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?
Clearly states 'Quick syntax-only validation' for file or inline code, differentiating from siblings like get_diagnostics.
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?
Explicitly says 'Use for quick syntax checks', contrasts with get_diagnostics for semantic analysis, and notes prerequisite load_project.
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.
19 tool updates
v1.5.3- Changed
analyze_change_impact1 field changed- changed
Input schema / properties / depth / descriptionPrevious value: -"Levels of transitive callers to follow (default 1, max 3)"New value: +"Levels of transitive callers to follow, 1 to 3 (default 1)"
- Changed
analyze_method2 fields changed- changed
Input schema / properties / maxCallees / descriptionPrevious value: -"Maximum callees to return (default 50)"New value: +"Maximum callees listed (default 50); callees.count counts all" - changed
Input schema / properties / maxCallers / descriptionPrevious value: -"Maximum callers to return (default 20)"New value: +"Maximum callers listed (default 20); callers.count counts all"
- Changed
analyze_type1 field changed- changed
Input schema / properties / maxUsages / descriptionPrevious value: -"Max usages per category (default 10)"New value: +"Max usages per category, 0 or more (default 10)"
- Changed
change_method_signature2 fields changed- changed
Input schema / properties / newParameters / descriptionPrevious value: -"New parameter list. Each item: {name, type, defaultValue?}. Order matters."New value: +"New parameter list. Each item: {name, type, oldName?, defaultValue?}. Order matters." - added
Input schema / properties / newParameters / items / properties / oldNameAdded value: +{ + "description": "The parameter's current name, when it is renamed to name", + "type": "string" +}
- Changed
find_circular_dependencies1 field changed- changed
Input schema / properties / maxCycleLength / descriptionPrevious value: -"Maximum cycle length to report (default: 10)"New value: +"Maximum cycle length to report, 2 or more (default: 10)"
- Changed
find_field_writes1 field changed- changed
Input schema / properties / maxResults / descriptionPrevious value: -"Max write locations to return (default 100)"New value: +"Max write locations to return, 0 to 1000 (default 100)"
- Changed
find_implementations1 field changed- changed
Input schema / properties / maxResults / descriptionPrevious value: -"Max implementations to return (default 100)"New value: +"Max implementations to return, 0 to 1000 (default 100)"
- Changed
find_possible_bugs1 field changed- changed
Input schema / properties / severity / descriptionPrevious value: -"Filter by severity: high, medium, low, all (default: all)"New value: +"Filter by severity, case-insensitive: high, medium, low or all (default: all)"
- Changed
find_references1 field changed- changed
Input schema / properties / maxResults / descriptionPrevious value: -"Max references to return (default 100)"New value: +"Max references to return, 0 to 1000 (default 100)"
- Changed
get_call_hierarchy_incoming1 field changed- changed
Input schema / properties / maxResults / descriptionPrevious value: -"Max callers to return (default 50)"New value: +"Max callers to return, 0 to 500 (default 50)"
- Changed
get_complexity_metrics1 field changed- removed
Input schema / properties / granularityRemoved value: -{ - "description": "Level of detail: 'file', 'type', or 'method' (default: 'file')", - "type": "string" -}
- Changed
get_dependency_graph1 field changed- changed
Input schema / properties / depth / descriptionPrevious value: -"How deep to follow dependencies (default: 1)"New value: +"How deep to follow dependencies, 1 or more (default: 1)"
- Changed
get_diagnostics1 field changed- changed
Input schema / properties / severity / descriptionPrevious value: -"Filter by severity: 'error', 'warning', or 'all' (default: 'all')"New value: +"Filter by severity, case-insensitive: 'error', 'warning' or 'all' (default: 'all')"
- Changed
get_document_symbols1 field changed- changed
Input schema / properties / maxResults / descriptionPrevious value: -"Maximum symbols to return (default 500)"New value: +"Maximum symbols to return, 0 to 2000 (default 500)"
- Changed
get_project_structure1 field changed- changed
Input schema / properties / maxDepth / descriptionPrevious value: -"Maximum package depth to show (default 10)"New value: +"Maximum package depth to show, 1 to 20 (default 10)"
- Changed
get_type_hierarchy2 fields changed- removed
Input schema / properties / maxDepthRemoved value: -{ - "description": "Maximum depth of hierarchy to return (default 10)", - "type": "integer" -} - added
Input schema / properties / maxResultsAdded value: +{ + "description": "Most entries each list holds, 1 to 50 (default 10)", + "type": "integer" +}
- Changed
get_type_members1 field changed- changed
Input schema / properties / memberKind / descriptionPrevious value: -"Filter: 'method', 'field', 'type', or null for all"New value: +"Filter, case-insensitive: 'method', 'field' (every field, constants and enum constants included) or 'type'; omit for all"
- Changed
get_type_usage_summary1 field changed- changed
Input schema / properties / maxPerCategory / descriptionPrevious value: -"Maximum results per category (default 10)"New value: +"Maximum locations listed per category, 1 to 50 (default 10)"
- Changed
search_symbols3 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"Filter by kind: class, interface, enum, method, field"New value: +"Optional, case-insensitive: class, interface, enum, record, annotation, method or field. Omit to search every type. field includes static final constants and enum constants." - changed
Input schema / properties / maxResults / descriptionPrevious value: -"Max results to return (default 50)"New value: +"Max results to return, 0 to 1000 (default 50)" - changed
Input schema / properties / offset / descriptionPrevious value: -"Skip first N results for pagination"New value: +"Skip the first N matching declarations (default 0)"
6 tool updates
v1.5.0- Changed
analyze_change_impact2 fields changed- added
Input schema / properties / maxResultsAdded value: +{ + "description": "Cap on affectedMethods in transitive mode (default 200)", + "type": "integer" +} - added
Input schema / properties / transitiveAdded value: +{ + "description": "Full reverse closure over the project graph, no depth ceiling (default false)", + "type": "boolean" +}
- Changed
analyze_data_flow2 fields changed- added
Input schema / properties / followCallsAdded value: +{ + "description": "Track null/taint facts across method calls (default false)", + "type": "boolean" +} - added
Input schema / properties / maxCallDepthAdded value: +{ + "description": "Call-edge bound for followCalls (default 2, min 1)", + "type": "integer" +}
- Added
find_affected_tests - Added
find_unreachable_code - Added
get_http_endpoints - Added
get_jpa_model
8 tool updates
v1.4.1- Added
apply_cleanup - Added
diagnose_and_fix - Added
encapsulate_field - Added
extract_superclass - Added
introduce_parameter_object - Added
move_type_to_new_file - Added
pull_up - Added
push_down
63 tool updates
v1.3.4- Added
analyze_change_impact - Added
analyze_control_flow - Added
analyze_data_flow - Added
analyze_file - Added
analyze_method - Added
analyze_type - Added
apply_quick_fix - Added
change_method_signature - Added
convert_anonymous_to_lambda - Added
extract_constant - Added
extract_interface - Added
extract_method - Added
extract_variable - Added
find_annotation_usages - Added
find_casts - Added
find_catch_blocks - Added
find_circular_dependencies - Added
find_field_writes - Added
find_implementations - Added
find_instanceof_checks - Added
find_large_classes - Added
find_method_references - Added
find_naming_violations - Added
find_possible_bugs - Added
find_references - Added
find_reflection_usage - Added
find_tests - Added
find_throws_declarations - Added
find_type_arguments - Added
find_type_instantiations - Added
find_unused_code - Added
get_call_hierarchy_incoming - Added
get_call_hierarchy_outgoing - Added
get_classpath_info - Added
get_complexity_metrics - Added
get_dependency_graph - Added
get_di_registrations - Added
get_diagnostics - Added
get_document_symbols - Added
get_enclosing_element - Added
get_field_at_position - Added
get_hover_info - Added
get_javadoc - Added
get_method_at_position - Added
get_project_structure - Added
get_quick_fixes - Added
get_signature_help - Added
get_super_method - Added
get_symbol_info - Added
get_type_at_position - Added
get_type_hierarchy - Added
get_type_members - Added
get_type_usage_summary - Added
go_to_definition - Added
health_check - Added
inline_method - Added
inline_variable - Added
load_project - Added
organize_imports - Added
rename_symbol - Added
search_symbols - Added
suggest_imports - Added
validate_syntax
63 tool updates
v1.3.3- Removed
analyze_change_impact - Removed
analyze_control_flow - Removed
analyze_data_flow - Removed
analyze_file - Removed
analyze_method - Removed
analyze_type - Removed
apply_quick_fix - Removed
change_method_signature - Removed
convert_anonymous_to_lambda - Removed
extract_constant - Removed
extract_interface - Removed
extract_method - Removed
extract_variable - Removed
find_annotation_usages - Removed
find_casts - Removed
find_catch_blocks - Removed
find_circular_dependencies - Removed
find_field_writes - Removed
find_implementations - Removed
find_instanceof_checks - Removed
find_large_classes - Removed
find_method_references - Removed
find_naming_violations - Removed
find_possible_bugs - Removed
find_references - Removed
find_reflection_usage - Removed
find_tests - Removed
find_throws_declarations - Removed
find_type_arguments - Removed
find_type_instantiations - Removed
find_unused_code - Removed
get_call_hierarchy_incoming - Removed
get_call_hierarchy_outgoing - Removed
get_classpath_info - Removed
get_complexity_metrics - Removed
get_dependency_graph - Removed
get_di_registrations - Removed
get_diagnostics - Removed
get_document_symbols - Removed
get_enclosing_element - Removed
get_field_at_position - Removed
get_hover_info - Removed
get_javadoc - Removed
get_method_at_position - Removed
get_project_structure - Removed
get_quick_fixes - Removed
get_signature_help - Removed
get_super_method - Removed
get_symbol_info - Removed
get_type_at_position - Removed
get_type_hierarchy - Removed
get_type_members - Removed
get_type_usage_summary - Removed
go_to_definition - Removed
health_check - Removed
inline_method - Removed
inline_variable - Removed
load_project - Removed
organize_imports - Removed
rename_symbol - Removed
search_symbols - Removed
suggest_imports - Removed
validate_syntax
63 tool updates
v1.2.0- First observed
analyze_change_impact - First observed
analyze_control_flow - First observed
analyze_data_flow - First observed
analyze_file - First observed
analyze_method - First observed
analyze_type - First observed
apply_quick_fix - First observed
change_method_signature - First observed
convert_anonymous_to_lambda - First observed
extract_constant - First observed
extract_interface - First observed
extract_method - First observed
extract_variable - First observed
find_annotation_usages - First observed
find_casts - First observed
find_catch_blocks - First observed
find_circular_dependencies - First observed
find_field_writes - First observed
find_implementations - First observed
find_instanceof_checks - First observed
find_large_classes - First observed
find_method_references - First observed
find_naming_violations - First observed
find_possible_bugs - First observed
find_references - First observed
find_reflection_usage - First observed
find_tests - First observed
find_throws_declarations - First observed
find_type_arguments - First observed
find_type_instantiations - First observed
find_unused_code - First observed
get_call_hierarchy_incoming - First observed
get_call_hierarchy_outgoing - First observed
get_classpath_info - First observed
get_complexity_metrics - First observed
get_dependency_graph - First observed
get_di_registrations - First observed
get_diagnostics - First observed
get_document_symbols - First observed
get_enclosing_element - First observed
get_field_at_position - First observed
get_hover_info - First observed
get_javadoc - First observed
get_method_at_position - First observed
get_project_structure - First observed
get_quick_fixes - First observed
get_signature_help - First observed
get_super_method - First observed
get_symbol_info - First observed
get_type_at_position - First observed
get_type_hierarchy - First observed
get_type_members - First observed
get_type_usage_summary - First observed
go_to_definition - First observed
health_check - First observed
inline_method - First observed
inline_variable - First observed
load_project - First observed
organize_imports - First observed
rename_symbol - First observed
search_symbols - First observed
suggest_imports - First observed
validate_syntax
TDQS
Scored across 75 tools
Many tools overlap in purpose: composite analyzers (analyze_file, analyze_type, analyze_method) duplicate granular tools, and multiple position-based info tools (get_symbol_info, get_hover_info, get_type_at_position, get_javadoc) retrieve similar data. Descriptions clarify intended use, but the large set of near-neighbors creates meaningful misselection risk.
Consistent snake_case with a verb_noun pattern for the vast majority (find_references, get_type_hierarchy, extract_method, apply_quick_fix). A few outliers like health_check, pull_up, and push_down lack a clear verb_noun form, but remain readable and stylistically consistent.
75 tools is far beyond the typical 3-15 range and exceeds the 50+ threshold for extreme mismatch. The breadth of Java analysis features justifies many tools, but the set is excessively large and will severely burden tool selection.
Covers navigation, search, refactoring, diagnostics, metrics, dependency analysis, framework detection (Spring, JPA, JAX-RS), tests, and impact analysis. Only minor gaps like extract class or safe delete exist; the core Java code intelligence lifecycle is fully represented.
Maintenance
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personal…
MCP Server for JFrog, providing tools for development and artifact management.
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
MCP server for developer documentation, generated by doc2mcp.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for comprehensive code analysis, navigation, and quality assessment across 25+ programming languages.988MIT
- AlicenseAqualityCmaintenanceA high-performance MCP server that bridges AI agents with Java codebases, providing professional-grade Java language intelligence via Eclipse JDT.LS.154 npm3GPL 3.0
- AlicenseBqualityDmaintenanceA high-performance MCP server for intelligent documentation search, proactive bug detection, and semantic analysis of codebases.2515 npmMIT
- AlicenseBqualityBmaintenanceA Codex MCP server that provides low-token Java semantic navigation using source indexing and optionally JDT Language Server for enhanced symbol, references, and diagnostics.71Apache 2.0