jmeter-mcp-server
Allows building, maintaining, running, and reading reports for Apache JMeter test plans without the GUI, including creating test plan elements, executing non-GUI load tests, and retrieving aggregated latency/error statistics.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jmeter-mcp-serverCreate a test plan hitting https://api.example.com/login with 50 users and show me the report."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
jmeter-mcp-server
A stdio MCP server for building, maintaining, running, and reading reports for Apache JMeter test plans — without opening the GUI.
Point an MCP-capable client (Claude Code, Claude Desktop, etc.) at this server and it can compose a test plan element by element, kick off a real non-GUI JMeter run in the background, and read back aggregated latency/error stats, all through typed tool calls instead of clicking through JMeter's tree view.
Why an MCP server for this, specifically
An LLM can already write a .jmx file from scratch — it's just XML. The
problem is that JMeter's .jmx format is a hashTree structure with a lot
of fragile, easy-to-get-subtly-wrong detail: exact guiclass/testclass
pairs per element, property names that don't always match the GUI label
(ThreadGroup.num_threads is a stringProp, not an intProp; assertion
match types are an integer bitmask), and strict parent/child pairing
between every element and its sibling <hashTree>. None of that is
self-checking — a slightly wrong bitmask still produces valid, loadable XML
that just quietly does the wrong thing (an assertion that never fires, a
listener with no output). Re-deriving all of that from memory on every
request means re-risking the same mistakes every time.
This server encodes that knowledge exactly once, in a serializer that's been exercised against a real JMeter install, and exposes it as typed tools. The concrete benefits that come out of that:
Correctness through a fixed, tested code path. Every
add_http_samplercall goes through the same verified serializer, instead of an LLM regenerating XML from memory each time with a chance of drift or a subtly wrong property.Cheap incremental edits. A test plan is stored as a small JSON tree with stable node ids. Adding one more assertion is a single tool call referencing a
parentId— not reading and rewriting an entire.jmxfile to figure out where to splice in a change. In a quick side-by-side on a 6-element plan, the JSON tree came out to ~280 tokens versus ~1,580 tokens for the equivalent.jmxXML (which repeatsguiclass/testclasspairs and a fullsaveConfigblock per listener) — and that gap only widens as a plan grows, since editing the JSON tree costs one small tool call regardless of how large the overall plan already is.Aggregated results, not raw samples.
get_execution_reportparses the JTL output and returns computed stats (count, error %, avg/min/max/median, p90/p95/p99, throughput, KB/s) — not a dump of every sample row for the client to average by hand.A real async execution model.
execute_test_planstarts JMeter in the background and returns immediately with anexecutionId;get_execution_status/get_execution_reportpoll it. Long-running load tests don't block anything waiting for a single request/response.
The generated .jmx follows the same format JMeter itself writes, so it can
still be opened in the real JMeter GUI at any point if you want to eyeball
it visually or hand it off to someone who prefers the UI.
Related MCP server: JMeter MCP Server
How a test plan is represented
Each plan is stored as a JSON tree ({id, type, props, children[]}) rather
than as XML text. All authoring tools mutate this tree by appending a child
under a given parentId, and the tree is only serialized into a real .jmx
file at execution time. This is what makes incremental edits cheap and keeps
the fiddly XML schema knowledge in one place (src/jmx/serializer.ts)
instead of spread across every tool.
Tools
Authoring (each returns the new node's id, used as parentId for
whatever you attach under it next):
Tool | Adds |
| Root |
| Thread Group (virtual users) |
| HTTP Request sampler |
| JSON Extractor post-processor |
| HTTP Header Manager |
| Response Assertion |
| Aggregate Report listener |
| Summary Report listener |
Inspection:
Tool | Purpose |
| List every plan in the workspace |
| Full element tree of a plan, including every node's |
Execution & reporting (async — a run happens in the background):
Tool | Purpose |
| Serialize to |
|
|
| Send |
| Aggregated stats (per label + overall) parsed from the run's JTL output |
Example workflow
create_test_plan → { planId, rootNodeId }
add_thread_group (parentId: rootNodeId) → { nodeId: threadGroupId }
add_http_sampler (parentId: threadGroupId) → { nodeId: samplerId }
add_response_assertion (parentId: samplerId)
add_aggregate_report_listener (parentId: threadGroupId)
execute_test_plan (planId) → { executionId }
get_execution_status (executionId) ← poll until "completed"
get_execution_report (executionId) → aggregated latency/error statsPrerequisites
Node.js 18+
JMeter installed locally, with the
JMETER_HOMEenvironment variable pointing at the installation directory (the one containingbin/jmeter). On macOS via Homebrew,brew install jmeterputs it at/opt/homebrew/opt/jmeter/libexec.
Adding this server to Claude Code
Via npx (recommended — published on npm)
No cloning or building required; npx fetches and runs the published
version on the fly:
claude mcp add jmeter \
-e JMETER_HOME=/opt/homebrew/opt/jmeter/libexec \
-- npx -y jmeter-mcp-serverAdjust the JMETER_HOME path to wherever JMeter is installed on your
machine. Optionally set JMETER_MCP_WORKSPACE too (see below) if you want
plans and executions stored somewhere other than the default.
The default scope is local (this project directory only). To make it
available across every project, add -s user:
claude mcp add jmeter -s user \
-e JMETER_HOME=/opt/homebrew/opt/jmeter/libexec \
-- npx -y jmeter-mcp-serverConfirm it registered and is responding:
claude mcp listFrom a local clone (development)
If you're working on this repository's code instead of using the published
package, point at the built dist/index.js directly:
npm install
npm run build
claude mcp add jmeter \
-e JMETER_HOME=/opt/homebrew/opt/jmeter/libexec \
-- node /absolute/path/to/jmeter-mcp-server/dist/index.jsClaude Desktop
Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"jmeter": {
"command": "npx",
"args": ["-y", "jmeter-mcp-server"],
"env": {
"JMETER_HOME": "/opt/homebrew/opt/jmeter/libexec"
}
}
}
}Note: unlike a terminal-launched app, Claude Desktop does not inherit
environment variables exported in your shell profile (.zshrc, etc.) — only
true system-wide ones. Always set JMETER_HOME explicitly in the env
block above rather than relying on it already being "set on your machine".
Environment variables
Variable | Required | Purpose |
| Yes | JMeter installation directory (must contain |
| No | Where plans and executions are stored. Defaults to |
Workspace layout
<workspace>/
plans/<planId>/plan.json # JSON tree — source of truth for a plan
executions/<executionId>/
generated.jmx # serialized at execute_test_plan time
aggregate-report.jtl # output of the Aggregate Report listener, if present
summary-report.jtl # output of the Summary Report listener, if present
jmeter.log
meta.json # execution status, pid, timestamps, exit codev1 scope
Not yet supported (candidates for a future release): editing/removing
existing elements, importing an externally authored .jmx, generating the
HTML dashboard report (-e -o), other sampler/assertion/extractor types,
CSV Data Set Config, distributed execution.
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseCqualityDmaintenanceA Model Context Protocol server that enables executing and interacting with JMeter tests through MCP-compatible clients like Claude Desktop, Cursor, and Windsurf.2
- FlicenseCqualityDmaintenanceA Model Context Protocol server that enables execution of JMeter performance tests through AI assistants and MCP-compatible clients like Claude, Cursor, and Windsurf.2
- FlicenseAqualityDmaintenanceEnables the execution and analysis of JMeter performance tests through MCP-compatible clients. It provides tools for running tests in non-GUI mode, identifying performance bottlenecks, and generating comprehensive insights and visualizations from result files.6
- FlicenseNot gradedqualityCmaintenanceIntegrates Apache JMeter with AI assistants to run and manage load tests through natural language. It enables users to execute test plans, parse results, inspect test structures, and compare performance metrics across different runs.
Related MCP Connectors
JSON tools MCP.
MEOK MCP Test MCP — golden-file + schema-drift + tool-failure tests for any MCP server. Drop-in
Maven Central MCP — Java/JVM artifact registry
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/juliodelimas/jmeter-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server