javaperf

io.github.theSharque由 GitHub 帳號 theSharque 發布v1.4.2更新於 Oct 24, 2026

Java profiling MCP via jcmd/jfr/jps. Diagnose performance, analyze threads, inspect JFR recordings.

已驗證STDIO僅桌面開發者工具安全與監控

概覽

AI 產生的概覽

本機 MCP 伺服器,透過 JDK 的 jps、jcmd、jfr 工具,讓助理對執行中的 Java 應用程式做效能剖析與診斷。

可以做什麼
  • 列出執行中的 Java 行程,查看 JVM 資訊、運作時間、版本與啟動參數
  • 啟動、列出並停止 JFR 錄製,再把錄製解析為摘要、CPU、呼叫頻率、記憶體、GC、網路、檔案 I/O、鎖與原生方法剖析
  • 產生執行緒傾印、偵測死鎖並分析鎖等待鏈
  • 檢查堆積:類別直方圖、成長對比、堆積傾印與堆積摘要
  • 執行 jcmd 診斷:原生記憶體、GC 類別統計、終結器、編譯器程式碼快取與編譯佇列
  • 從錄製中建立某個方法的呼叫樹
適用情境
適合在同一台機器上排查 Java 效能問題:CPU 占用高、記憶體洩漏、GC 壓力、鎖競爭、死鎖或 I/O 緩慢,不必手動輸入 jcmd 與 jfr 指令。
執行需求
以本機 stdio 行程執行,通常透過 npx 從 npm 套件 javaperf 啟動。需要 Node.js v18+ 以及支援 JFR 的 JDK(8u262+ 或 11+);jps、jcmd、jfr 會透過 JAVA_HOME 或 PATH 尋找,必要時需在伺服器設定中指定 JAVA_HOME。必須與目標 JVM 在同一主機、以同一作業系統使用者身分執行。
安裝前請注意
它會附加到執行中的 JVM,可能影響應用程式:heap_histogram 的 all 選項會觸發 Full GC,可能造成應用程式停頓;heap_dump 會在 recordings 目錄寫入 .hprof 檔案。錄製與傾印都存放在本機磁碟。它只在 MCP 行程所在主機與使用者帳戶下有效,無法存取其他機器上的 JVM。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 javaperf,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

javaperf

[npm version]

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

How to connect to Claude Desktop / IDE

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

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.).

Requirements

  • Node.js v18+
  • JDK 8u262+ or 11+ with JFR support

JDK tools (jps, jcmd, jfr) are auto-detected via JAVA_HOME or which java. If not found, set JAVA_HOME to your JDK root.

Quick Start

For Users (using npm package)

bash
# No installation needed - use directly in Cursor/Claude Desktop# Just configure it as described in Integration section below

For Developers

  1. Clone the repository:
bash
git clone https://github.com/theSharque/mcp-jperf.gitcd mcp-jperf
  1. Install dependencies:
bash
npm install
  1. Build the project:
bash
npm run build

Usage

Development Mode

bash
npm run dev

Production Mode

bash
npm start

MCP Inspector

Debug and test with MCP Inspector:

bash
npx @modelcontextprotocol/inspector node dist/index.js

Integration

Cursor IDE

  1. Open Cursor Settings → Features → Model Context Protocol
  2. Click "Edit Config" button
  3. Add one of the configurations below
Option 1: Via npm (Recommended)

Installs from npm registry automatically:

json
{  "mcpServers": {    "javaperf": {      "command": "npx",      "args": ["-y", "javaperf"]    }  }}
Option 2: Via npm link (Development)

For local development with live changes:

json
{  "mcpServers": {    "javaperf": {      "command": "javaperf"    }  }}

Requires: cd /path/to/mcp-jperf && npm link -g

Option 3: Direct path
json
{  "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).

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

json
{  "mcpServers": {    "javaperf": {      "command": "npx",      "args": ["-y", "javaperf"]    }  }}

Continue.dev

Edit .continue/config.json:

json
{  "mcpServers": {    "javaperf": {      "command": "npx",      "args": ["-y", "javaperf"]    }  }}

Tools

ToolDescription
list_java_processesList running Java processes (pid, mainClass, args). Use topN (default 10) to limit.
start_profilingStart JFR. Pass pid, duration (seconds). Optional: preset (default effective: profile), settingsFile (path to .jfc, mutually exclusive with preset), memorysize, stackdepth (default 128).
profile_jfr_networkSocket I/O summary from .jfr (jdk.SocketRead, jdk.SocketWrite). Optional filepath (default new_profile), topN.
profile_jfr_file_ioFile read/write summary (jdk.FileRead, jdk.FileWrite). Optional filepath, topN.
profile_jfr_locksMonitor contention (JavaMonitorBlocked) and j.u.c parking (ThreadPark). Optional filepath, topN. Live waits: analyze_threads structured=true.
profile_jfr_nativeNative-method CPU hotspots (jdk.NativeMethodSample). Optional filepath, topN.
native_memory_summaryjcmd VM.native_memory summary — requires JVM with -XX:NativeMemoryTracking=summary or detail. Pass pid.
gc_class_statsjcmd GC.class_stats when available (often JDK 21+). Pass pid.
gc_finalizer_infojcmd GC.finalizer_info. Pass pid.
compiler_codecachejcmd Compiler.codecache. Pass pid.
compiler_queuejcmd Compiler.queue. Pass pid.
list_jfr_recordingsList active JFR recordings for a process. Use before stop_profiling to get recordingId.
stop_profilingStop recording and save to recordings/new_profile.jfr. Requires pid and recordingId.
check_deadlockCheck for Java-level deadlocks. Returns structured JSON with threads, locks, and cycle.
analyze_threadsThread dump (jstack) with deadlock summary. Pass pid, optional topN (default 10), structured (JSON lock-wait chains). Live snapshot; historical locks: profile_jfr_locks.
heap_histogramClass histogram (GC.class_histogram). Pass pid, optional topN (20), all (triggers full GC — may pause app). Static snapshot; use heap_live_histogram_diff for growth.
heap_live_histogram_diffTwo histograms spaced by intervalSeconds (default 5). Top classes by instance/byte growth. First step in memory-leak workflow. Pass pid, optional topN, all, minInstanceDelta.
heap_dumpCreate .hprof for MAT/VisualVM. After heap_live_histogram_diff, use MAT Path to GC Roots. Pass pid. Saved to recordings/heap_dump.hprof.
heap_infoBrief heap summary. Pass pid.
vm_infoJVM info: uptime, version, flags. Pass pid.
trace_methodBuild call tree for a method from .jfr. Pass className, methodName. Optional: filepath (default new_profile), topN.
parse_jfr_summaryParse .jfr into summary: top methods, GC stats, anomalies. Optional: filepath (default new_profile), events, topN.
profile_memoryMemory profile: top allocators by bytes/count, allocation stacks, OldObjectSample by class. Optional: filepath, topN, sortBy (bytes/count). Pair with gc_efficiency, heap_live_histogram_diff.
gc_efficiencyGC efficiency from .jfr: pause vs freed bytes per collector. Optional: filepath, topN. After stop_profiling.
profile_timeCPU bottleneck profile (bottom-up). Optional: filepath (default new_profile), topN.
profile_frequencyCall frequency profile (leaf frames). Optional: filepath (default new_profile), topN.

Example Workflow

  1. List processes → list_java_processes
  2. Start recording → start_profiling with pid and duration (e.g. 60)
  3. Wait for duration seconds (or let it run)
  4. Check recordings (optional) → list_jfr_recordings to get recordingId
  5. Stop and save → stop_profiling with pid and recordingId
  6. Analyze → parse_jfr_summary, profile_memory, gc_efficiency, 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)

Example Workflow: Memory leak hypothesis

  1. List processes → list_java_processes
  2. Find growing classes → heap_live_histogram_diff with pid, intervalSeconds: 5
  3. Record under load → start_profiling → wait → stop_profiling
  4. Allocation profile → profile_memory on new_profile (check oldObjectSamplesByClass for suspect class)
  5. GC pressure → gc_efficiency on the same .jfr
  6. Confirm retention → heap_dump → Eclipse MAT → Path to GC Roots (exclude weak/soft references)
  7. AI builds a coherent leak hypothesis from the combined results (no dedicated tool)

Remote JVM (stdio MCP)

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:

  • Run the MCP server (your IDE connector, Cursor, or Claude Desktop) on that machine, for example SSH remote workspace, Codespaces, CI runner checkout on the server, or a shell session on the same host as the process.
  • Do not rely on piping 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.

Limitations

  • Sampling: JFR samples ~10ms; fast methods may not appear in ExecutionSample
  • Local only: Runs on the machine where MCP is started
  • Permissions: Must run as same user as target JVM for jcmd access

來源:README.md,提交 9d97a88

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

2
  1. v1.4.2最新Sep 27, 2026
  2. v1.4.1Sep 16, 2026

評分

已滿足適用檢查項的 40%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。