Skip to main content

Debug live JVMs through JDWP — from any MCP-compatible agent

Project description

jdwp-mcp

Debug live JVMs through JDWP — from any MCP-compatible agent.

License: MIT

Attach to a running Java process, pause threads, inspect stacks and objects, set breakpoints, and evaluate state — through natural language. One prompt starts an agent-driven diagnosis loop with live runtime data.

Works with Claude Code, Codex, Cursor, or any MCP-compatible agent.

See it in action

A service query is hanging. Find the root cause:

> Attach to localhost:5005 and find out why a query is stuck.

The agent attaches, pauses all threads, and scans for the problem:

connected localhost:5005
paused
24 threads, 2 blocked

Thread pool-3-thread-7 is waiting for a monitor lock:
#0 RolapResult.loadMembers:142
  monitor=@3f2a  state=BLOCKED
#1 RolapResult.execute:89

Lock is held by pool-3-thread-2, which is running:
#0 SqlStatement.execute:218
  sql="SELECT ... FROM fact_table"   -- full scan on 36M rows

Root cause: the query bypassed the aggregate table and fell back to
a full fact-table scan. Thread-7 is waiting for thread-2 to finish.

One prompt. Six tool calls. Lock contention and root cause identified.

Quick Start

1. Install

pip install jdwp-mcp
Alternative install methods
# Pre-built binary
curl -fsSL https://raw.githubusercontent.com/dronsv/jdwp-mcp/main/install.sh | sh

# Cargo (requires Rust)
cargo install --git https://github.com/dronsv/jdwp-mcp

# From source
git clone https://github.com/dronsv/jdwp-mcp && cd jdwp-mcp && cargo build --release

2. Configure your agent

claude mcp add jdwp jdwp-mcp
Other agents

For Codex, Cursor, or other MCP-compatible agents, add to .mcp.json:

{
  "mcpServers": {
    "jdwp": {
      "command": "jdwp-mcp"
    }
  }
}

3. Start your Java app with JDWP

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar app.jar

4. Debug

Attach to localhost:5005 and set a breakpoint at com.example.MyService line 42

First prompts

Attach to localhost:5005
List all threads and show which are blocked
Set a breakpoint at com.example.MyController line 65
When the breakpoint hits, show the stack and all variables
Pause the JVM and find threads waiting on locks

Best first use cases

  • Hung requests and deadlocks
  • Blocked thread pools
  • Suspicious SQL or runtime state mismatch
  • Breakpoint-driven diagnosis without IDE access
  • Remote debugging via kubectl port-forward

Why this instead of jstack or an IDE?

  • Works inside your agent — no tool switching, no separate debugger window
  • Combines attach + inspect + reasoning in one loop — the agent decides what to look at next
  • Conversational — describe the problem, the agent runs the debug session
  • Ground truth for large codebases — in complex projects with deep framework stacks (Spring, Hibernate, OLAP engines), agents can get lost tracing code paths statically. Live debugging gives the agent actual runtime state: which thread holds the lock, what SQL was generated, what value a variable actually has right now

Tools

Connection and control attach, disconnect, pause, continue, step into/over/out

Breakpoints and events set_breakpoint (with conditions), clear, list, exception_breakpoint, watch (field modification), wait_for_event

Inspection get_stack (auto-resolves objects), get_variable, inspect, eval, set_value, snapshot, find_class, list_methods, list_threads, vm_info

Tracing trace (arm method-level tracing on a package), trace_result (get the call path)

Don't use it for

  • Postmortem heap analysis
  • Always-on production observability
  • Environments where JDWP attach or thread pausing is operationally unsafe

Operational note

JDWP changes runtime behavior. Pausing threads and setting breakpoints may be disruptive. Use carefully in production; prefer staging environments or controlled maintenance windows.

Deploy scenarios

See docs/deploy.md for setup with Maven, Gradle, Tomcat, Docker, Kubernetes (port-forward), and SSH tunnels.

Examples

Architecture

Agent  -->  MCP Server  -->  JDWP Client  -->  TCP  -->  JVM
              |
        Translates tool calls to JDWP,
        tracks session state, summarizes
        runtime objects for the agent.

Building from source

cargo build --release
cargo test

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jdwp_mcp-0.3.0.tar.gz (75.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jdwp_mcp-0.3.0-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file jdwp_mcp-0.3.0.tar.gz.

File metadata

  • Download URL: jdwp_mcp-0.3.0.tar.gz
  • Upload date:
  • Size: 75.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for jdwp_mcp-0.3.0.tar.gz
Algorithm Hash digest
SHA256 fee571a20a80b36eb7b4cccfab19c2af0fdc781a2f3728b1eae9a1a7d068f6b1
MD5 8a0a6c2398d078d05de430fc410500ca
BLAKE2b-256 7ed204ae96fd7f17c2054d42998e62de3b06782b03b27db618e7bb049b669e7c

See more details on using hashes here.

Provenance

The following attestation bundles were made for jdwp_mcp-0.3.0.tar.gz:

Publisher: release.yml on dronsv/jdwp-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file jdwp_mcp-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: jdwp_mcp-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for jdwp_mcp-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6499aa4c0dac480afe75716cadb64fa423f605f74a2e969750557141176c7dde
MD5 892b7048bbaa291049c53442b774202c
BLAKE2b-256 1b6d71e9d1ae95a7b08ea46a72184b157417776486cf71f6ee11ebceb73538a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for jdwp_mcp-0.3.0-py3-none-any.whl:

Publisher: release.yml on dronsv/jdwp-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page