Load test your app on a real server from your agent. Get p95, errors and what ran out first.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer followed by your Stresix API key (Settings, Keys for agents, on stresix.com)
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Makes a checkout link for a credit pack: Starter is 5 credits for $10, Pro is 25 credits for $40. Nothing is charged by this tool. The user opens the link and pays in their browser, and the credits arrive a minute later. Only call it when the user asked to buy credits.
starter: 5 credits for $10. pro: 25 credits for $40.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Makes a checkout link for a credit pack: Starter is 5 credits for $10, Pro is 25 credits for $40. Nothing is charged by this tool. The user opens the link and pays in their browser, and the credits arrive a minute later. Only call it when the user asked to buy credits.
| Argument | Type | Description |
|---|---|---|
| pack* | string | starter: 5 credits for $10. pro: 25 credits for $40. |
{
"type": "object",
"required": [
"pack"
],
"properties": {
"pack": {
"enum": [
"starter",
"pro"
],
"type": "string",
"description": "starter: 5 credits for $10. pro: 25 credits for $40."
}
},
"additionalProperties": false
}Deletes a run and its report and measurements for good. A running run has to be stopped first. Ask the user first.
| Argument | Type | Description |
|---|---|---|
| test_id* | string | The run to delete. |
{
"type": "object",
"required": [
"test_id"
],
"properties": {
"test_id": {
"type": "string",
"description": "The run to delete."
}
},
"additionalProperties": false
}The account's credits, whether the free Lite run is still available, whether GitHub is connected, what each run size costs and the credit packs on sale.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}The full report of a finished run: the verdict, users held, requests per second, p95 latency and errors at each load level, what ran out first, CPU, busiest thread and memory on the server and per service, connections to the database and other dependencies, what the responses were, and which server size to pick or whether the user's own server is enough.
| Argument | Type | Description |
|---|---|---|
| test_id | string | The run id start_load_test or list_load_tests returned. The latest run when left out. |
{
"type": "object",
"properties": {
"test_id": {
"type": "string",
"description": "The run id start_load_test or list_load_tests returned. The latest run when left out."
}
},
"additionalProperties": false
}Where a run stands: building, starting servers, running (with live users, requests per second, p95 latency and error rate) or finished.
| Argument | Type | Description |
|---|---|---|
| test_id | string | The run id start_load_test or list_load_tests returned. The latest run when left out. |
{
"type": "object",
"properties": {
"test_id": {
"type": "string",
"description": "The run id start_load_test or list_load_tests returned. The latest run when left out."
}
},
"additionalProperties": false
}How a run moved over time: users, requests per second, p95 latency and error rate, averaged into a fixed number of points. Works while a run is going and after it ends.
| Argument | Type | Description |
|---|---|---|
| points | integer | How many points to return. Defaults to 30. |
| test_id | string | The run id start_load_test or list_load_tests returned. The latest run when left out. |
{
"type": "object",
"properties": {
"points": {
"type": "integer",
"maximum": 120,
"minimum": 5,
"description": "How many points to return. Defaults to 30."
},
"test_id": {
"type": "string",
"description": "The run id start_load_test or list_load_tests returned. The latest run when left out."
}
},
"additionalProperties": false
}Reads a repository before testing it: the port it listens on, the environment variables the code reads, the framework, whether it needs a database, and its branches. For a Docker image it only checks the reference. Use it before start_load_test.
| Argument | Type | Description |
|---|---|---|
| branch | string | Branch to read. The default branch when left out. |
| target* | string | GitHub repository URL or Docker image. |
{
"type": "object",
"required": [
"target"
],
"properties": {
"branch": {
"type": "string",
"description": "Branch to read. The default branch when left out."
},
"target": {
"type": "string",
"description": "GitHub repository URL or Docker image."
}
},
"additionalProperties": false
}The GitHub repositories the user gave Stresix access to, including private ones. Public repositories work without connecting GitHub.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}The account's runs, newest first: id, status, size, target, requests, when it ran and why it failed if it did.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. Defaults to 10. |
| status | string | active: waiting or running. finished: completed, failed or stopped. Defaults to all. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "How many to return. Defaults to 10."
},
"status": {
"enum": [
"all",
"active",
"finished"
],
"type": "string",
"description": "active: waiting or running. finished: completed, failed or stopped. Defaults to all."
}
},
"additionalProperties": false
}Adds the credits of a promo code to the account. Only use a code the user gave you.
| Argument | Type | Description |
|---|---|---|
| code* | string | The promo code. |
{
"type": "object",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"description": "The promo code."
}
},
"additionalProperties": false
}Tells Stresix whether a finished run's report was useful, with an optional note. Only send what the user actually said. Sending again replaces the earlier answer.
| Argument | Type | Description |
|---|---|---|
| helpful* | boolean | Whether the user found the report useful. |
| message | string | The user's note, up to 2,000 characters. |
| test_id | string | The run id start_load_test or list_load_tests returned. The latest run when left out. |
{
"type": "object",
"required": [
"helpful"
],
"properties": {
"helpful": {
"type": "boolean",
"description": "Whether the user found the report useful."
},
"message": {
"type": "string",
"description": "The user's note, up to 2,000 characters."
},
"test_id": {
"type": "string",
"description": "The run id start_load_test or list_load_tests returned. The latest run when left out."
}
},
"additionalProperties": false
}Tells a run which server the user already hosts the app on, so the report says whether that server is enough, how close to the limit it would be and what to change. Or set recommend to true to go back to a recommended size. The report is recomputed from the stored measurements, no new run needed.
| Argument | Type | Description |
|---|---|---|
| vcpu | number | vCPU count of the user's server. |
| label | string | A name for it, like "Hetzner CX22". |
| ram_gb | number | Memory of the user's server in GB. |
| test_id | string | The run id start_load_test or list_load_tests returned. The latest run when left out. |
| recommend | boolean | Set to true to drop the user's server and get a recommended size again. |
{
"type": "object",
"properties": {
"vcpu": {
"type": "number",
"maximum": 256,
"minimum": 0.25,
"description": "vCPU count of the user's server."
},
"label": {
"type": "string",
"description": "A name for it, like \"Hetzner CX22\"."
},
"ram_gb": {
"type": "number",
"maximum": 2048,
"minimum": 0.25,
"description": "Memory of the user's server in GB."
},
"test_id": {
"type": "string",
"description": "The run id start_load_test or list_load_tests returned. The latest run when left out."
},
"recommend": {
"type": "boolean",
"description": "Set to true to drop the user's server and get a recommended size again."
}
},
"additionalProperties": false
}Load tests the user's app on a real cloud server and returns a run id. The target is a public or connected GitHub repository URL, or a Docker image. Lite is free once per person (500 users, 4 minutes). Standard (2,500 users, 10 minutes) costs 1 credit and Massive (10,000 users, 15 minutes) costs 3. A paid run is only started with confirm_spend set to true, and only after the user has agreed to the price. Without a tier it uses the free Lite run when the account still has it.
| Argument | Type | Description |
|---|---|---|
| env | object | Environment variables the app needs to boot, such as NODE_ENV or a test database URL. Stored encrypted and wiped after the run. Never send production secrets. |
| port | integer | The port the app listens on inside its container. Read it from the code or use inspect_target. Stresix tries 80, 3000, 5000, 8000 and 8080 when it is left out. |
| tier | string | Run size. Leave it out to use the free Lite run when available. |
| paths | array | GET paths the simulated users rotate through, for example ["/", "/api/products", "/search?q=shoes"]. Pick pages that hit the database. Defaults to ["/"]. Use requests instead for other methods, headers or bodies. |
| branch | string | Repository branch to build. The default branch when left out. |
| target* | string | GitHub repository URL (https://github.com/owner/repo) or a Docker image (nginx:1.27, ghcr.io/owner/app:tag). |
Stops a run that is waiting or running and deletes its servers. A run stopped before its servers were up uses no credit. A run stopped while the load is going is not refunded, and its report covers what was measured until then. Ask the user first.
| Argument | Type | Description |
|---|---|---|
| test_id* | string | The run to stop. |
{
"type": "object",
"required": [
"test_id"
],
"properties": {
"test_id": {
"type": "string",
"description": "The run to stop."
}
},
"additionalProperties": false
}| requests |
| array |
| Full requests the simulated users rotate through, in place of paths. Each one is independent (no multi-step flows). Headers such as Authorization are stored encrypted and wiped after the run. Use a test account token, never a production secret. {{vu}} (the simulated user's number) and {{iteration}} (that user's request count) can go in a path, header value or body and are filled in per request, for example to give each user its own id. |
| confirm_spend | boolean | Set to true only after the user agreed to spend credits on this run. |
| current_server | object | The server the user runs the app on today, if any. The report then says whether that server is enough instead of recommending a size. Can also be set after the run with set_current_server. |
{
"type": "object",
"required": [
"target"
],
"properties": {
"env": {
"type": "object",
"description": "Environment variables the app needs to boot, such as NODE_ENV or a test database URL. Stored encrypted and wiped after the run. Never send production secrets.",
"additionalProperties": {
"type": "string"
}
},
"port": {
"type": "integer",
"maximum": 65535,
"minimum": 1,
"description": "The port the app listens on inside its container. Read it from the code or use inspect_target. Stresix tries 80, 3000, 5000, 8000 and 8080 when it is left out."
},
"tier": {
"enum": [
"lite",
"standard",
"massive"
],
"type": "string",
"description": "Run size. Leave it out to use the free Lite run when available."
},
"paths": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"description": "GET paths the simulated users rotate through, for example [\"/\", \"/api/products\", \"/search?q=shoes\"]. Pick pages that hit the database. Defaults to [\"/\"]. Use requests instead for other methods, headers or bodies."
},
"branch": {
"type": "string",
"description": "Repository branch to build. The default branch when left out."
},
"target": {
"type": "string",
"description": "GitHub repository URL (https://github.com/owner/repo) or a Docker image (nginx:1.27, ghcr.io/owner/app:tag)."
},
"requests": {
"type": "array",
"items": {
"type": "object",
"required": [
"path"
],
"properties": {
"body": {
"description": "Request body up to 16 KB: a string, or a JSON object or array (sent as application/json). Not allowed on GET or HEAD."
},
"path": {
"type": "string",
"description": "Path on the app, starting with /, with any query string."
},
"method": {
"enum": [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE",
"HEAD"
],
"type": "string",
"description": "Defaults to GET."
},
"headers": {
"type": "object",
"description": "Up to 20 headers. Host, Content-Length and a few others are set by Stresix.",
"additionalProperties": {
"type": "string"
}
}
},
"additionalProperties": false
},
"maxItems": 10,
"description": "Full requests the simulated users rotate through, in place of paths. Each one is independent (no multi-step flows). Headers such as Authorization are stored encrypted and wiped after the run. Use a test account token, never a production secret. {{vu}} (the simulated user's number) and {{iteration}} (that user's request count) can go in a path, header value or body and are filled in per request, for example to give each user its own id."
},
"confirm_spend": {
"type": "boolean",
"description": "Set to true only after the user agreed to spend credits on this run."
},
"current_server": {
"type": "object",
"required": [
"vcpu",
"ram_gb"
],
"properties": {
"vcpu": {
"type": "number",
"maximum": 256,
"minimum": 0.25
},
"label": {
"type": "string",
"description": "A name for it, like \"Hetzner CX22\" or \"DigitalOcean 2 GB droplet\"."
},
"ram_gb": {
"type": "number",
"maximum": 2048,
"minimum": 0.25
}
},
"description": "The server the user runs the app on today, if any. The report then says whether that server is enough instead of recommending a size. Can also be set after the run with set_current_server.",
"additionalProperties": false
}
},
"additionalProperties": false
}