@kosiakmd/artillery-mcp
Allows running load tests on AWS Fargate using Artillery, with full flag surface including region, cluster, CPU, memory, launch type, and more.
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., "@@kosiakmd/artillery-mcprun load test on test.yml with 50 users for 30 seconds"
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.
@kosiakmd/artillery-mcp
Richer drop-in MCP server for Artillery 2.x — exposes the full artillery run
and artillery run-fargate flag surface, parses raw text output (artillery-output.txt),
returns every counter/rate/summary Artillery produces (not just http.*), and
optionally adds a config-driven project launcher and counter-grouping for your
custom counters.
Why another MCP server?
The upstream @jch1887/artillery-mcp-server
was a solid start but missed several flags our team needed day-to-day. This package is
a MIT-licensed fork with broader coverage. See Credits.
Feature | upstream | this package |
| path + output only | + |
AWS Fargate ( | ❌ | ✅ full flag set |
|
| ALL counters + rates + nested summaries |
Parse raw stdout ( | ❌ | ✅ |
HTML report generation | passes invalid | ✅ separate |
Standalone JSON → HTML ( | ❌ | ✅ |
| broken (flag doesn't exist in 2.x) | ✅ client-side YAML structural check |
Opt-in project launcher | ❌ | ✅ |
Opt-in counter grouping | ❌ | ✅ |
| ❌ | ✅ |
Shipped | ❌ | ✅ agent-oriented guidance |
Docker image | ❌ | ✅ multi-arch (Docker Hub + GHCR) |
MCP Registry listing | ❌ | ✅ |
| hardcoded | ✅ read from package.json at runtime |
Tests | 122 | 163 |
Related MCP server: mcp-test-server
Quickstart for agents (Claude Code / Cursor)
# In your project root
npx @kosiakmd/artillery-mcp initScaffolds two files (skipped if they already exist, use --force to overwrite):
.artillery-mcp.config.json— starter template with commented fields.ai/skills/artillery-mcp/SKILL.md— agent-oriented guidance (when to call which tool, common patterns, gotchas)
After editing the config with your real flows/paths, register the MCP in your agent and restart the session:
claude mcp add artillery-mcp -s user \
-e ARTILLERY_WORKDIR="$PWD" \
-e ARTILLERY_CLOUD_API_KEY=a9_... \
-- npx -y @kosiakmd/artillery-mcpInstall / Quickstart (zero-config)
Runs out of the box — no config file needed. Works as an MCP server over stdio for Claude Code, Claude Desktop, Cursor, and any MCP-compatible client.
# Using npx (no install)
npx -y @kosiakmd/artillery-mcp
# Or install globally
npm install -g @kosiakmd/artillery-mcp
artillery-mcpClaude Code / Cursor — register as an MCP server in your client config:
{
"mcpServers": {
"artillery-mcp": {
"command": "npx",
"args": ["-y", "@kosiakmd/artillery-mcp"],
"env": {
"ARTILLERY_WORKDIR": "/absolute/path/to/your/project",
"ARTILLERY_CLOUD_API_KEY": "a9_..."
}
}
}
}Claude Code CLI:
claude mcp add artillery-mcp -s user \
-e ARTILLERY_WORKDIR=/abs/path/to/project \
-e ARTILLERY_CLOUD_API_KEY=a9_... \
-- npx -y @kosiakmd/artillery-mcpPrerequisites: Node.js ≥ 20; Artillery CLI on PATH (npm i -g artillery).
Docker
Multi-arch image — linux/amd64 and linux/arm64, Artillery CLI preinstalled. ~500 MB (Chromium/Playwright browsers skipped — see below). Published to both Docker Hub and GitHub Container Registry from the same build; identical digests.
# Docker Hub (discoverable via `docker search artillery-mcp`)
docker pull kosiakmd/artillery-mcp:latest
# GitHub Container Registry
docker pull ghcr.io/kosiakmd/artillery-mcp:latestRun (mount your project as /workspace):
docker run -i --init --rm \
-v "$PWD":/workspace \
-e ARTILLERY_CLOUD_API_KEY="$ARTILLERY_CLOUD_API_KEY" \
kosiakmd/artillery-mcp:latest--init ensures the Node process gets reaped on stdin close. Mount /workspace read-write if you want save_config tools to persist to /workspace/saved-configs/; read-only is fine otherwise (the save-config family will simply return errors when called).
MCP client config (Claude Desktop / Cursor) — point the MCP at docker instead of npx:
{
"mcpServers": {
"artillery-mcp": {
"command": "docker",
"args": [
"run", "-i", "--init", "--rm",
"-v", "/absolute/path/to/your/project:/workspace",
"-e", "ARTILLERY_CLOUD_API_KEY",
"kosiakmd/artillery-mcp:latest"
],
"env": { "ARTILLERY_CLOUD_API_KEY": "a9_..." }
}
}
}Playwright engine? If you use engine: playwright in your Artillery scripts, extend the base image with Chromium:
FROM kosiakmd/artillery-mcp:latest
ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=0
RUN apk add --no-cache chromium nss freetype harfbuzz ttf-freefont \
&& npm i -g @playwright/test \
&& npx playwright install chromiumImage tags:
latest— most recent releasev0.1.1,v0.1,v0— pinned by semver (patch / minor / major)
Environment variables
Var | Purpose | Default |
| Path to | auto-detected via |
| Working directory for runs |
|
| Max duration of a single run |
|
| Cap on captured stdout/stderr |
|
| Enable |
|
| Used when a tool is called with | — |
| Absolute path to project config (opt-in) | — |
|
| — |
18 base tools (no config needed)
Run tests
run_test_from_file— full-flagartillery runwrapper (see flag surface above).run_test_inline— same but takes YAML text, writes to a tmp file.quick_test—artillery quick <url>with rate/count/duration/method/headers/body.run_fargate—artillery run-fargatewith--region,--cluster,--cpu,--memory,--launch-type,--spot,--subnet-ids,--security-group-ids,--task-role-name,--task-ephemeral-storage,--container-dns-servers,--max-duration,--packages,--secret,--no-assign-public-ip+ all run-shared flags.run_preset_test— smoke / baseline / soak / spike presets against a URL.run_saved_config— re-run a saved config by name.
Parse + inspect results
parse_results— reads an Artillery JSON report; returnssummary+allCounters+allRates+allSummaries+ scenarios + metadata.read_artillery_output— reads a raw Artillery stdout dump (e.g.artillery-output.txtsaved from CI), returnsrawText(with tail-truncation),summaryBlock,counters,rates,metrics(nested percentiles).run_report— converts an existing JSON results file to HTML viaartillery report. Use when you have JSON from CI artifacts and want shareable HTML without re-running.compare_results— diff two Artillery JSON results for regression detection.
Saved configs
save_config/list_configs/get_config/delete_config— persistent named Artillery configs.
Interactive builder
wizard_start/wizard_step/wizard_finalize— interactive test builder.
Meta
list_capabilities— versions of Artillery/Node/this server, configured paths, limits.
Optional feature #1 — Project launcher (run_project_lt)
Activated when a .artillery-mcp.config.json file is discovered. Gives you
one-liner invocations instead of writing full artillery run ... flag lists.
Discovery precedence:
ARTILLERY_MCP_CONFIGenv var (absolute path)Walk up from
ARTILLERY_WORKDIR/cwdlooking for.artillery-mcp.config.jsonNo config → this tool is not registered
Config (.artillery-mcp.config.json):
{
"flows": {
"browse": "tests/load/browse.yml",
"buy": "tests/load/buy.yml",
"combined": "tests/load/combined.yml"
},
"environments": ["local", "staging", "prod"],
"defaultTags": { "repo": "my-app", "owner": "Platform" },
"tagTemplates": ["type:{flow}", "env:{env}", "source:mcp"],
"outputDir": "load-test-results"
}Call:
{ "flow": "buy", "environment": "staging", "note": "canary v42" }Effective command:
artillery run \
--record \
--name "buy-staging-2026-04-15T00-35-00-000Z" \
--tags "repo:my-app,owner:Platform,type:buy,env:staging,source:mcp" \
-e staging \
--note "canary v42" \
-o /abs/project/load-test-results/buy-staging-2026-04-15T00-35-00-000Z.json \
/abs/project/tests/load/buy.ymlOptional fields:
tagTemplates—{flow},{env}, plus any caller-suppliedtemplateVars(e.g.{round})outputDir— relative to project root; if missing, outputs land at project rootdefaultTags— merged before templatesenvironments— if empty, any environment name is accepted
Override on the call side: name, note, extraTags, outputJson, reportHtml,
variables, overrides, record: false, validateOnly, extraArgs, templateVars.
Optional feature #2 — Counter-group bucketing (counterBreakdown)
When you emit custom counters via events.emit('counter', 'shop.step.add_item.happy', 1),
Artillery aggregates them into aggregate.counters. This server returns ALL of
them in allCounters. Add counterGroups to your config to also get a
pre-bucketed counterBreakdown in parse_results and read_artillery_output
responses — ideal for CI pass/fail views and semantic grouping.
Config:
{
"counterGroups": {
"name": "shopBreakdown",
"prefix": "shop.",
"buckets": [
{ "key": "steps", "match": "^shop\\.step\\." },
{ "key": "cart", "match": "^shop\\.cart\\." },
{ "key": "payment", "match": "^shop\\.payment\\." },
{ "key": "flow", "match": "^shop\\.flow\\." },
{ "key": "other", "default": true }
]
}
}Example response (parse_results):
{
"summary": { "requestsTotal": 1500, "rpsAvg": 25, "latencyMs": { "p95": 850 }, "errors": {} },
"allCounters": { "shop.step.add_item.happy": 90, "http.requests": 1500, /* ... */ },
"allRates": { "http.request_rate": 25 },
"allSummaries": { "http.response_time": { "min": 45, "p99": 1800 } },
"counterBreakdown": {
"steps": { "shop.step.add_item.happy": 90, "shop.step.add_item.fail": 2 },
"cart": { "shop.cart.failure.quantity_update": 1 },
"payment": {},
"flow": { "shop.flow.started": 100 },
"other": {}
}
}Rules:
prefix(optional) — counters not starting with this string are ignoredbuckets— ordered; first match winsOne bucket may have
default: true— catches everything that didn't matchInvalid regex → throws at parse time (fix your config)
Without counterGroups, the counterBreakdown field is simply absent from responses.
Full config reference
{
"flows": { "<name>": "<relative yaml path>" }, // enables run_project_lt
"environments": ["<name>", "..."], // optional whitelist
"defaultTags": { "<k>": "<v>" },
"tagTemplates": ["type:{flow}", "env:{env}"],
"outputDir": "load-test-results",
"counterGroups": { // enables counterBreakdown
"name": "<output field name, cosmetic>",
"prefix": "<optional prefix filter>",
"buckets": [
{ "key": "<name>", "match": "<regex>" },
{ "key": "<name>", "default": true }
]
}
}Security
No network I/O — only spawns the local
artilleryCLI.No
eval/Function/ dynamic imports.No install hooks.
Dependencies pinned via
package-lock.json(committed).Published with
npm --provenance(SLSA attestation).
Roadmap
Shipped
v0.1.1 — Docker image (multi-arch amd64/arm64; Artillery CLI preinstalled)
v0.1.2 —
artillery-mcp initscaffolder + shippedSKILL.mdagent-guidance templatev0.1.3 — hard-fail on unknown CLI args, fix Dockerfile missing
skills/v0.1.4 — dual-publish to Docker Hub alongside GHCR (for
docker searchdiscoverability)v0.1.7 —
run_reporttool (JSON → HTML viaartillery report); listed in MCP Official Registry (io.github.kosiakMD/artillery-mcp)
v0.2 (next)
Artillery Cloud API integration —
list_recent_runs,get_run_details(runUrl),compare_to_baseline(runUrl). Requires reverse-engineering theartilleryioREST API or partnering with Artillery.io.Config schema validation on startup — parse
.artillery-mcp.config.jsonthrough zod with human-readable error messages ("expected 'flows' to be object, got null at line 3"). Fail-fast with pointer to README.YAML config support — accept
.artillery-mcp.config.ymlusing a tiny bundled YAML parser (keeping deps light).Playwright Docker variant —
kosiakmd/artillery-mcp:latest-playwrightwith Chromium preinstalled for users withengine: playwrightscripts. Separate tag to keep base image small.
v0.3+
Artillery Lambda + Azure ACI tools —
run_lambda,run_acifor parity withrun_fargate.run_project_ltmatrix mode —{"matrix": {"flow": ["free","paid"], "env": ["staging","prod"]}}→ 4 runs in parallel.Per-flow config overrides — different
counterGroups/defaultTags/environmentsper flow instead of global.Streaming intermediate metrics via MCP progress events so agents see RPS/errors mid-run instead of only at completion.
Built-in presets library — smoke / baseline / soak / spike selectable via config (not just inline YAML).
Published JSON Schema at stable URL for IDE autocompletion of
.artillery-mcp.config.json.Plugin API for counter-group matchers beyond regex — e.g. JSONPath, Wasm filter, callback to a user-provided JS.
Structured
run_reportvariant — return extracted summary text alongside the HTML path, so AI agents can skip loading the file.Smithery support — add StreamableHTTP transport + hosted deployment once there's enough demand (requires OAuth-style session config for per-user API keys).
Under consideration
Grafana / Prometheus integration — push metrics to a user-provided Prometheus endpoint instead of (or in addition to) Artillery Cloud.
Native Artillery Pro support — enterprise features if users request them.
TUI dashboard for long-running tests when invoked outside MCP (standalone mode).
Community MCP catalogs — manual registration on mcp-get.com, PulseMCP for extra discoverability.
Upstream contribution — offer
read_artillery_output,run_fargate, andfull flag surfacepatches back to@jch1887/artillery-mcp-serveras PRs; if merged, this fork becomes a thin config-plugin layer on top.
Issues / feature requests / PRs welcome: github.com/kosiakMD/artillery-mcp/issues.
Issues and feature requests welcome: github.com/kosiakMD/artillery-mcp/issues.
Credits
Forked from jch1887/artillery-mcp-server (MIT). See NOTICE for the list of additions and modifications.
License
MIT — see LICENSE. Both the upstream and this fork's copyright notices must be preserved in substantial portions of the software.
This server cannot be installed
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
- Alicense-qualityDmaintenanceA test server implementing all features of the MCP protocol, including prompts, tools, resources, and sampling, designed for testing MCP clients rather than practical applications.Last updatedMIT
- Alicense-qualityDmaintenanceA lightweight MCP test server for verifying client connectivity, providing tools, resources, and prompts for integration.Last updated31ISC
- FlicenseBqualityCmaintenanceAn MCP server framework featuring dynamic tool loading and a modular one-tool-per-file architecture for rapid development. It supports both Stdio and HTTP transport modes, offering automated test generation and centralized configuration management.Last updated11
- Alicense-qualityCmaintenanceA powerful MCP server for automated JMeter test generation and execution with Docker integration and comprehensive performance analysis.Last updated1MIT
Related MCP Connectors
MCP server for Appcircle mobile CI/CD platform.
An MCP server for Arcjet - the runtime security platform that ships with your AI code.
A MCP server built for developers enabling Git based project management with project and personal…
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/kosiakMD/artillery-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server