by jcaromiq
Goku is an HTTP load testing application written in Rust
# Add to your Claude Code skills
git clone https://github.com/jcaromiq/gokuGuides for using mcp servers skills like goku.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars

Goku is a high-performance, scalable HTTP load-testing tool designed for benchmarking and performance analysis of web services. Inspired by tools like Drill and Vegeta, Goku offers modern features and simplicity for engineers to simulate and analyze traffic efficiently.
--rps) for constant-rate load profiles{{uuid}}, {{seq}}, {{random_int}}, …)compare subcommand to diff two benchmark runs--output-file) and per-request log (--results-log)text, json, csvcurl -sSL https://raw.githubusercontent.com/jcaromiq/goku/v3.0.0/scripts/install.sh | sh
cargo install goku-bench
goku --version
Go to the Goku's GitHub Releases page and download the latest .tar.gz for your system:
cargo build --release
Goku integrates with the Model Context Protocol (MCP) — use Goku programmatically from any LLM agent or MCP-aware client.
Once Goku is registered as an MCP tool, you can ask your LLM:
"Run a load test on https://api.example.com/users with 50 concurrent clients for 30 seconds using HTTP/2, and give me the p95 and p99 latency."
The LLM will call the run_benchmark MCP tool and return the full structured report.
# Automatic download
curl -sSL https://raw.githubusercontent.com/jcaromiq/goku/v3.0.0/scripts/install_mcp.sh | sh
# Or via Cargo
cargo install goku-mcp
run_benchmarkThe MCP server exposes a single unified tool with the following parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| target | string | ✅ | URL with optional method prefix. E.g. "POST http://api.example.com/users" |
| clients | number | ✅ | Number of concurrent workers |
| requests | number | — | Total requests (ignored when duration_secs is set) |
| duration_secs | number | — | Test duration in seconds (alternative to requests) |
| body | string | — | Request body for POST/PUT/PATCH |
| headers | string[] | — | Headers in "Name:Value" format |
| http2 | boolean | — | Use HTTP/2 prior knowledge |
| ramp_up | number | — | Seconds to spread worker start |
| timeout_ms | number | — | Request timeout in ms (default: 30000) |
| insecure | boolean | — | Accept invalid TLS certificates |
| rps | number | — | Max requests per second (rate limiting) |
Returns a full JSON report with all latency percentiles, throughput, and status code breakdown.
CLI is versioned with SemVer v2.0.0.
See CONTRIBUTING.md.
Usage: goku [OPTIONS] --target <TARGET>
goku compare <BASELINE> <CANDIDATE>
Options:
-v, --verbose Runs in verbose mode
-t, --target <TARGET> URL to request. Format: [METHOD] <url> [default: GET]
Example: "POST http://localhost:3000/api"
-r, --request-body <REQUEST_BODY> Path to file to use as request body
-c, --clients <CLIENTS> Number of concurrent workers [default: 1]
-i, --iterations <ITERATIONS> Total number of requests [default: 1]
-d, --duration <DURATION> Duration of the test in seconds (alternative to --iterations)
--headers <HEADERS> Headers in "Name:Value" format (repeatable)
--scenario <SCENARIO> Path to a YAML scenario file
--timeout <timeout_ms> Request timeout in ms [default: 30000]
--http2 Enable HTTP/2 prior knowledge
--ramp-up <seconds> Seconds to spread the start of workers
--rps <RPS> Max requests per second across all clients
--output <text|json|csv> Output format [default: text]
--output-file <PATH> Write results to file instead of stdout
--results-log <PATH> Write per-request CSV log (timestamp, status, latency)
--live-stats <seconds> Print live stats every N seconds during the test
--insecure Accept invalid/self-signed TLS certificates
--auth-bearer <TOKEN> Set Authorization: Bearer <TOKEN> header
--auth-basic <USER:PASS> Set Authorization: Basic <base64> header
--pool-idle-timeout <seconds> Connection pool idle timeout [default: 90]
--disable-keepalive Disable HTTP keep-alive / connection reuse
-h, --help Print help
-V, --version Print version
Subcommands:
compare <BASELINE> <CANDIDATE> Compare two JSON result files and show a diff table
--target -tSpecifies the HTTP method and URL. Defaults to GET if no method is provided.
goku --target "GET http://localhost:3000/"
goku --target "POST http://localhost:3000/api"
goku --target http://localhost:3000 # implicit GET
--request-body -r OptionalPath to a file whose contents will be sent as the request body.
--clients -cNumber of concurrent workers. Defaults to 1.
--iterations -iTotal number of requests to perform across all workers. Defaults to 1. Cannot be used together with --duration.
--duration -dRun the test for a fixed number of seconds instead of a fixed request count.
--headers OptionalAdd one or more request headers. Repeatable. Format: Name:Value.
goku --headers Content-Type:application/json --headers X-Api-Key:secret ...
--http2 OptionalForce HTTP/2 prior knowledge (skips HTTP/1.1 upgrade negotiation).
--ramp-up OptionalSpread the start of workers over N seconds to simulate a gradual traffic spike.
--rps OptionalLimit the total requests per second across all clients. Useful for constant-rate load profiles (similar to Vegeta).
goku -c 10 -i 10000 --rps 200 --target http://localhost:3000
--output OptionalOutput format. Valid values: text (default), json, csv.
--output-file OptionalWrite results to a file instead of stdout. Works with any --output format.
goku -c 50 -i 1000 --output json --output-file results.json --target http://localhost:3000
--results-log OptionalWrite a per-request CSV log with columns timestamp_ms,num_client,execution,status,latency_ms.
goku -c 50 -i 1000 --results-log requests.csv --target http://localhost:3000
--live-stats OptionalPrint partial metrics (requests, RPS, p50, p95) to stderr every N seconds while the test runs.
goku -c 50 --duration 60 --live-stats 5 --target http://localhost:3000
[live] requests=1250 rps=250.0 p50=45ms p95=120ms
--insecure OptionalAccept invalid or self-signed TLS certificates. Off by default.
--auth-bearer OptionalInject an Authorization: Bearer <TOKEN> header automatically.
goku --auth-bearer "eyJhbGci..." --target http://api.example.com
--auth-basic OptionalInject an Authorization: Basic <base64> header from user:password credentials.
goku --auth-basic "admin:secret" --target http://api.example.com
--pool-idle-timeout OptionalIdle timeout for pooled connections in seconds. Defaults to 90.
--disable-keepalive OptionalDisable HTTP keep-alive and connection reuse entirely.
--scenario OptionalPath to a YAML scenario file. When used, all other flags (except --output) are ignored and settings are read from the file.
compare SubcommandCompare two benchmark JSON result files and show a colored diff table:
goku compare before.json after.json
target: POST http://localhost:3000/
clients: 50
requests: 1000
duration: 60 # alternative to requests
http2: true
ramp_up: 5
rps: 500 # optional rate limit
output: json
insecure: false
live_stats: 10 # print live stats every 10s
pool_idle_timeout: 30
disable_keepalive: false
headers:
- key: "Content-Type"
value: "application/json"
- key: "X-Api-Key"
value: "secret"
body: '{"firstName": "Terry", "lastName": "Medhurst", "age": 50}'
# Optional: built-in authentication
auth:
type: bearer
token: "my-token"
# Optional: write results to a file
output_file: results.json
results_log: requests.csv
Run multiple endpoints sequentially per worker:
clients: 20
duration: 60
steps:
- target: "GET http://api.example.com/users"
- target: "POST http://api.exampl