jons-mcp-java
The jons-mcp-java server provides Java language intelligence powered by Eclipse JDT.LS, enabling code navigation, symbol lookup, diagnostics, refactoring previews, and server management for Gradle-based Java workspaces.
Code Navigation:
definition– Navigate to a symbol's definition at a given positiontype_definition– Navigate to a symbol's type definitionimplementation– Find all concrete implementations of an interface or abstract methodreferences– Find all references to a symbol across the workspace, with pagination and optional declaration inclusion
Symbol Information & Search:
symbol_info– Get hover-style Javadoc and type information for a symboldocument_symbols– List all symbols (classes, methods, fields, etc.) in a Java file, with paginationworkspace_symbols– Search for symbols by query string across the entire workspace, with pagination
Code Quality & Refactoring:
diagnostics– Fetch fresh compiler diagnostics (errors, warnings) for a Java file, with paginationpreview_rename– Preview a rename refactoring across the project without writing any changes to disk
Server Management:
restart_server– Stop one or all JDT.LS clients and clear runtime state; servers restart lazily on next use
Key Behaviors:
All positions are one-based (line and character)
Paths can be workspace-relative, absolute, or
file://URIs; paths outside the workspace root are rejectedJDT.LS initializes lazily on the first file-backed call and may return an
initializingstatus on first useEnsures data freshness by tracking open LSP documents and comparing disk metadata before returning results
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jons-mcp-javashow me all references to the UserService class"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
jons-mcp-java
MCP server that provides Java language intelligence through Eclipse JDT.LS.
Released packages are available from PyPI. Development versions can also be run from a source checkout or directly from GitHub.
The current public API is aligned with jons-mcp-typescript: public positions
are one-based, successful tool responses use structured items and pagination
shapes, and refactoring previews are read-only.
Requirements
Python 3.10+
Java 21+
Eclipse JDT.LS
A target Java workspace containing Gradle project markers:
settings.gradle,settings.gradle.kts,build.gradle, orbuild.gradle.kts
On macOS with Homebrew:
brew install openjdk@21 jdtlsIf Java is not on your PATH, set JAVA_HOME. If JDT.LS is installed somewhere
custom, set JDTLS_HOME. The server also tries to resolve a jdtls
executable on PATH.
If JDTLS_HOME points at a read-only install such as the Nix store, the server
copies the small platform config_<os> directory into a writable cache under
$XDG_CACHE_HOME/jons-mcp-java or ~/.cache/jons-mcp-java. Set
JDTLS_CONFIG_DIR to choose a specific writable configuration directory. The
cached copy is repaired to be user-writable even when the source archive or
package ships read-only mode bits.
Related MCP server: Codex LSP Bridge
Install and Run
From PyPI:
uvx jons-mcp-java /path/to/java-workspaceFrom a source checkout:
git clone git@github.com:jonmmease/jons-mcp-java.git
cd jons-mcp-java
uv sync
uv run jons-mcp-java /path/to/java-workspaceFrom GitHub without a persistent checkout:
uvx --from git+https://github.com/jonmmease/jons-mcp-java.git \
jons-mcp-java /path/to/java-workspacePass the Java workspace root as the optional positional argument, or set
JONS_MCP_JAVA_WORKSPACE. The positional argument takes precedence. If neither
is provided, the server uses the MCP process current working directory. All
relative tool paths are resolved from this workspace root.
MCP Client Examples
Claude Code using PyPI:
claude mcp add jons-mcp-java \
-- uvx jons-mcp-java /path/to/java-workspaceClaude Code using a source checkout:
claude mcp add jons-mcp-java \
-- uv run --project /path/to/jons-mcp-java \
jons-mcp-java /path/to/java-workspaceClaude Code using GitHub:
claude mcp add jons-mcp-java \
-- uvx --from git+https://github.com/jonmmease/jons-mcp-java.git \
jons-mcp-java /path/to/java-workspaceCodex CLI using PyPI:
codex mcp add jons-mcp-java \
-- uvx jons-mcp-java /path/to/java-workspaceCodex CLI using GitHub:
codex mcp add jons-mcp-java \
-- uvx --from git+https://github.com/jonmmease/jons-mcp-java.git \
jons-mcp-java /path/to/java-workspace.mcp.json:
{
"mcpServers": {
"jons-mcp-java": {
"command": "uvx",
"args": [
"jons-mcp-java",
"/path/to/java-workspace"
]
}
}
}Codex TOML:
[mcp_servers.jons-mcp-java]
command = "uvx"
args = [
"jons-mcp-java",
"/path/to/java-workspace",
]Workspace and Path Behavior
The configured workspace root is the filesystem security boundary.
Tool paths may be workspace-relative paths, absolute in-workspace paths, or
file://URIs.Relative paths are resolved from the configured workspace root, not from the MCP server process cwd.
Paths containing
.., paths outside the workspace, non-file URIs, malformed URIs, missing files, and symlink escapes are rejected before any filesystem or JDT.LS access.LSP locations outside the workspace may still be returned with
"inWorkspace": false, but the server does not open or read external files.
Path and startup failures use a stable error shape:
{
"status": "error",
"error": {
"type": "path_outside_workspace",
"message": "Path resolves outside the configured workspace root.",
"path": "../outside.java"
}
}Available Tools
Tool | Description |
| Go to symbol definition |
| Find all references to a symbol |
| Find implementations of interfaces/abstract methods |
| Go to type definition |
| List symbols in a file |
| Search symbols in an initialized project |
| Get fresh diagnostics for one file |
| Get hover-style Javadoc and type information |
| Preview symbol rename edits without writing files |
| Stop one or all JDT.LS clients and clear runtime state |
The first file-backed call for a project starts JDT.LS lazily and usually returns:
{
"status": "initializing",
"message": "Starting project initialization; please retry shortly.",
"project": "/path/to/java-workspace/app"
}Retry the same tool after initialization finishes.
Tool Behavior
Tools that accept or return line and character use one-based positions,
matching editor and agent Read output. If your editor shows line 28, pass
line=28; returned ranges use the same convention. Use document_symbols to
discover one-based symbol ranges when you do not already know a position.
Successful navigation tools return normalized items:
{
"items": [
{
"uri": "file:///path/to/Main.java",
"range": {
"start": { "line": 12, "character": 8 },
"end": { "line": 12, "character": 12 }
},
"inWorkspace": true
}
],
"totalItems": 1
}references, document_symbols, workspace_symbols, and diagnostics return
paginated results with items, totalItems, offset, limit, hasMore, and
nextOffset.
Navigation tools preserve JDT.LS result order and return items plus
totalItems. references, diagnostics, and symbol lists are sorted
deterministically before pagination.
preview_rename is safe to inspect. It returns a flat list of file URI,
one-based replacement range, newText, and inWorkspace values, plus
totalEdits. It does not write to disk.
Freshness and Restart
The server tracks open LSP documents and compares disk metadata plus content
hashes before read-style tool calls. If a file changed outside JDT.LS, the
server sends a full-document didChange and didSave before requesting fresh
language data.
diagnostics is file-scoped and always refreshes the target file before
returning compiler diagnostics.
Use restart_server only as a fallback:
{ "file_path": "app/src/main/java/example/Main.java" }With no file_path, restart_server stops all active JDT.LS clients. Servers
restart lazily on the next file-backed tool call.
Troubleshooting
JDT.LS not found: install JDT.LS, putjdtlson PATH, or setJDTLS_HOME.Java 21+ required: install Java 21+ or setJAVA_HOME.project_not_found: the file is inside the workspace, but not under a discovered Gradle root.path_outside_workspace: the path resolves outside the configured workspace root.project_startup_failed: the project import failed; check the JDT.LS stderr log under the generated workspace data directory in~/.cache/jdtls-workspaces.Read-only
JDTLS_HOME: setJDTLS_CONFIG_DIRto a writable directory, or let the server create and permission-repair its cached config copy automatically.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jonmmease/jons-mcp-java'
If you have feedback or need assistance with the MCP directory API, please join our Discord server