一个基于 Model Context Protocol (MCP) 的 Java 调试服务器,允许 LLM 通过 MCP 协议与 Java 虚拟机进行交互,实现断点调试、变量监控等功能。
| 文档 | 说明 |
|---|---|
| QUICKSTART.md | 快速入门 - 5 分钟快速开始 |
| USER_GUIDE.md | 使用指南 - 完整的安装和使用文档 |
| TEST.md | 测试指南 - 如何测试 MCP 服务器 |
┌─────────────────┐ stdio/HTTP ┌──────────────────────┐
│ Claude/LMM │ ◄──────────────────► │ MCP Server (Java) │
└─────────────────┘ └──────────────────────┘
│
│ JDI (JDWP)
▼
┌──────────────────────┐
│ Target JVM │
│ (debuggee) │
└──────────────────────┘
cd E:/java_workspace/debug_mcp
mvn clean package构建完成后,JAR 文件位于 target/debug-mcp-1.0.0.jar
首先启动目标程序并启用 JDWP 调试:
java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=y -cp /path/to/classes com.example.MainJDWP 参数说明:
transport=dt_socket: 使用 socket 传输server=y: JVM 作为服务器等待连接address=8000: 监听端口 8000suspend=y: 启动时等待调试器连接 (使用suspend=n立即启动)
编辑 Claude Desktop 配置文件:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"java-debugger": {
"command": "java",
"args": [
"-jar",
"E:/java_workspace/debug_mcp/target/debug-mcp-1.0.0.jar"
],
"env": {}
}
}
}重启后,在对话中可以使用调试工具。
| 工具名称 | 功能 | 参数 |
|---|---|---|
connect_attach |
附加到运行中的 JVM | host (默认: localhost), port |
connect_launch |
启动并调试新进程 | mainClass, classpath, vmArgs, programArgs |
disconnect |
断开连接 | - |
set_breakpoint |
设置断点 | className, lineNumber |
clear_breakpoint |
清除断点 | breakpointId |
list_breakpoints |
列出所有断点 | - |
continue_execution |
继续执行 | threadId (可选) |
step_over |
单步跳过 | threadId (可选) |
step_into |
单步进入 | threadId (可选) |
step_out |
单步跳出 | threadId (可选) |
get_local_variables |
获取局部变量 | threadId (可选), frameIndex (默认: 0) |
get_fields |
获取对象字段 | objectId |
list_threads |
列出所有线程 | - |
list_classes |
列出已加载的类 | pattern (可选) |
list_stacktrace |
获取线程堆栈 | threadId (可选) |
get_status |
获取调试器状态 | - |
用户: 请连接到 localhost:8000 的 Java 程序并设置断点
Claude: [调用 connect_attach, host=localhost, port=8000]
已连接到 localhost:8000
[调用 list_classes]
... 找到类 com.example.Main ...
[调用 set_breakpoint, className=com.example.Main, lineNumber=42]
断点已设置: bp-1: com.example.Main:42
// src/test/java/com/example/TestApp.java
package com.example;
public class TestApp {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
System.out.println("Sum: " + sum);
}
System.out.println("Final: " + sum);
}
}# 编译
javac -d target/test-classes src/test/java/com/example/TestApp.java
# 启动可调试的程序
java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=y \
-cp target/test-classes com.example.TestAppE:/java_workspace/debug_mcp/
├── pom.xml # Maven 配置
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/debugger/mcp/
│ │ │ ├── Main.java # 入口
│ │ │ ├── McpServer.java # MCP 服务器
│ │ │ ├── handler/
│ │ │ │ └── ToolHandler.java # 工具处理器
│ │ │ ├── debugger/
│ │ │ │ ├── JdiDebugger.java # 核心调试器
│ │ │ │ ├── BreakpointManager.java # 断点管理
│ │ │ │ ├── VariableInspector.java # 变量查看
│ │ │ │ └── StepController.java # 单步控制
│ │ │ └── model/
│ │ │ ├── McpMessage.java # MCP 消息
│ │ │ ├── ToolCallResult.java # 工具结果
│ │ │ ├── Tool.java # 工具定义
│ │ │ └── InitializeResult.java # 初始化结果
└── README.md
- 语言: Java 17+
- MCP 协议: JSON-RPC 2.0 over stdio
- 调试 API: JDI (Java Debug Interface)
- 构建工具: Maven
- JSON 处理: Jackson
确保目标程序以调试模式启动:
java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=y ...确保编译时包含调试信息:
javac -g ...Maven 确保使用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<debug>true</debug>
<debuglevel>lines,vars,source</debuglevel>
</configuration>
</plugin>