loading…
Search for a command to run...
loading…
MCP server for Java application profiling via JDK utilities (jcmd, jfr, jps)
MCP server for Java application profiling via JDK utilities (jcmd, jfr, jps)
MCP (Model Context Protocol) server for profiling Java applications via JDK utilities (jcmd, jfr, jps)
Enables AI assistants to diagnose performance, analyze threads, and inspect JFR recordings without manual CLI usage.
📦 Install: npm install -g javaperf or use via npx
🌐 npm: https://www.npmjs.com/package/javaperf
Add the server to your MCP config. Example for claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"javaperf": {
"command": "npx",
"args": ["-y", "javaperf"]
}
}
}
For Cursor IDE: Settings → Features → Model Context Protocol → Edit Config, then add the same block inside mcpServers. See the Integration section for more options (local dev, custom JAVA_HOME, etc.).
JDK tools (jps, jcmd, jfr) are auto-detected via JAVA_HOME or which java. If not found, set JAVA_HOME to your JDK root.
# No installation needed - use directly in Cursor/Claude Desktop
# Just configure it as described in Integration section below
git clone https://github.com/theSharque/mcp-jperf.git
cd mcp-jperf
npm install
npm run build
npm run dev
npm start
Debug and test with MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.js
Installs from npm registry automatically:
{
"mcpServers": {
"javaperf": {
"command": "npx",
"args": ["-y", "javaperf"]
}
}
}
For local development with live changes:
{
"mcpServers": {
"javaperf": {
"command": "javaperf"
}
}
}
Requires: cd /path/to/mcp-jperf && npm link -g
{
"mcpServers": {
"javaperf": {
"command": "node",
"args": ["dist/index.js"],
"cwd": "${workspaceFolder}",
"env": {
"JAVA_HOME": "/path/to/your/jdk"
}
}
}
}
If list_java_processes fails with "jps not found", the MCP server may not inherit your shell's JAVA_HOME. Add the env block above with your JDK root path (e.g. /usr/lib/jvm/java-17 or ~/.sdkman/candidates/java/current).
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"javaperf": {
"command": "npx",
"args": ["-y", "javaperf"]
}
}
}
Edit .continue/config.json:
{
"mcpServers": {
"javaperf": {
"command": "npx",
"args": ["-y", "javaperf"]
}
}
}
| Tool | Description |
|---|---|
list_java_processes |
List running Java processes (pid, mainClass, args). Use topN (default 10) to limit. |
start_profiling |
Start JFR. Pass pid, duration (seconds). Optional: preset (default effective: profile), settingsFile (path to .jfc, mutually exclusive with preset), memorysize, stackdepth (default 128). |
profile_jfr_network |
Socket I/O summary from .jfr (jdk.SocketRead, jdk.SocketWrite). Optional filepath (default new_profile), topN. |
profile_jfr_file_io |
File read/write summary (jdk.FileRead, jdk.FileWrite). Optional filepath, topN. |
profile_jfr_locks |
Monitor contention (jdk.JavaMonitorBlocked). Optional filepath, topN. |
profile_jfr_native |
Native-method CPU hotspots (jdk.NativeMethodSample). Optional filepath, topN. |
native_memory_summary |
jcmd VM.native_memory summary — requires JVM with -XX:NativeMemoryTracking=summary or detail. Pass pid. |
gc_class_stats |
jcmd GC.class_stats when available (often JDK 21+). Pass pid. |
gc_finalizer_info |
jcmd GC.finalizer_info. Pass pid. |
compiler_codecache |
jcmd Compiler.codecache. Pass pid. |
compiler_queue |
jcmd Compiler.queue. Pass pid. |
list_jfr_recordings |
List active JFR recordings for a process. Use before stop_profiling to get recordingId. |
stop_profiling |
Stop recording and save to recordings/new_profile.jfr. Requires pid and recordingId. |
check_deadlock |
Check for Java-level deadlocks. Returns structured JSON with threads, locks, and cycle. |
analyze_threads |
Thread dump (jstack) with deadlock summary. Pass pid, optional topN (default 10). |
heap_histogram |
Class histogram (GC.class_histogram). Pass pid, optional topN (20), all (triggers full GC — may pause app). |
heap_dump |
Create .hprof heap dump for MAT/VisualVM. Pass pid. Saved to recordings/heap_dump.hprof. |
heap_info |
Brief heap summary. Pass pid. |
vm_info |
JVM info: uptime, version, flags. Pass pid. |
trace_method |
Build call tree for a method from .jfr. Pass className, methodName. Optional: filepath (default new_profile), topN. |
parse_jfr_summary |
Parse .jfr into summary: top methods, GC stats, anomalies. Optional: filepath (default new_profile), events, topN. |
profile_memory |
Memory profile: top allocators, GC, potential leaks. Optional: filepath (default new_profile), topN. |
profile_time |
CPU bottleneck profile (bottom-up). Optional: filepath (default new_profile), topN. |
profile_frequency |
Call frequency profile (leaf frames). Optional: filepath (default new_profile), topN. |
list_java_processesstart_profiling with pid and duration (e.g. 60)duration seconds (or let it run)list_jfr_recordings to get recordingIdstop_profiling with pid and recordingIdparse_jfr_summary, profile_memory, profile_time, profile_frequency, trace_method, profile_jfr_network, profile_jfr_file_io, profile_jfr_locks, or profile_jfr_native (events must exist in the recording — use start_profiling with a suitable preset or .jfc via settingsFile)javaperf uses stdio MCP and attaches to JVMs via local jps/jcmd. That only works on the OS account and host where the MCP process runs.
To diagnose a JVM on another machine:
jcmd over plain SSH from another host unless you deliberately run MCP there; attaching across hosts is outside this server’s scope.Requirements (same user, local attach) listed under Limitations still apply.
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"javaperf": {
"command": "npx",
"args": [
"-y",
"javaperf"
]
}
}
}pro-tip
Поставил Javaperf? Скажи Claude: «запомни почему я установил Javaperf и что хочу попробовать» — попадёт в твой Vault.
как это работает →