tm-mcp
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., "@tm-mcpWhat regressed vs the baseline for CI run 1234?"
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.
TrafficMorph MCP Server
████████╗██████╗ █████╗ ███████╗███████╗██╗ ██████╗
╚══██╔══╝██╔══██╗██╔══██╗██╔════╝██╔════╝██║██╔════╝
██║ ██████╔╝███████║█████╗ █████╗ ██║██║
██║ ██╔══██╗██╔══██║██╔══╝ ██╔══╝ ██║██║
██║ ██║ ██║██║ ██║██║ ██║ ██║╚██████╗
╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝
███╗ ███╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗
████╗ ████║██╔═══██╗██╔══██╗██╔══██╗██║ ██║
██╔████╔██║██║ ██║██████╔╝██████╔╝███████║
██║╚██╔╝██║██║ ██║██╔══██╗██╔═══╝ ██╔══██║
██║ ╚═╝ ██║╚██████╔╝██║ ██║██║ ██║ ██║
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝
Drive TrafficMorph from Claude Desktop, Claude Code, Cursor, or any other host that speaks the Model Context Protocol.
The flagship use case is CI-failure triage:
"My TrafficMorph CI step just failed on run 1234 — what regressed vs the baseline?"
→ Claude calls the right tools, fetches the relevant runs, computes the per-metric delta, and produces a human-readable triage report in seconds.
Current release: 1.2.0 — 25 tools + 4 prompts + 5 resources (34 catalog entries total). See CHANGELOG.md for the per-release history and STABILITY.md for what 1.x commits to keeping stable. See MCP-USAGE.md for worked example conversations.
Quick start
Four steps from zero to "Claude is driving my TrafficMorph account":
1. Get an API key
Open the TrafficMorph app → Settings → API Keys → click
Generate. Copy the tm_… value.
2. Install (or skip — uvx runs without install)
# Permanent install:
pip install tm-mcp
# OR — no install at all. The MCP host config below uses `uvx`,
# which downloads + caches the package on first run. Confirm
# uvx itself is on your PATH:
uvx --versionNote:
tm-mcpis a long-running MCP server, not a CLI with a--helpflag. Invoking it directly without env vars exits 2 with a configuration error. The host (Claude Code / Desktop) subprocesses it and pipes JSON-RPC over stdio — you don't run it yourself unless you're debugging.
3. Register with your MCP host
Both Claude Code and Claude Desktop use the same env-var protocol:
TM_API_KEY for the API key, TM_BASE_URL for the base URL. The
server reads both at startup and fails fast with a clean
"couldn't start" message if either is missing — your host's log
shows that instead of opaque "tool call failed" errors later.
In all snippets below, replace two placeholders with your own values:
TM_API_KEY=tm_xxxxxxxxxxxxxxxx→ the API key from Step 1.TM_BASE_URL=https://YOUR-TRAFFICMORPH-HOST→ the URL of your TrafficMorph server. Common values:Local dev:
http://localhost:8080Self-hosted prod:
https://trafficmorph.your-company.com(or whatever URL your install lives at)Cloud SaaS: the URL shown in your TrafficMorph app's browser address bar
Do not copy the literal
YOUR-TRAFFICMORPH-HOSTplaceholder — it won't resolve and every tool call will fail.
Claude Code — one command:
claude mcp add trafficmorph \
-e TM_API_KEY=tm_xxxxxxxxxxxxxxxx \
-e TM_BASE_URL=https://YOUR-TRAFFICMORPH-HOST \
-- uvx tm-mcpProject-scope alternative — drop this at the repo root:
// .mcp.json
{
"mcpServers": {
"trafficmorph": {
"command": "uvx",
"args": ["tm-mcp"],
"env": {
"TM_API_KEY": "tm_xxxxxxxxxxxxxxxx",
"TM_BASE_URL": "https://YOUR-TRAFFICMORPH-HOST"
}
}
}
}Claude Desktop — add to ~/Library/Application Support/Claude/claude_desktop_config.json
(macOS) or the equivalent on your OS, then restart Claude Desktop:
{
"mcpServers": {
"trafficmorph": {
"command": "uvx",
"args": ["tm-mcp"],
"env": {
"TM_API_KEY": "tm_xxxxxxxxxxxxxxxx",
"TM_BASE_URL": "https://YOUR-TRAFFICMORPH-HOST"
}
}
}
}4. Verify
In Claude Code:
> /mcpYou should see trafficmorph listed with 25 tools, 4 prompts,
and 5 resources. If you see red / error, check:
claude mcp list # is `trafficmorph` registered?
claude mcp get trafficmorph # what env vars + command?The most common gotcha: forgetting TM_BASE_URL. The server
refuses to start without it and surfaces a clear "$TM_BASE_URL
is not set" error in your MCP host's log. Set it in the host
config (see step 3).
Related MCP server: jmeter-mcp
What you can do
Conversational examples — try any of these once the server is wired up:
"List my TrafficMorph profiles."
"Show me the last 5 runs for profile 42."
"Start a run on profile 42 and wait for the verdict."
"Create a profile 'smoke-test' hitting https://api.example.com/health at 50 RPS for 60s."
"What domains am I cleared to load-test against?"
"Add api.example.com as a new domain and walk me through verification."
"Compare run 1234 against run 1198."
Or invoke a slash-command prompt for a guided workflow:
/tm_triage 42— find the most recent failed run for profile 42, diff against the latest PASS baseline, narrate the regression./tm_setup_loadtest https://api.example.com 100 60— handle domain verification + profile creation + optional immediate run./tm_compare_baseline 42— quick regression check vs the last green./tm_import_capture_guided ~/.trafficmorph/captures/my.jsonl— analyse → preview → import workflow.
Or @-mention a resource to pull pre-baked context into the chat:
@tm://profiles— your full profile list as session-start context.@tm://history/recent— the last 20 runs across all profiles.@tm://domains— verified domain list.@tm://profiles/42or@tm://history/1234— one specific entity by id.
See MCP-USAGE.md for end-to-end worked conversations including failure triage, new-test setup, and capture-driven profile import.
Full catalog
Tools (25) — AI-invoked actions
Tool | Action |
Read | |
| List all profiles owned by the authenticated user |
| Full config + run status for one profile |
| Paginated past runs with filters ( |
| Full metric set + verdict for one run |
| All registered domains + verification status |
| Side-by-side metric diff of two runs (synthetic) |
| Per-endpoint analysis of a JSONL capture file |
Run control | |
| Start a run; with |
| Stop the in-flight run for a profile (idempotent) |
| Pause without losing position (idempotent) |
| Resume a paused run from where it left off |
Profile lifecycle + capture import | |
| Create a new profile (fails fast on name collision to prevent silent upsert wipe) |
| Partial update by id (read-modify-write internally — only pass the fields you want to change) |
| Remove a profile |
| Persist analysed-capture groups as profiles |
Domain management | |
| Register a domain for verification (idempotent) |
| Check the TXT challenge record |
| Check the |
| Remove a domain |
Variables-set lifecycle | |
| List all variables sets owned by the user |
| Single set's metadata (id, name, mode, columns, row count) |
| Upload a CSV-style set (inline |
| Rename without touching content (idempotent) |
| Switch between ROW / COLUMN / SEQUENTIAL without re-uploading |
| Remove a set; 400s if still attached to any profile (detach via |
Prompts (4) — user-invoked slash commands
Slash command | Workflow |
| Find the most recent FAIL → diff vs latest PASS → narrate the regression |
| Domain verification (if needed) + profile creation + optional run |
| Quick regression check: latest run vs latest PASS |
| Analyse → present groups → user picks → import |
Prompts return a templated user message that steers the AI through a specific tool sequence. They're how you kick off a known workflow without typing the full natural-language description every time.
Resources (5) — @-mention URIs
URI | What it returns |
| All your profiles, JSON |
| One profile's full config |
| Last 20 runs across all profiles |
| One run's full metrics |
| All registered domains + verification status |
Resources are read-only data the host pulls into context — usually at session start via @-mention. They wrap the corresponding read tools 1:1; the difference is who decides when to read (AI for tools, host for resources).
Configuration
Env var | Required | Notes |
| yes | Full |
| yes | URL of your TrafficMorph install ( |
| no | Defaults to |
Capture-file path validation
tm_analyse_capture and tm_import_capture accept a server-side
file path. The MCP server validates each path before passing it
through:
Rule | Why |
Must resolve inside | Prevents AI invocation from probing |
Symlinks resolving outside the root are rejected | Classic symlink-escape defense |
| Path-traversal defense |
Only | The capture parser reads plain JSONL (no gzip wrapping) |
Override the root via TM_MCP_CAPTURE_ROOT in your MCP host's
server config:
"env": {
"TM_API_KEY": "...",
"TM_BASE_URL": "...",
"TM_MCP_CAPTURE_ROOT": "/path/to/your/captures"
}Troubleshooting
Server fails to start with $TM_API_KEY is not set or
$TM_BASE_URL is not set. One of the required env vars wasn't
delivered to the subprocess by your MCP host. The error names the
missing variable; add it to the env block in your host config
(see Step 3).
Server starts, but every tool call hits a network / DNS error.
TM_BASE_URL is set to something that doesn't resolve — typically
a placeholder like https://YOUR-TRAFFICMORPH-HOST that wasn't
edited, a typo in the hostname, or an internal URL not reachable
from where the MCP host runs. Read the URL back from
claude mcp get trafficmorph and confirm it resolves with
curl -I "$TM_BASE_URL/api/v1/profiles".
Tools work, but specific ones return 404. Your TrafficMorph server is running an older build that doesn't expose those endpoints yet. Upgrade the server.
PLAN_UPGRADE_REQUIRED on every call. Your TrafficMorph
account doesn't have API access enabled. Check your account
settings, or point the MCP server at a deployment where your
account has API access.
tm_create_profile refuses with "A profile named X already
exists". The server's POST endpoint is upsert-by-name and would
silently replace the existing profile (including scripts /
callbacks / alerts the MCP tool surface doesn't expose). Use
tm_update_profile(profile_id=<id from error>) instead, or pick
a unique name.
tm_update_profile refuses to rename. A rename would collide
with another profile under your account. The error names both
ids; either pick a unique new name OR call tm_update_profile
against the OTHER profile if you actually meant to edit that one.
Domain verify returns 400 immediately. That's the fail-fast contract — verification is NOT polling-style. The 400 message includes the expected TXT record / URL + token; read it back to the user, wait for them to install the record / file, then retry.
Versioning
Source | Notes | |
MCP server release |
| Pin via |
API version |
| Use to identify what's installed in support tickets |
The MCP server is a thin layer over the trafficmorph Python SDK.
The dependency pin in pyproject.toml constrains the SDK range
this release is tested against; updating the SDK ships as a new
tm-mcp release.
See also
MCP-USAGE.md — comprehensive user guide with worked example conversations
CHANGELOG.md — per-release history
STABILITY.md — v1.0 stability promise (what tools / prompts / resources stay stable across 1.x)
examples/ — full conversation transcripts (triage, setup, capture import)
TrafficMorph Python SDK — the HTTP layer this MCP server uses
Available Tools
25 toolstm_add_domainADestructiveIdempotent
Register a new domain for verification. Returns the
VerifiedDomainResponse record carrying a single
verificationToken plus pre-formatted setup instructions
for both verification methods.
Verification is required before TrafficMorph will run traffic against the domain — it's the gate that prevents arbitrary abuse-as-a-service. Two verification methods are offered; the same token is used for both — pick whichever method is easier to set up:
DNS — install the token as a TXT record at
_trafficmorph-verify.<domain>. Best for users who control DNS. Use :func:tm_verify_domain_dnsafter the record propagates.HTTP — serve the token at
https://<domain>/.well-known/trafficmorph-verify.txt. Best when DNS access is restricted. Use :func:tm_verify_domain_httponce the file is live.
Response shape::
{
"id": 7,
"domain": "api.example.com",
"verificationToken": "tm-verify-abc123…",
"verificationMethod": null, # set after verification
"verified": false,
"verifiedAt": null,
"createdAt": "2026-05-16T12:00:00Z",
"dnsInstruction": "Add a TXT record for _trafficmorph-verify.api.example.com with value: tm-verify-abc123…",
"httpInstruction": "Place a file at https://api.example.com/.well-known/trafficmorph-verify.txt containing: tm-verify-abc123…"
}The dnsInstruction / httpInstruction strings are
pre-formatted by the server for verbatim display — the AI
host can read either back to the user without composing the
setup steps itself.
Idempotent: calling again with the same domain returns the existing record with the same token (the server treats repeat registrations as no-ops).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint, idempotentHint, and openWorldHint. The description adds valuable context: returns a verification token and pre-formatted instructions for two verification methods, explains idempotent behavior, and shows the response shape. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but well-structured with bullet points, a code block, and clear sections. It front-loads the purpose and is mostly efficient, though some sentences (like the idempotency note) could be more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (verification process, two methods), the description covers purpose, token usage, response shape, and idempotency. It lacks explicit prerequisites (e.g., domain ownership) but provides enough context for an AI agent to understand the workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only one parameter (domain) and 0% schema description coverage, the description compensates by showing the domain in the example response and linking it to verification. It clearly implies what the domain string represents, though it does not explicitly reiterate the parameter's meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Register a new domain for verification.' It specifies the verb (register), resource (domain), and distinguishes from sibling tools like tm_delete_domain, tm_verify_domain_dns, and tm_verify_domain_http by positioning this as the prerequisite step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool: before verification is required, calling it 'the gate that prevents arbitrary abuse-as-a-service.' It also notes idempotency for repeat calls. However, it does not explicitly state when not to use it or compare with alternatives like listing domains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_analyse_captureA
Analyse a JSONL traffic capture and return the proposed profile structure.
capture_path must point to a .jsonl file under
$TM_MCP_CAPTURE_ROOT (defaults to
~/.trafficmorph/captures/). .jsonl.gz and other
compressed forms are NOT supported — the server-side parser
reads plain text only. Symlinks resolving outside the root,
path-traversal sequences, and other extensions are rejected
by the path validator in :mod:tm_mcp.capture_path — see its
module docstring for the security rationale.
Returns per-endpoint analysis: URL skeleton with $$macro$$
placeholders, derived RPS curve, extracted variables, sample
URLs. No state is persisted. Pair with
:func:tm_import_capture to actually create profiles from
the analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| capture_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: it reads plain text only, rejects certain paths with security rationale, returns per-endpoint analysis, and does not persist state. This is comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is informative but slightly verbose, with code formatting and a reference to a module docstring. It front-loads the purpose and is well-structured, though could be trimmed slightly without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single parameter, no output schema, no annotations), the description is complete: it covers input constraints, return value (per-endpoint analysis), side effects (none), and next steps. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no description (0% coverage), but the description adds extensive meaning: file format (.jsonl), allowed location under $TM_MCP_CAPTURE_ROOT, unsupported compressed forms, and path validation rules. This fully compensates for the schema's lack of detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool analyses a JSONL traffic capture and returns a proposed profile structure. It uses specific verbs ('analyse', 'returns') and distinguishes from siblings by mentioning pairing with tm_import_capture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies that the capture_path must be a .jsonl file under a specific root, and that compressed forms, symlinks, path traversal are not supported. It suggests pairing with tm_import_capture for profile creation, but could be more explicit about alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_change_variables_set_modeADestructiveIdempotent
Switch sampling mode on an existing set without re-uploading
the CSV. Accepts any of the three modes: ROW, COLUMN,
SEQUENTIAL.
Common use cases:
A capture-import-created set lands in
ROWmode by default; flip toSEQUENTIALfor ordered replay that reproduces the original traffic order.A set originally created with
ROW(correlated per-row sampling) can be flipped toCOLUMNif you want uncorrelated combinations across columns instead.
The server re-parses the stored CSV with the target mode and
400s if the CSV is incompatible — e.g. switching to ROW
when the CSV has no weight column. The error message names
the actual cause so the AI host can either:
Fix the underlying CSV (delete + re-upload with the right shape).
Stay in the current mode.
Returns the updated metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| variables_set_id | Yes | ||
| mode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds significant context beyond annotations: explains server re-parses CSV and returns 400 on incompatibility, and that it returns updated metadata. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with a clear main sentence followed by bullet-pointed use cases. Slightly verbose but each sentence adds value; could tighten bullet phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low schema coverage and no output schema, the description fully explains behavior, error conditions, and return value, making it complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by listing allowed modes (ROW, COLUMN, SEQUENTIAL) and explaining their semantics with examples. Does not detail variables_set_id format but provides enough context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Switch' and the resource 'sampling mode on an existing set', distinguishing it from sibling tools which all have different purposes (e.g., create, delete, list).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete use cases (flipping modes for ordered replay or uncorrelated combinations) and mentions error recovery, but does not compare to alternatives like creating a new set or staying in current mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_compare_runsA
Synthetic side-by-side diff of two runs.
No equivalent /api/v1 endpoint exists — this tool fetches both
runs and computes the delta client-side. Note: the response
shape here is the MCP server's own — distinct from the native
RunComparisonService's RunComparisonResponse. The MCP
shape is leaner (no full run summaries embedded) because the AI
rarely needs every field, and a separate tm_get_run call
surfaces the full per-run detail if needed.
Return shape:
.. code-block:: python
{
"run_id": <int>, # the newer run's id (post-swap)
"baseline_run_id": <int>, # the older run's id (post-swap)
"verdict_change": {
"run": <str|None>, # e.g. "FAIL"
"baseline": <str|None>, # e.g. "PASS"
},
"deltas": {
"<metric_name>": {
"a": <number>, # value from `run`
"b": <number>, # value from `baseline`
"delta_pct": <float|None>, # None when baseline is 0
"delta_abs": <number>, # only when delta_pct is None
"regression": True, # only when above +10% in a "bad" direction
},
...
},
}Metrics covered: totalRequests, totalErrors, avgRps,
peakRps, successRate, durationSeconds (top-level),
plus latency_<quantile> rows for every quantile present in
both runs (latency_p50, latency_p95, etc.).
Regression flag fires only for metrics with a known
"bad direction": totalErrors UP, successRate DOWN, any
latency quantile UP. Throughput / duration deltas are reported
without regression flags — the AI host interprets direction
based on context.
Threshold is intentionally generous (10%) — the server's auto-comparison uses tighter thresholds for the official verdict; this tool is a "draw attention to these metrics" surface for the AI to narrate alongside the verdict.
Invariants enforced — mirror the native
RunComparisonService.compare(...) server method
(RunComparisonService.java line ~61):
run_id != baseline_run_id(comparing a run to itself produces a useless all-zero diff that would mislead the AI).Both runs belong to the same profile (cross-profile compares mix incomparable workloads — e.g. checkout-flow vs login-flow latency — and produce % deltas that look valid but answer no real question).
Most-recent run is returned as
runwhencreatedAtis present and parseable on both runs. The tool compares parsed datetimes (UTC-aware, normalized from naive input) and swaps the caller's arguments if it detects "older first" — the result narrative then reads "newer run regressed vs older baseline" consistently. Order detection uses parsed-datetime comparison, not raw string compare, so ISO-8601 fractional-seconds and offset variants behave correctly.Fallback: when either run is missing
createdAtor the value can't be parsed, the tool keeps the caller- supplied order rather than guessing. That's an intentional safety net — better to surface the diff in the order the AI asked for than to silently rearrange based on weak signals — but it means the "newer = run" invariant only holds when timestamps are usable. Mirrors the native service's own defensive null-handling.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | ||
| baseline_run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and delivers extensive behavioral details: client-side computation, response shape, regression logic with thresholds, timestamp-based ordering with fallback, and invariants. It fully discloses how the tool behaves and what the AI should expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and includes a large code block, but it is structured with clear sections (purpose, return shape, invariants). Not every sentence is essential, but the detailed explanation adds value despite lacking conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is very complete given the complexity: it covers the return shape, invariants, regression logic, and fallback behavior. However, it does not specify error handling for cases like invalid run IDs or cross-profile violations, leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only integer types with no descriptions. The description compensates by explaining the role of run_id and baseline_run_id in the return shape and the ordering logic, but it does not explicitly define the parameters in the input context. Still, the meaning is sufficiently inferable from the tool name and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as a 'Synthetic side-by-side diff of two runs'. It distinguishes itself from sibling tools by its unique comparison functionality, and the detailed explanation of what it does (compute delta client-side, return leaner response) makes the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implicit guidance on when to use this tool versus alternatives (e.g., 'a separate tm_get_run call surfaces the full per-run detail if needed'). It also enforces invariants (same profile, different runs) that constrain usage. However, it does not explicitly state when not to use it or list alternative tools for comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_create_profileADestructive
Create a new traffic profile (upsert by name — see below).
Minimum viable profile = name + target_url +
duration_seconds + points. The points array is the
RPS curve as a list of {"x": seconds, "y": rps} dicts —
e.g. [{"x": 0, "y": 10}, {"x": 60, "y": 100}] ramps from
10 to 100 RPS over the first minute.
Optional shape knobs:
http_method— defaults server-side toPOSTif omitted.request_body— string body sent on every request.request_headers— JSON-encoded header list, e.g.'[{"name":"Authorization","value":"Bearer ..."}]'. Must be a string (the API accepts a string for round-tripping via the UI's form layer).loop— repeat the curve indefinitely while the run is active. Defaults to False.
Not yet exposed via MCP: init / response / cleanup scripts, alert policy, callback URL, schedule. Use the web UI or the public REST API directly for those.
Name-collision behavior: the server's create endpoint is
upsert-by-name, which would silently REPLACE every field
of an existing profile from the request body — including
advanced fields (scripts, callback, alerts) this tool doesn't
expose. To prevent that data loss, this tool fails fast on
collision: if a profile with this name already exists,
you get a typed :class:ToolError naming the existing
profile's id, and no write is attempted.
Name comparison matches the server's normalization: whitespace
is trimmed and the match is per-character case-insensitive
(mirrors the JDBC LOWER() lookup used by Spring Data's
IgnoreCase derived query). " Existing ", "EXISTING",
and "existing" all collide with an existing "Existing"
profile.
ASCII names recommended. Non-ASCII names (e.g. "Straße",
"İstanbul") work, but the case-fold semantics on the JVM
and PostgreSQL may differ subtly from a Python-side
re-implementation. The MCP guard uses str.lower() to match
the server's per-character behavior (e.g. "Straße" and
"STRASSE" are treated as DISTINCT names by both sides),
not the more aggressive Python casefold(). For names with
locale-sensitive characters, ASCII spellings give predictable
cross-database behavior.
To modify an existing profile, use :func:tm_update_profile
(which preserves advanced fields on partial updates). To
create a fresh profile, pick a name that doesn't collide.
Concurrency caveat: the collision check is a client-side
preflight against GET /profiles immediately before the
POST. A concurrent POST from another session for the
same user can land in the gap. For single-user MCP usage the
race is sub-millisecond; for higher-concurrency scenarios the
structural fix is a server-side create-if-absent contract
(tracked separately).
Returns the full saved profile dict (id, name, duration, …).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| target_url | Yes | ||
| duration_seconds | Yes | ||
| points | Yes | ||
| http_method | No | ||
| request_body | No | ||
| request_headers | No | ||
| loop | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and non-idempotent. Description adds extensive context: fail-fast on collision to prevent data loss, server-side normalization details, concurrency race condition, return value description. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though lengthy, the description is well-structured with clear sections (minimum viable, optional knobs, name-collision, concurrency). Every sentence adds value, but could be tightened without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 params, no output schema, and many siblings, the description covers all critical aspects: return type, upsert semantics, error handling, normalization, concurrency, and unsupported features. Provides a complete picture for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by explaining each parameter: minimum viable set, points format with example, defaults for http_method and loop, request_headers must be string, and optional knobs. Adds meaning well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a new traffic profile with upsert behavior. It explicitly distinguishes from siblings like tm_update_profile, which modifies existing profiles while preserving advanced fields, and explains the name-collision fail-fast behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use this tool (create fresh profile) vs tm_update_profile (modify existing). Details name-collision behavior, concurrency caveat, and recommends ASCII names. Also lists advanced features not exposed, directing to web UI/REST API.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_create_variables_setADestructive
Create a new variables set from inline CSV content.
csv_content is the full CSV as a string — header row plus
data rows. The server parses + validates at upload time and
rejects malformed or oversized inputs with a typed
:class:ToolError.
The header row's column names define which $$macro$$
placeholders this set substitutes when attached to a profile.
Example::
userId,token,weight
u-1001,tk-abc,5
u-1002,tk-def,1Attached to a profile whose URL is
https://api.example.com/users/$$userId$$ and which sends
header Authorization: Bearer $$token$$, each request:
Picks a row (weighted random in
ROWmode — row 1 with 5/6 probability, row 2 with 1/6; sequential inSEQUENTIALmode).Substitutes the row's
userIdandtokencolumns into the matching placeholders.Sends the resulting request.
mode defaults to "ROW" (weighted per-row sampling).
Other accepted values: "COLUMN" (per-column independent
sampling) and "SEQUENTIAL" (ordered walk, for captured-
traffic replay). ROW mode REQUIRES a weight column
(case-insensitive header); COLUMN accepts an optional shared
weight column AND per-column {col}_weight overrides;
SEQUENTIAL ignores weights. See the helper docstring in
_validate_variables_set_mode for the full mode contract.
Returns the created set's metadata (id, name, mode,
macroColumns, weightColumn, rowCount, byteSize). The AI host
typically follows with attaching the new set to a profile —
that's handled via tm_update_profile on the profile
side (variables-set attachment is on the profile, not the
set).
Quota: each account has a per-user variables-set quota.
A 400 with Variables-set quota reached means delete an
existing set first.
Duplicate names rejected (strict-uniqueness semantics).
Per-user, names must be unique — a second create call with
a name that already exists 400s with A variables set named 'X' already exists. The endpoint deliberately doesn't
auto-suffix (unlike the capture-import path which does
(2), (3), …). Pick a fresh name, or
:func:tm_rename_variables_set / :func:tm_delete_variables_set
the existing one before re-creating.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| csv_content | Yes | ||
| mode | No | ROW |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds extensive behavioral context beyond annotations: describes validation rejection, quota errors, duplicate name errors, mode-specific behavior (ROW/COLUMN/SEQUENTIAL), return value metadata, and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with paragraphs, examples, and clear sections, but slightly long; each section adds value so a 4 is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers creation tool comprehensively: input format, validation, errors, quotas, modes, return metadata, and links to subsequent steps (profile attachment). No output schema but description fills the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Compensates for 0% schema coverage by thoroughly explaining 'name' (uniqueness), 'csv_content' (format, headers, data rows, placeholder mapping), and 'mode' (default, options, requirements) with examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states 'Create a new variables set from inline CSV content', explains CSV format and placeholder substitution, and distinguishes from sibling tools like tm_rename_variables_set and tm_delete_variables_set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides detailed when-to-use guidance including note about attaching via tm_update_profile, explains quota limits and duplicate name handling, and describes mode options with their behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_delete_domainADestructive
Remove a registered domain.
Profiles targeting this domain remain saved but won't be
runnable until another verified domain covers the target host
(see :func:tm_list_domains to find what's covered).
Returns {"domain_id": <id>, "deleted": True} on success.
A 400 / "Domain not found" surfaces as a typed
:class:ToolError — caller can react to it without parsing
message text.
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations: profiles preservation, runnability condition, return value format, and error handling as typed ToolError. Annotations only indicate destructive hint and idempotency; description enriches understanding of effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise: three clear sentences. First sentence states intent. Second explains behavioral nuance. Third details return/error. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description is nearly complete. It explains return value and error handling, and the parameter name is self-explanatory. However, a brief note on domain_id acquisition would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage for the single parameter domain_id, and the tool description does not explain what this parameter represents or how to obtain its value. Since schema coverage is low, the description should compensate but fails to do so.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Remove a registered domain' which is a specific verb and resource. It distinguishes from siblings like tm_add_domain and tm_list_domains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains consequences (profiles remain saved but not runnable) and references tm_list_domains for finding covered hosts. However, it does not explicitly state when to use this tool over alternatives or provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_delete_profileADestructive
Delete a profile by id. Any in-flight run is cancelled server-side; run history rows are retained (only the profile definition is removed).
Returns {"profile_id": <id>, "deleted": True} on success.
A 400 / "Profile not found" surfaces as a typed ToolError
— caller can react to it without parsing message text.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds significant behavioral context beyond annotations: cancels in-flight runs, retains history rows, returns specific JSON, and handles errors as typed ToolError. Annotations already indicate destructive, so additional context is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise with three sentences, front-loaded with the primary action. Every sentence adds value with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers core deletion behavior, side effects, return format, and error handling. Missing possibly authorization requirements, but annotations cover destructiveness. Adequate for a simple delete tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter profile_id is not described beyond the schema. Schema coverage is 0%, but the parameter is self-explanatory. Description adds minimal semantic value; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it deletes a profile by ID, distinguishing from sibling tools like create/get/update. It also specifies behavior regarding in-flight runs and history retention, differentiating it further.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for deleting a profile but does not explicitly state when to use it versus alternatives or provide exclusions. Context of siblings makes it clear, but lacks explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_delete_variables_setADestructive
Delete a variables set. Fails fast (HTTP 400) if the set is still attached to any profile — the server does NOT auto-detach.
The server-side error message names the referencing profile(s)
so the caller can detach them first. The MCP layer preserves
that message verbatim in the typed ToolError so the AI
host can read it back to the user. Example error text::
Can't delete 'users-fixture' — still attached to profiles:
loadtest-api.example.com, smoke-test. Detach it from those
profiles first.To delete an attached set, the typical recovery is to call
:func:tm_update_profile on each referencing profile with an
updated variables-set attachment list that omits this set's
id, then retry the delete. (The variables-set attachment is
a property of the profile, not of the set — managed via the
profile's update path, not via a separate endpoint here.)
Returns {"variables_set_id": <id>, "deleted": True} on
success. A 400 / "Variables set not found" or
"still attached" surfaces as a typed :class:ToolError —
caller can react without parsing message text beyond the
error string itself.
| Name | Required | Description | Default |
|---|---|---|---|
| variables_set_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the `destructiveHint` annotation by explaining that it does not auto-detach, including the error message format, and the success response. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with the main action and crucial constraint first, followed by error details, recovery, and response. Every sentence is informative and necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single required parameter and no output schema, the description is thorough: it covers the constraint, error behavior, recovery path, and success output, making the tool fully understandable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries full burden. It implies the parameter is the ID of the set to delete, but does not explicitly state it. However, for a single required integer parameter, the meaning is clear from context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it deletes a variables set and distinguishes from siblings by detailing a specific constraint (fails if attached to a profile). The verb 'Delete' and resource 'variables set' are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-not to use (if set is attached to a profile) and gives recovery steps: call tm_update_profile to detach first. Also notes error handling and alternative action via `tm_update_profile`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_get_profileA
Get the full configuration of a single traffic profile by id.
Returns: name, RPS curve points, target URL, HTTP method,
request body / headers, optional init/cleanup/response scripts,
callback config, auto-alert settings, schedule (if any), AND
the current run status (IDLE / RUNNING / PAUSED /
COMPLETED).
400 if the profile isn't found or doesn't belong to this user (per the v1 API contract — IllegalArgumentException → 400).
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details the return value (name, RPS curve, etc., and run status) and error conditions (400 if not found or not belonging to user). Without annotations, it provides good behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main action and efficiently lists return fields and error conditions. While the list of fields is detailed, it is still concise and each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
In the absence of an output schema, the description thoroughly explains what is returned and the error scenario. It is complete enough for a simple get operation, though it could mention prerequisites like authentication.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explicitly describe the 'profile_id' parameter. It only mentions 'by id' in the purpose, adding minimal additional meaning. The parameter is simple, but the description could have provided more clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get the full configuration of a single traffic profile by id', using a specific verb and resource. It distinguishes from sibling tools like tm_list_profiles (which lists all profiles) and tm_update_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you have a profile ID, but it does not explicitly state when to use this tool versus alternatives such as tm_list_profiles or tm_update_profile. No guidance on when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_get_runA
Get one run's full detail — the CI post-run inspection endpoint.
Returns the complete metric set: response-code distribution, latency quantiles (p50/p95/p99/...), RPS / latency time series, secondary stats from response scripts, the auto-comparison snapshot against the configured baseline, AND the auto-verdict
reasoning (
autoVerdict,autoVerdictReasons).
For comparing two runs side-by-side, use tm_compare_runs
— it does the metric-by-metric diff so the AI doesn't have to.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It implies a read-only operation ('Get'), lists all returned data, but does not explicitly state no side effects or authentication needs. Still sufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: main purpose first, then a bullet-like list of returned data. It is informative but not overly long; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-param tool with no output schema, the description covers the essential information: what it does and what it returns. No missing critical details for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (run_id, integer, required). Schema description coverage is 0%, but the field name and requirement make its purpose obvious. The description adds no additional semantic details beyond what the schema implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves one run's full detail, listing the specific metrics returned. It distinguishes from sibling tool tm_compare_runs by noting that tool does a diff for comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use tm_compare_runs instead for side-by-side comparison, providing clear context. Does not specify exclusions but gives practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_get_variables_setA
Get a single variables set's metadata.
Returns the same shape as one element of :func:tm_list_variables_sets:
id, name, mode, macroColumns, weightColumn, rowCount, byteSize,
createdAt, updatedAt. Raw CSV omitted; use the in-app UI if you
need row-level inspection.
| Name | Required | Description | Default |
|---|---|---|---|
| variables_set_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return fields and omission of raw CSV. With no annotations, the description effectively communicates the tool's behavior as read-only and structured. Doesn't mention error handling but acceptable for a simple get operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each informative. No redundancy. Front-loaded with purpose, then details. Highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one required parameter, no output schema, and no annotations, the description adequately covers purpose, return shape, and limitation (no raw CSV). Lacks error or existence info but sufficient for a simple fetch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter variables_set_id is not described beyond the schema. With 0% schema coverage, the description adds no meaning; even a brief clarification would improve scoring.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get a single variables set's metadata' with a specific verb and resource. It distinguishes from sibling tools like tm_list_variables_sets by focusing on a single item and referencing the return shape.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context by comparing return shape to tm_list_variables_sets and advises using the in-app UI for raw CSV inspection, implying when not to use this tool. Could explicitly state alternative use cases but sufficient for guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_import_captureADestructive
Import the chosen groups from an analysed JSONL capture as real traffic profiles.
Workflow: call :func:tm_analyse_capture first to inspect the
derived groups (method + URL skeleton + variables + RPS curve);
pick the ones you want to persist; pass them here as
selections.
capture_path must be the SAME JSONL file you analysed —
server re-derives the analysis on commit (the preview response
deliberately doesn't carry full per-row values, so trusting
client-supplied preview data would be both heavy and tamper-
able). The path resolves under $TM_MCP_CAPTURE_ROOT with
the same security checks as tm_analyse_capture.
selections is a dict of shape::
{
"groups": [
{
"method": "POST",
"urlSkeleton": "https://api.example.com/api/x",
"profileName": "load-test users" # optional
},
...
]
}Each (method, urlSkeleton) pair must match a group returned
by the prior tm_analyse_capture call exactly — index-based
references would be fragile across re-analysis (groups sort by
row count, ties break alphabetically). profileName is
optional; omit / null lets the server pick a default like
"[capture] POST /api/x". Empty groups list is allowed
(no-op; result reports zero profiles created).
Returns the server's import result: createdProfiles (array
of {profileId, name}), createdVariablesSetCount,
skippedSelections (with reasons), warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| capture_path | Yes | ||
| selections | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint, idempotentHint, openWorldHint. Description adds that the server re-derives analysis on commit, and that empty groups is a no-op. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with workflow and parameter details in a clear order. Uses a block diagram for selections. Slightly verbose but each part adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex import workflow and no output schema, the description covers the entire process, parameter details, and return value shape (createdProfiles, etc.). Complete guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description thoroughly explains both parameters: capture_path must be same JSONL file with security checks; selections shape is given with detailed fields and constraints (exact match, optional profileName, empty allowed).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it imports groups from an analysed JSONL capture as real traffic profiles, distinguishing itself from tm_analyse_capture which only analyses and returns groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly prescribes a workflow: call tm_analyse_capture first, then pass selections. It also explains constraints like using the same JSONL file and path resolution. Lacks explicit 'when not to use' but the workflow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_list_domainsA
List all domains registered by the authenticated user with their verification status.
Each entry carries id, domain, verified flag, and the DNS / HTTP challenge tokens that are still in play. Useful for answering "what domains am I allowed to load-test?" and for walking a user through verification.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals that each entry includes 'id, domain, verified flag, and the DNS / HTTP challenge tokens that are still in play.' This goes beyond the output schema by explaining the meaning of tokens. With no annotations provided, the description fully compensates by disclosing return structure and purpose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs with no redundant words. The first sentence states the core purpose, and the second adds helpful context. Every sentence contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description provides sufficient context: it describes the returned fields and their significance. No gaps remain for an agent to understand the tool's function.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so schema description coverage is 100% by default. The description does not need to add parameter info. The baseline score of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'List all domains registered by the authenticated user with their verification status.' It clearly identifies the resource (domains), action (list), and scope (by user), distinguishing it from sibling tools like tm_add_domain or tm_verify_domain_dns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage context: 'Useful for answering "what domains am I allowed to load-test?" and for walking a user through verification.' While it does not list explicit exclusions or alternatives, the purpose is clear enough for the agent to infer when to use this tool over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_list_historyA
List past runs with optional filters. The killer use case for CI-failure triage:
tm_list_history(auto_verdict="FAIL", size=10)returns the 10 most recent failing runs across all profiles.
Filters are AND-combined:
profile_id: narrow to one profile.triggered_by:api/ui/scheduled.region: region code (e.g.us-east-1).auto_verdict:PASS/WARN/FAIL/NO_BASELINE.tag: arbitrary user tag.from_/to: ISO-8601 timestamps boundingstartedAt.from_is named with a trailing underscore becausefromis a Python keyword.page/size: zero-based pagination, size capped at 100 by the server.
Returns the standard pagination envelope:
{content: [...summaries...], page, size, totalElements, totalPages}.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | No | ||
| triggered_by | No | ||
| region | No | ||
| auto_verdict | No | ||
| tag | No | ||
| from_ | No | ||
| to | No | ||
| page | No | ||
| size | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It explains the tool behavior: listing runs with filters, pagination with size cap at 100, and returns a paginated envelope. However, it does not disclose sorting order, behavior on empty results, or potential side effects (though likely none).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (around 15 lines) and well-structured with a header, example, and bullet-pointed filter list. Every sentence adds value without redundancy. Front-loaded with purpose and key use case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters and no output schema, the description provides the return format (pagination envelope) and covers all filters. It lacks detail on the contents of each run summary, but overall it is sufficiently complete for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds detailed explanations for all 9 parameters, including allowed values for triggered_by, auto_verdict, format for timestamps, the reason for 'from_' underscore, and pagination defaults and cap. This is comprehensive beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List past runs with optional filters' and provides a specific use case (CI-failure triage) with an example. It distinguishes from sibling tools like tm_get_run (single run) and tm_compare_runs (comparison) by focusing on listing with filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete use case and explains that filters are AND-combined, but does not explicitly state when not to use this tool or mention alternative tools. The example implicitly guides usage, but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_list_profilesA
List all traffic profiles owned by the authenticated user.
Returns a list of lightweight summaries — one per profile —
with id, name, and createdAt. Use tm_get_profile(id) for
the full configuration of any single profile.
Ordering: server-default (typically most-recently-updated first). The endpoint doesn't expose a sort parameter.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format (id, name, createdAt), ordering behavior (server-default, no sort), and ownership scope. No annotations provided, but description adequately covers behavior for a read-only list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, no superfluous text. Every sentence adds critical information (purpose, return format, sibling reference, ordering constraint).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and the presence of an output schema, the description fully covers what the agent needs: purpose, output structure, ordering, and guidance for more detail. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; schema coverage is 100%. Description adds value by explaining return structure and ordering, meeting the baseline expectation for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List all traffic profiles owned by the authenticated user', specifying verb, resource, and scope. Distinguishes from sibling tm_get_profile by noting it returns lightweight summaries vs full config.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs to tm_get_profile for full details, implying when to use this tool for summaries. Does not state when not to use but provides clear context and a practical alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_list_variables_setsA
List all variables sets owned by the authenticated user.
Returns metadata only — id, name, mode, macro columns, optional
weight column, row count, byte size, timestamps. The raw CSV
content is NOT included (it's downloaded via a separate UI-only
endpoint when needed). For a single set's full metadata use
:func:tm_get_variables_set.
Useful for answering "what variables sets do I have available to attach to a profile?" — common follow-up when the AI is asked to set up a parameterized load test.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that only metadata is returned and raw CSV content is excluded, which is important behavioral context. No annotations exist, so description provides necessary transparency. Could mention read-only nature explicitly but implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with main action. Two paragraphs without wasteful content. Could be slightly tighter but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, no annotations, and the description covers purpose, usage guidelines, behavioral details, and output content, it is complete for a list tool. Output schema exists but description already lists returned fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema (0 params, 100% coverage), so baseline 4 is appropriate. Description adds no param info but none needed; it focuses on the tool's purpose and output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb and resource: 'List all variables sets owned by the authenticated user.' The description explicitly distinguishes from sibling tools like tm_get_variables_set by noting the scope difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use case: answering 'what variables sets do I have available to attach to a profile?' during load test setup. Also clarifies when not to use (for CSV content) and directs to tm_get_variables_set for full metadata.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_pause_runADestructiveIdempotent
Pause the in-flight run for a profile. Idempotent — when no
run is active, returns status="IDLE" rather than erroring.
Useful when a workflow wants to inspect intermediate metrics
without losing progress.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint and idempotentHint. The description adds beyond that by specifying the return status when no run is active and explaining the idempotent nature, which helps the agent understand safe behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences, front-loading the core action. Every sentence adds value, and there is no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple single-parameter tool with no output schema, the description covers purpose, idempotency, and a use case. It lacks detail on what 'pause' entails for run state, but is largely complete for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description should compensate but does not. It only mentions the tool's action without explaining the required profile_id parameter, leaving the agent to infer its meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it pauses an in-flight run for a profile. It includes idempotent behavior and a use case, but does not explicitly differentiate from siblings like tm_stop_run or tm_resume_run, leaving some ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a specific use case (inspecting intermediate metrics) but does not give when-not-to-use advice or compare to alternatives. The context is clear but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_rename_variables_setADestructiveIdempotent
Rename a variables set. Changes only the display name; the CSV content, sampling mode, and attached-profile relationships are untouched.
Returns the updated metadata (same shape as :func:tm_get_variables_set).
| Name | Required | Description | Default |
|---|---|---|---|
| variables_set_id | Yes | ||
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide destructiveHint and idempotentHint. The description adds clarity by stating what remains unchanged (CSV, sampling mode, relationships) and describes the return shape, adding value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with front-loaded purpose. Every sentence adds value—no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, unchanged attributes, and return shape. No output schema, but description references another tool's return shape. Lacks prerequisites or error conditions, but adequate for a simple rename.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description adds some meaning by implying 'name' is the new display name, but does not detail the parameters or their sources (e.g., how to get variables_set_id). Adequate but incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Rename a variables set') and specifies what is not modified (CSV content, sampling mode, relationships), which distinguishes it from sibling tools like tm_change_variables_set_mode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (when renaming a variables set) but does not explicitly contrast with alternatives or provide when-not-to-use guidance. It is adequate but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_resume_runADestructive
Resume a paused run. Continues from the pre-pause position on the RPS curve and any SEQUENTIAL variables-set cursors. Not idempotent in the no-state case — unlike stop/pause, calling resume without an in-flight or paused run is a 400.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive (destructiveHint=true) and non-idempotent (idempotentHint=false) behavior. The description adds specific context: continuation from RPS curve position and SEQUENTIAL variable-set cursors, and clarifies non-idempotency in the no-state case, which adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main action and adds necessary details in a few concise sentences. Minor improvement could be to combine sentences for even tighter structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose and behavior well for a simple tool with one parameter and no output schema, but it lacks parameter explanation and any indication of return values or side effects beyond continuation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter 'profile_id' with no description in the schema (0% coverage). The description does not explain this parameter, leaving ambiguity about its purpose (e.g., run ID vs profile ID).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Resume a paused run' and the resource, distinguishing it from sibling tools like stop/pause by mentioning continuation from pre-pause position.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly compares with stop/pause, warns that calling resume without an in-flight or paused run results in a 400 error, and implies the tool is for resuming previously paused runs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_start_runADestructive
Start a traffic run for the given profile.
Default behavior (wait=False) is fire-and-return: POST to
/api/v1/profiles/{id}/start, return the run id + initial
status, exit. Useful for "kick this off and tell me when it's
done" UI flows.
Set wait=True to drive the CI-gate shape (mirrors the
tm runs start --wait CLI flow):
Snapshot the profile's current top history id (so we can later distinguish "my run's row landed" from "a previous run's row is still there").
Start the run.
Poll
/api/v1/profiles/{id}everypoll_interval_secondsuntilstatusleaves{"RUNNING", "PAUSED"}.Fetch the post-run history row with bounded exponential backoff up to
verdict_timeout_seconds— closes three race windows (terminal-status vs row-insert vs verdict worker; see_fetch_post_run_historyfor the full rationale).
fail_on_verdict triggers the gate evaluation. Accepts a
list of verdict tokens — any of "FAIL", "WARN",
"NO_BASELINE". PASS is deliberately not accepted. Requires
wait=True (the gate needs the verdict, which requires
waiting). Unknown tokens raise ToolError before any HTTP call —
a typo like ["FAILL"] would otherwise produce a silent
false-pass.
Return shape:
.. code-block:: python
# Without wait:
{
"run_id": <str>, # in-memory run id
"profile_id": <int>,
"status": <str>, # initial — typically "RUNNING"
"waited": False,
}
# With wait:
{
"run_id": <int>, # history row id (persisted; use with tm_get_run)
"started_run_id": <str>, # in-memory runId from /start (informational)
"profile_id": <int>,
"status": <str>, # terminal — e.g. "COMPLETED" or "IDLE"
"verdict": <str|None>, # e.g. "FAIL", "PASS", "NO_BASELINE"
"verdict_reasons": <str|None>,
"fail_on_match": <bool|None>, # True when verdict ∈ fail_on_verdict, OR
# when gate is set but verdict is None
# (fail-closed). None when fail_on_verdict
# was not provided.
"metrics": {
"totalRequests": <int>,
"totalErrors": <int>,
"avgRps": <float>,
"peakRps": <float>,
"successRate": <float>,
"latencyQuantiles": {<quantile>: <ms>, ...},
},
"verdict_pending": <bool>, # True iff row appeared but verdict never
# populated within verdict_timeout_seconds
"waited": True,
}Run-correlation defense. Exact runId match. The server
persists the in-memory runId on every RunHistory row (see
RunHistory.runId field). The wait flow compares the row's
runId to the one returned by /start; mismatch → fail
closed with ToolError. This is the definitive correlation —
no time-drift ambiguity, no race window where two starts
within seconds of each other false-negative.
Additional defenses kept as belt-and-suspenders:
triggered_by filter on history fetches: both the pre-start snapshot and the post-run fetch filter
triggered_by="api". Narrows the candidate set to rows we could plausibly have produced; protects the anchor logic from cross-channel collisions.Time-drift fallback (transitional): if a row's
runIdis null (legacy data persisted before the column was added), falls back to the 30s forward / 5s backward drift check. Removable once production rows all carry the field.
Fail closed when ambiguous. Row with neither a runId nor a parseable startedAt → ToolError. Better to surface "can't verify identity" than silently return a possibly-wrong verdict.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes | ||
| wait | No | ||
| fail_on_verdict | No | ||
| wait_timeout_seconds | No | ||
| verdict_timeout_seconds | No | ||
| poll_interval_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotation hints (destructive, not idempotent) by detailing the two execution modes, polling behavior, race window handling, run-correlation defenses, and fail-closed logic. This provides a transparent view of internal workings and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very detailed with multiple paragraphs and code blocks. While well-structured with sections, the length may overwhelm an AI agent looking for quick clarity. Tighter phrasing could improve conciseness without losing critical detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all aspects: purpose, modes, return shapes (both modes), parameter behaviors, error handling, and run-correlation defenses. There is no output schema, so the detailed return shape documentation is essential and fully provided. Edge cases like unknown tokens and run-id mismatch are addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description compensates by explaining most parameters: wait (fire-and-return vs blocking), fail_on_verdict (list of verdict tokens, requires wait, unknown tokens cause error), poll_interval_seconds and verdict_timeout_seconds (used in wait flow). However, wait_timeout_seconds is not explained, leaving a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool starts a traffic run for a given profile. It distinguishes two modes (fire-and-return vs wait) and explains the resource and action. This differentiates it from sibling tools like tm_stop_run or tm_get_run by focusing on initiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use each mode: fire-and-return for UI flows and wait for CI-gate shapes. It also details when fail_on_verdict is applicable and that it requires wait=True. However, it does not explicitly compare with sibling tools like tm_stop_run or tm_pause_run, though the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_stop_runADestructiveIdempotent
Stop the in-flight run for a profile. Fully idempotent —
succeeds with status="IDLE" even when nothing is running.
Any in-flight dispatch loops cancel within a tick on the
server side.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint and idempotentHint. The description adds useful behavioral details: full idempotency, success with status='IDLE', and cancellation of dispatch loops within a tick. These go beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with essential information. No redundant text. Highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required integer param, no output schema, annotations present), the description covers core behavior and idempotency. It does not detail post-stop state or side effects, but is sufficient for a simple stop action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description must explain parameter semantics. It mentions 'for a profile' but does not elaborate on profile_id's meaning or format. The agent must infer its purpose from context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Stop the in-flight run for a profile', specifying verb and resource. However, it does not explicitly distinguish this from sibling tools like tm_pause_run, though the idempotent and destructive hints imply a different behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions idempotency and behavior when nothing is running, but does not provide explicit guidance on when to use this tool versus alternatives like tm_pause_run or tm_start_run. Usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_update_profileADestructiveIdempotent
Update an existing profile by id. Fields you omit are kept as-is.
The underlying API endpoint is a full PUT (the request body replaces every field of the profile), but exposing that directly would force the AI to GET-then-PUT in two calls for every tweak. This tool does the read-merge-write internally: fetches the current profile, overlays the kwargs you provided, PUTs the merged body back.
Use this when you know the profile's id. Examples:
"Make this profile last 5 minutes instead of 1" → call with
profile_id=42, duration_seconds=300."Switch the target to staging" →
profile_id=42, target_url='https://staging.example.com/api'."Replace the RPS curve" →
profile_id=42, points=[...].
Fields not yet exposed (scripts / alerts / schedule) are preserved verbatim from the existing profile.
Rename caveat: the server's PUT endpoint correctly routes
by path id (it pins the request body's profile id to the
path id, so the save path takes its id-based update branch).
But the server does NOT enforce name uniqueness, so a
rename to another profile's name would create a duplicate-
named pair. To keep the data model clean and AI workflows
predictable, this tool still pre-flights a GET /profiles
whenever the name kwarg changes the current value, and
raises :class:ToolError if the new name collides with any
other profile (whitespace + case-insensitive match, mirroring
the server's normalization). Updates that don't change the
name skip this check entirely (no extra roundtrip).
Returns the full updated profile dict.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes | ||
| name | No | ||
| target_url | No | ||
| duration_seconds | No | ||
| points | No | ||
| http_method | No | ||
| request_body | No | ||
| request_headers | No | ||
| loop | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations destructiveHint and idempotentHint are present, but the description adds significant context: internal read-merge-write, rename uniqueness check with GET pre-flight, preservation of unexposed fields, and return value. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear paragraphs and front-loaded purpose. Slightly verbose but every sentence adds value, including examples and caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers internal behavior, rename uniqueness check, and return value. Missing details on error scenarios (e.g., when profile_id not found) but sufficient for an update tool with 9 params and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description partially compensates by explaining key parameters via examples (profile_id, duration_seconds, target_url, points, name). However, not all 9 parameters are documented (e.g., http_method, request_body, request_headers, loop are unmentioned).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update an existing profile by id' and explains partial update semantics. It distinguishes from siblings like tm_create_profile (creation) and tm_delete_profile (deletion).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this when you know the profile's id' and provides examples. Lacks explicit exclusions (e.g., 'do not use to create') but context makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_verify_domain_dnsADestructiveIdempotent
Run the DNS-TXT verification check on a previously-added domain.
The server looks up the TXT record at
_trafficmorph-verify.<domain> and matches it against the
verificationToken issued by :func:tm_add_domain. On
match, the domain flips to verified=true and becomes
usable as a profile target.
On miss the server returns 400 (rather than a polling- style 200 "still pending"). That's deliberate — CI flows fail fast on misconfigured DNS instead of looping forever. The 400 error message includes the expected TXT name + token, so the AI host can read it back to the user verbatim for them to copy into their DNS provider.
Success response is the same VerifiedDomainResponse shape
as :func:tm_add_domain, now with verified=true,
verifiedAt populated, and verificationMethod="DNS"
(the server's stored value — uppercase per
DomainVerificationService.markVerified L112/L148/L183;
other documented values are "HTTP" and "ADMIN").
Pair with :func:tm_list_domains after a successful call to
confirm the flag flipped.
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint: true and destructiveHint: true. The description adds valuable behavioral details: the 400 error on miss (deliberate for fast failure), response shape with verified=true, verifiedAt, verificationMethod='DNS', and specific code references. This goes beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections and bullet points. It is longer than necessary but each sentence adds value, including error handling details and response shape. Could be slightly more concise, but effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter, no output schema, and annotations, the description covers the verification process, error conditions, response details, and integration with other tools (tm_add_domain, tm_list_domains). It is fully complete for an AI agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must compensate. It explains the domain must be previously added via tm_add_domain and implies domain_id is the identifier, but does not explicitly describe the parameter's meaning or constraints beyond that. It adds marginal value over the schema's 'integer' type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'Run the DNS-TXT verification check on a previously-added domain.' It uses specific verb ('verify') and resource ('domain'), and explicitly distinguishes from sibling tm_verify_domain_http by specifying DNS method.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context: run after tm_add_domain, and pair with tm_list_domains to confirm. It explains the 400 error behavior for CI flows. However, it does not explicitly state when not to use this tool or compare with alternatives beyond naming tm_verify_domain_http as a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_verify_domain_httpADestructiveIdempotent
Run the HTTP-token verification check on a previously-added domain.
The server fetches
https://<domain>/.well-known/trafficmorph-verify.txt
(falling back to plain HTTP if HTTPS fails) and matches the
file body against the verificationToken issued by
:func:tm_add_domain — the same token DNS verification
uses; there's only one token per domain. On match, the
domain flips to verified=true.
Alternative to :func:tm_verify_domain_dns for users who can
serve a static file at the target host but can't edit DNS.
Same fail-fast contract: misses return 400 with the expected URL + token in the message, not a "still pending" 200. The error message is constructed to be readable directly to the user (no JSON parsing required by the AI host).
Success response: VerifiedDomainResponse with
verified=true, verifiedAt populated, and
verificationMethod="HTTP" (uppercase — matches the
server's stored value, see :func:tm_verify_domain_dns for
the full set of method tokens).
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Provides detailed behavioral information: fetches file from .well-known, fallback to HTTP, matches token, flips verified, error response format, success response shape. Adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear paragraphs. Each sentence provides necessary information without redundancy. Front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, process, alternatives, error handling, and response format. Despite no output schema, description makes usage clear. Sufficient for a verification tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 0% and only one parameter (domain_id), the description adds context on how the parameter is used in the verification process. Minimal but sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool verifies a domain via HTTP token check. Distinguishes from sibling tm_verify_domain_dns by explicit alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes when to use this tool as alternative to DNS verification for users who can serve a static file. Does not provide explicit exclusions but gives clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
25 tool updates
v1.2.1- First observed
tm_add_domain - First observed
tm_analyse_capture - First observed
tm_change_variables_set_mode - First observed
tm_compare_runs - First observed
tm_create_profile - First observed
tm_create_variables_set - First observed
tm_delete_domain - First observed
tm_delete_profile - First observed
tm_delete_variables_set - First observed
tm_get_profile - First observed
tm_get_run - First observed
tm_get_variables_set - First observed
tm_import_capture - First observed
tm_list_domains - First observed
tm_list_history - First observed
tm_list_profiles - First observed
tm_list_variables_sets - First observed
tm_pause_run - First observed
tm_rename_variables_set - First observed
tm_resume_run - First observed
tm_start_run - First observed
tm_stop_run - First observed
tm_update_profile - First observed
tm_verify_domain_dns - First observed
tm_verify_domain_http
TDQS
Each tool targets a distinct operation (domain management, profile CRUD, run lifecycle, capture analysis/import, variables set management) with no overlapping responsibilities. Even similar tools like tm_verify_domain_dns and tm_verify_domain_http are clearly differentiated by verification method.
All tools follow a consistent 'tm_verb_noun' pattern (e.g., tm_add_domain, tm_get_run, tm_delete_variables_set). No mixing of naming conventions, and verbs are appropriately concise.
25 tools is on the higher side but still well-scoped for a comprehensive traffic testing service covering domains, profiles, runs, captures, and variables sets. Each tool has a clear purpose, and no redundancy is apparent.
The tool surface covers core CRUD and lifecycle operations for all major entities. Minor gaps exist, such as no tool for updating variables set CSV content or managing alert policies, but these are mentioned as deliberately not exposed.
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 Connectors
Drive OctoPerf load testing from any AI agent: import, edit, validate, run scenarios, read metrics.
Deploy, monitor, and manage your OpenClaw AI assistants via natural language.
Manage hosts, redirects, SSL, and traffic analytics from Claude and other AI assistants.
Direct access to Cypress tests results and accessibility reports in your AI workflow.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to programmatically create, execute, and analyze Apache JMeter performance tests. It supports automated bottleneck detection, report generation, and distributed testing management through natural language.MIT
- 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.-

BlazeMeter MCP Serverofficial
AlicenseNot gradedqualityBmaintenanceEnables AI agents to manage performance testing workflows on BlazeMeter's cloud platform through natural language interactions.26Apache 2.0- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to perform DevOps tasks including Kubernetes management, cloud provider operations, CI/CD, security scanning, and infrastructure monitoring through natural language.MIT
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/trafficmorph-gif/tm-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server