JVM调试器MCP服务器
用于远程JVM调试的MCP(模型上下文协议)服务器。该工具连接了AI助手(如Copilot CLI、Claude Code、Cursor等)和Java的标准JDI(Java调试接口),允许您使用自然语言交互式调试正在运行的Java应用程序。
无论您是调试本地Java应用程序还是远程应用程序服务器(如JBoss EAP 8),此服务器都会连接到标准JDWP套接字端口(例如。, 8787 或 5005)并将强大的调试工具原生地暴露给LLM。
特性
- 标准Java调试:使用官方
com.sun.jdiAPI连接和交互。 - 远程连接:连接到任何使用标准JDWP套接字传输参数启动的JVM。
- 交互式检查:获取线程列表,挂起/恢复执行,并检查调用堆栈和局部变量。
- 断点和步进:在类和行上设置断点,等待执行事件,以及跳过、进入或退出函数。
安装和建造
先决条件
- 已安装JDK 17+(或兼容)
- Maven(
mvn)已安装
从源代码构建
该项目使用Maven构建一个胖jar(包括用于JSON处理的Jackson等依赖项),以便于执行。
git clone
cd jvm-debugger-mcp
mvn clean package可执行脂肪罐将位于 target/jvm-debugger-mcp-1.0-SNAPSHOT.jar.
与Copilot CLI(和其他MCP客户端)一起使用
此服务器使用标准MCP输入/输出机制 stdio它可以集成到任何符合MCP的客户端中。
与GitHub Copilot CLI一起使用
虽然GitHub Copilot CLI的确切配置正在积极发展,但集成MCP服务器通常需要将CLI指向可执行命令。
如果Copilot CLI支持通过配置文件(如Claude Code或Cursor)进行MCP配置,则可以在MCP设置文件中添加以下配置片段:
{
"mcpServers": {
"jvm-debugger": {
"command": "java",
"args": ["-jar", "/absolute/path/to/your/jvm-debugger-mcp/target/jvm-debugger-mcp-1.0-SNAPSHOT.jar"]
}
}
}*注:更换 /absolute/path/to/your/jvm-debugger-mcp 带有克隆存储库的实际路径。*
调试Java应用程序
- 在启用调试的情况下启动Java应用程序。 例如,使用JBoss或仅使用标准JAR:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8787 -jar myapp.jar- 打开您的AI命令行界面/助手 (例如Copilot CLI)。
- 请助理附上:
> “将JVM调试器连接到端口8787上的localhost。”
- 交互和调试:
> “列出活动线程。” > “挂起JVM。” > “获取线程ID 1的堆栈跟踪和局部变量。” > “在com.example.MyController的第42行设置断点。” > “恢复JVM并等待断点事件。” > “过来。”
可用的MCP工具
| 工具名称 | 描述 | 必需参数 |
|---|---|---|
jvm_attach | 连接到远程JVM调试端口 | host (字符串), port (整数) |
jvm_disconnect | 断开与当前连接的JVM的连接。 | - |
jvm_suspend | 挂起JVM中的所有线程。 | - |
jvm_resume | 恢复所有挂起的线程的执行。 | - |
jvm_get_threads | 获取所有线程及其状态的列表。 | - |
jvm_get_stack | 获取挂起线程的调用堆栈和局部变量。 | threadId (整数) |
jvm_set_breakpoint | 在特定的类和行号处设置断点。 | className (字符串), line (整数) |
jvm_wait_for_event | 等待JVM事件(如点击断点或类准备)。 | timeoutMs (整数) |
jvm_step | 跳过、进入或退出特定线程。 | threadId (整数), type (“结束”、“进入”、“退出”) |
技术架构
该架构由三个核心组件组成:
- McpServer核心(
McpServer.java&Json.java)
- 处理模型上下文协议(MCP)JSON-RPC规范。 - 从异步读取传入的JSON消息 System.in 通过扫描 \r\n\r\n 标题和标准 Content-Length. - 路线 tools/list 请求枚举功能。 - 路线 tools/call 向注册的Java工具发送请求,传递解析的JSON参数,并以格式化的结果进行响应 System.out.
- JDI包装机(
JdiDebugger.java)
- 包裹官方 com.sun.jdi 和 com.sun.jdi.connect API。 - 附件: 使用 com.sun.jdi.SocketAttach 连接器,用于建立与目标JVM的TCP连接。 - 检查: 迭代 ThreadReference 对象以提取线程状态和ID号。如果线程挂起,则迭代 StackFrame 提取可见光 LocalVariables及其对应值。(手柄 AbsentInformationException 如果代码不是用 -g 旗)。 - 执行控制: 用途 EventRequestManager 创造 BreakpointRequest, ClassPrepareRequest (用于卸载类上的延迟断点),以及 StepRequest它消耗了 EventQueue 等待并向客户端报告事件。
- 工具注册表(
Main.java)
- 作为切入点(public static void main). - 立即 JdiDebugger. - 定义一个列表 McpServer.Tool 匿名类。每个类指定其 name, description, schema (参数为JSON模式),以及 call 直接桥接到 JdiDebugger 方法。
