@browserstack/mcp-server 1.5.0-beta.2 → 1.5.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/capability/loadtesting.capability-index.json +135 -29
- package/capability/tm.capability-index.json +42368 -12057
- package/dist/tools/capability-registry/bind.js +201 -6
- package/dist/tools/capability-registry/egress.js +52 -6
- package/dist/tools/capability-registry/index-loader.d.ts +15 -1
- package/dist/tools/capability-registry/index-loader.js +92 -2
- package/dist/tools/capability-registry/register.d.ts +14 -0
- package/dist/tools/capability-registry/register.js +367 -117
- package/dist/tools/capability-registry/search.d.ts +108 -3
- package/dist/tools/capability-registry/search.js +381 -14
- package/dist/tools/capability-registry/types.d.ts +80 -6
- package/package.json +7 -2
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"capabilities": [
|
|
13
13
|
{
|
|
14
|
+
"name": "getLoadTestPlatformStatus",
|
|
14
15
|
"method": "GET",
|
|
15
16
|
"path": "/api/v1/agent/platform/status",
|
|
16
17
|
"mode": "read",
|
|
@@ -41,6 +42,7 @@
|
|
|
41
42
|
}
|
|
42
43
|
},
|
|
43
44
|
{
|
|
45
|
+
"name": "listLoadTestProjects",
|
|
44
46
|
"method": "GET",
|
|
45
47
|
"path": "/api/v1/agent/projects",
|
|
46
48
|
"mode": "read",
|
|
@@ -70,7 +72,11 @@
|
|
|
70
72
|
"intent": "List the caller's load-testing projects, most recently active first — use this to find a projectId or answer 'what projects do I have?'",
|
|
71
73
|
"guidance": [
|
|
72
74
|
"projectId from here is required by listLoadTests and createLoadTest.",
|
|
73
|
-
"
|
|
75
|
+
"To find a project by name, pass search=<name> so the server matches it in one call — do NOT page the whole project list to find one. Paging every project is the single largest source of redundant calls on this surface.",
|
|
76
|
+
"NEVER call this repeatedly with limit=1: it returns the same first project every time and makes no progress. To find one project use search=<name>; to browse, make ONE call with a larger limit and page with cursor only if the user wants more.",
|
|
77
|
+
"search is group-scoped and may match projects in more than one project space; when it returns several, disambiguate by the projectId on each row — do not assume the first.",
|
|
78
|
+
"You already have this turn's results — reuse them; do not re-issue an identical call you already made.",
|
|
79
|
+
"Only enumerate with cursor + limit when the user actually wants the full list; nextCursor is opaque."
|
|
74
80
|
],
|
|
75
81
|
"returns": [
|
|
76
82
|
"projects",
|
|
@@ -95,6 +101,7 @@
|
|
|
95
101
|
"max_page_size": 100
|
|
96
102
|
},
|
|
97
103
|
{
|
|
104
|
+
"name": "listLoadTests",
|
|
98
105
|
"method": "GET",
|
|
99
106
|
"path": "/api/v1/agent/projects/{projectId}/loadTests",
|
|
100
107
|
"mode": "read",
|
|
@@ -158,6 +165,8 @@
|
|
|
158
165
|
"intent": "List the load tests in a project — use this to find a testId or browse tests, optionally filtered by type, framework, tag or recent activity.",
|
|
159
166
|
"guidance": [
|
|
160
167
|
"Resolve projectId via listLoadTestProjects first.",
|
|
168
|
+
"To find a test by name, pass search=<name> so the server matches it in one call — do not page the whole project and match names yourself. In a large project this is the difference between one call and many.",
|
|
169
|
+
"If several tests match the name, disambiguate by lastRun / updatedSince — do not guess. A descriptive or auto-generated name (e.g. Automation_lts_*) is a real test, not noise; never silently drop it in favour of one that merely sounds more relevant.",
|
|
161
170
|
"The numeric testId returned here is what getLoadTest and startLoadTestRun need — not a runId.",
|
|
162
171
|
"lastRun summarises the most recent execution when present."
|
|
163
172
|
],
|
|
@@ -187,6 +196,50 @@
|
|
|
187
196
|
"max_page_size": 100
|
|
188
197
|
},
|
|
189
198
|
{
|
|
199
|
+
"name": "searchLoadTests",
|
|
200
|
+
"method": "GET",
|
|
201
|
+
"path": "/api/v1/agent/loadTests/search",
|
|
202
|
+
"mode": "read",
|
|
203
|
+
"entity": "loadTest",
|
|
204
|
+
"query": [
|
|
205
|
+
{
|
|
206
|
+
"name": "name",
|
|
207
|
+
"type": "string",
|
|
208
|
+
"description": "Test name to search for (substring match, case-insensitive); required."
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"name": "limit",
|
|
212
|
+
"type": "integer",
|
|
213
|
+
"description": "Max items to return (1-100, default 50)."
|
|
214
|
+
}
|
|
215
|
+
],
|
|
216
|
+
"intent": "Find a load test by name across ALL of the caller's projects — use this to resolve a named test to a testId without knowing which project it is in.",
|
|
217
|
+
"guidance": [
|
|
218
|
+
"Group-scoped: unlike listLoadTests it needs no projectId. Prefer it to resolve a named test in one call instead of paging every project.",
|
|
219
|
+
"Each row carries testId, projectId, name, testType and framework — disambiguate same-named tests in different projects by projectId.",
|
|
220
|
+
"Returns one row per test (its latest version); the numeric testId is what getLoadTest and startLoadTestRun need."
|
|
221
|
+
],
|
|
222
|
+
"returns": [
|
|
223
|
+
"tests",
|
|
224
|
+
"hasMore"
|
|
225
|
+
],
|
|
226
|
+
"responses": {
|
|
227
|
+
"200": {
|
|
228
|
+
"$response": "Success"
|
|
229
|
+
},
|
|
230
|
+
"400": {
|
|
231
|
+
"$response": "BadRequest"
|
|
232
|
+
},
|
|
233
|
+
"401": {
|
|
234
|
+
"$response": "Unauthorized"
|
|
235
|
+
},
|
|
236
|
+
"500": {
|
|
237
|
+
"$response": "InternalServerError"
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"name": "getLoadTestProjectTrends",
|
|
190
243
|
"method": "GET",
|
|
191
244
|
"path": "/api/v1/agent/projects/{projectId}/trends",
|
|
192
245
|
"mode": "read",
|
|
@@ -267,6 +320,7 @@
|
|
|
267
320
|
}
|
|
268
321
|
},
|
|
269
322
|
{
|
|
323
|
+
"name": "listProjectLoadTestRuns",
|
|
270
324
|
"method": "GET",
|
|
271
325
|
"path": "/api/v1/agent/projects/{projectId}/runs",
|
|
272
326
|
"mode": "read",
|
|
@@ -329,11 +383,17 @@
|
|
|
329
383
|
"name": "hadSlaBreach",
|
|
330
384
|
"type": "boolean",
|
|
331
385
|
"description": "Filter to runs that did / did not breach SLA."
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"name": "tag",
|
|
389
|
+
"type": "string",
|
|
390
|
+
"description": "Filter to runs carrying this tag (a run's own tags, or the tags it inherits from its test when it has none of its own)."
|
|
332
391
|
}
|
|
333
392
|
],
|
|
334
393
|
"intent": "List the execution history across every load test in a project — newest first, paginated. Use for 'what ran last week in this project?' or to find runs across tests to compare.",
|
|
335
394
|
"guidance": [
|
|
336
395
|
"Returns run metadata only, not metrics — use getLoadTestRunReport for a run's KPIs.",
|
|
396
|
+
"Each run carries a tags array — its own run-level tags if set (via updateLoadTest with runId), otherwise the tags inherited from its test. Filter with the tag query param.",
|
|
337
397
|
"Page with cursor + limit; nextCursor is opaque.",
|
|
338
398
|
"For a single test's history use /loadTests/{testId}/runs; for currently-live runs use /loadTests/runs/active.",
|
|
339
399
|
"One call returns the page of run history — reuse it for follow-ups and page with cursor only when more rows are needed; do not re-list the same window."
|
|
@@ -364,6 +424,7 @@
|
|
|
364
424
|
"max_page_size": 100
|
|
365
425
|
},
|
|
366
426
|
{
|
|
427
|
+
"name": "listActiveLoadTestRuns",
|
|
367
428
|
"method": "GET",
|
|
368
429
|
"path": "/api/v1/agent/loadTests/runs/active",
|
|
369
430
|
"mode": "read",
|
|
@@ -388,12 +449,18 @@
|
|
|
388
449
|
"name": "userId",
|
|
389
450
|
"type": "integer",
|
|
390
451
|
"description": "Restrict to runs started by a user."
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
"name": "tag",
|
|
455
|
+
"type": "string",
|
|
456
|
+
"description": "Filter to runs carrying this tag (a run's own tags, or the tags it inherits from its test when it has none of its own)."
|
|
391
457
|
}
|
|
392
458
|
],
|
|
393
459
|
"intent": "List load-test runs currently executing — use this for 'what's running right now?' or to find a runId to stop or monitor.",
|
|
394
460
|
"guidance": [
|
|
395
461
|
"Returns non-terminal runs across the account.",
|
|
396
462
|
"runId here is the UUID needed by getLoadTestRunStatus and stopLoadTestRun.",
|
|
463
|
+
"Each run carries a tags array — its own run-level tags if set, otherwise the tags inherited from its test. Filter with the tag query param.",
|
|
397
464
|
"vuHoursBurnedSoFar reflects consumption at the moment of the call."
|
|
398
465
|
],
|
|
399
466
|
"returns": [
|
|
@@ -415,6 +482,7 @@
|
|
|
415
482
|
}
|
|
416
483
|
},
|
|
417
484
|
{
|
|
485
|
+
"name": "getLoadTestRunStatus",
|
|
418
486
|
"method": "GET",
|
|
419
487
|
"path": "/api/v1/agent/loadTests/runs/{jobId}/status",
|
|
420
488
|
"mode": "read",
|
|
@@ -468,6 +536,7 @@
|
|
|
468
536
|
}
|
|
469
537
|
},
|
|
470
538
|
{
|
|
539
|
+
"name": "getLoadTestInsightSummary",
|
|
471
540
|
"method": "GET",
|
|
472
541
|
"path": "/api/v1/agent/loadTests/runs/{jobId}/insights",
|
|
473
542
|
"mode": "read",
|
|
@@ -516,15 +585,16 @@
|
|
|
516
585
|
"404": {
|
|
517
586
|
"$response": "NotFound"
|
|
518
587
|
},
|
|
519
|
-
"503": {
|
|
520
|
-
"$response": "ServiceUnavailable"
|
|
521
|
-
},
|
|
522
588
|
"500": {
|
|
523
589
|
"$response": "InternalServerError"
|
|
590
|
+
},
|
|
591
|
+
"503": {
|
|
592
|
+
"$response": "ServiceUnavailable"
|
|
524
593
|
}
|
|
525
594
|
}
|
|
526
595
|
},
|
|
527
596
|
{
|
|
597
|
+
"name": "getLoadTestRunReport",
|
|
528
598
|
"method": "GET",
|
|
529
599
|
"path": "/api/v1/agent/loadTests/runs/{jobId}/report",
|
|
530
600
|
"mode": "read",
|
|
@@ -581,14 +651,7 @@
|
|
|
581
651
|
{
|
|
582
652
|
"name": "errorCategory",
|
|
583
653
|
"type": "string",
|
|
584
|
-
"
|
|
585
|
-
"5xx",
|
|
586
|
-
"4xx",
|
|
587
|
-
"timeout",
|
|
588
|
-
"connection",
|
|
589
|
-
"assertion"
|
|
590
|
-
],
|
|
591
|
-
"description": "Comma-separated error categories to include."
|
|
654
|
+
"description": "Comma-separated error categories — any combination of: 5xx, 4xx, timeout, connection, assertion (e.g. \"5xx,4xx\")."
|
|
592
655
|
},
|
|
593
656
|
{
|
|
594
657
|
"name": "metrics",
|
|
@@ -651,6 +714,7 @@
|
|
|
651
714
|
}
|
|
652
715
|
},
|
|
653
716
|
{
|
|
717
|
+
"name": "stopLoadTestRun",
|
|
654
718
|
"method": "POST",
|
|
655
719
|
"path": "/api/v1/agent/loadTests/runs/{jobId}/stop",
|
|
656
720
|
"mode": "write",
|
|
@@ -692,6 +756,7 @@
|
|
|
692
756
|
}
|
|
693
757
|
},
|
|
694
758
|
{
|
|
759
|
+
"name": "getLoadTestQuota",
|
|
695
760
|
"method": "GET",
|
|
696
761
|
"path": "/api/v1/agent/loadTests/quota",
|
|
697
762
|
"mode": "read",
|
|
@@ -722,6 +787,7 @@
|
|
|
722
787
|
}
|
|
723
788
|
},
|
|
724
789
|
{
|
|
790
|
+
"name": "estimateLoadTestRunCost",
|
|
725
791
|
"method": "POST",
|
|
726
792
|
"path": "/api/v1/agent/loadTests/estimate",
|
|
727
793
|
"mode": "read",
|
|
@@ -754,7 +820,9 @@
|
|
|
754
820
|
"Read-only despite being a POST — nothing is started.",
|
|
755
821
|
"fitsInQuota / remainingAfterEstimate compare the estimate against current quota.",
|
|
756
822
|
"For the same check at start time, call startLoadTestRun with dryRun:true.",
|
|
757
|
-
"Always use this for a cost or VU-hour estimate of a hypothetical run — it models ramp-up. Do not compute VU-hours by hand from VUs × duration."
|
|
823
|
+
"Always use this for a cost or VU-hour estimate of a hypothetical run — it models ramp-up. Do not compute VU-hours by hand from VUs × duration.",
|
|
824
|
+
"A protocol (plu) run is billed at a full load-generator pod's capacity (e.g. 1000 VUs for k6), not the VUs it actually uses, and carries a minimum billing floor (5 minutes) — so a small or short plu run can estimate far higher than VUs × duration would suggest. That is expected; report the returned estimatedVuHours as-is rather than second-guessing it as an error.",
|
|
825
|
+
"The estimate is for the test's OWN type: a browser (blu) run costs about 10x a protocol (plu) run at the same VUs and duration (browser VUs carry a 10x weight). So the number depends heavily on whether the test is plu, blu or hybrid — always state which type the estimate is for. When the user asks about a hypothetical run without fixing the type, do not silently inherit the type of whatever test you priced against: say the type explicitly, and if it is genuinely open, give both the plu and blu figures (they differ ~10x) or ask which they mean."
|
|
758
826
|
],
|
|
759
827
|
"returns": [
|
|
760
828
|
"estimatedVuHours",
|
|
@@ -780,6 +848,7 @@
|
|
|
780
848
|
}
|
|
781
849
|
},
|
|
782
850
|
{
|
|
851
|
+
"name": "compareLoadTestRuns",
|
|
783
852
|
"method": "POST",
|
|
784
853
|
"path": "/api/v1/agent/loadTests/compare",
|
|
785
854
|
"mode": "read",
|
|
@@ -859,6 +928,7 @@
|
|
|
859
928
|
}
|
|
860
929
|
},
|
|
861
930
|
{
|
|
931
|
+
"name": "createLoadTest",
|
|
862
932
|
"method": "POST",
|
|
863
933
|
"path": "/api/v1/agent/loadTests",
|
|
864
934
|
"mode": "write",
|
|
@@ -874,6 +944,7 @@
|
|
|
874
944
|
"name": "testType",
|
|
875
945
|
"type": "string",
|
|
876
946
|
"required": true,
|
|
947
|
+
"description": "plu = protocol/API load; blu = real-browser load; hybrid = BOTH in one test (one PLU leg + one BLU leg, supplied via children). These tokens are INTERNAL wire values — send them here but never show them to the user; the user-facing labels are 'API / Protocol' (plu), 'Browser' (blu) and 'Hybrid' (hybrid). All three are valid, user-selectable options — hybrid is not a rare/advanced variant, offer it alongside the other two.",
|
|
877
948
|
"values": [
|
|
878
949
|
"plu",
|
|
879
950
|
"blu",
|
|
@@ -884,11 +955,17 @@
|
|
|
884
955
|
"name": "framework",
|
|
885
956
|
"type": "string",
|
|
886
957
|
"required": true,
|
|
958
|
+
"description": "PLU (protocol) frameworks: k6, jmeter, gatling, locust. BLU (browser) frameworks: playwright, selenium, webdriverio, nightwatch, lcncnightwatch. Must match testType — a PLU framework for testType plu, a BLU framework for testType blu (the backend rejects a mismatched pair).",
|
|
887
959
|
"values": [
|
|
888
960
|
"k6",
|
|
889
961
|
"jmeter",
|
|
890
962
|
"gatling",
|
|
891
|
-
"locust"
|
|
963
|
+
"locust",
|
|
964
|
+
"playwright",
|
|
965
|
+
"selenium",
|
|
966
|
+
"webdriverio",
|
|
967
|
+
"nightwatch",
|
|
968
|
+
"lcncnightwatch"
|
|
892
969
|
]
|
|
893
970
|
},
|
|
894
971
|
{
|
|
@@ -904,12 +981,12 @@
|
|
|
904
981
|
{
|
|
905
982
|
"name": "config",
|
|
906
983
|
"type": "object",
|
|
907
|
-
"description": "Test configuration incl. scriptRef {source: s3|s3_upload|existing_zip_id, value|identifier}, vuRamp, durationSec, loadGeneratorLocations, slaThresholds, envVarKeys, tags. To supply a script from a local file or URL, use the pendingScriptUpload flow, then source='s3'."
|
|
984
|
+
"description": "Test configuration incl. scriptRef {source: s3|s3_upload|existing_zip_id|sample, value|identifier}, loadProfile (constant|ramping|iterations|throughput), vus, vuRamp, durationSec, iterations, targetRps, maxVus, loadGeneratorLocations, slaThresholds, envVarKeys, tags. See the load-profile guidance for which fields each loadProfile needs (iterations + throughput are PLU-only). To supply a script from a local file or URL, use the pendingScriptUpload flow, then source='s3'. To create a test from the platform's built-in sample (no upload), use scriptRef:{source:'sample'} — for Selenium also pass scriptRef.subType (testng|junit|vanillajava|python|pytest|jest|serenity-cucumber)."
|
|
908
985
|
},
|
|
909
986
|
{
|
|
910
987
|
"name": "children",
|
|
911
988
|
"type": "array",
|
|
912
|
-
"description": "Child scenarios for hybrid
|
|
989
|
+
"description": "Child scenarios for a hybrid test. A hybrid is exactly one PLU (protocol) leg + one BLU (browser) leg — each leg carries its own framework + scriptRef (a sample or an uploaded script). Send the BLU leg as the top-level testType='blu'/framework/config and put the PLU leg in children[] (one entry, testType='plu' with its framework + config.scriptRef). The backend requires exactly one PLU and one BLU leg and rejects any other composition."
|
|
913
990
|
},
|
|
914
991
|
{
|
|
915
992
|
"name": "idempotencyKey",
|
|
@@ -939,9 +1016,17 @@
|
|
|
939
1016
|
],
|
|
940
1017
|
"intent": "Create a new load test in a project — use this to define a test before running it. JSON body only (no multipart).",
|
|
941
1018
|
"guidance": [
|
|
1019
|
+
"PRECONDITION — do NOT call this endpoint until THREE things are known: (1) testType (plu/blu/hybrid), (2) framework, (3) the script (a built-in sample or the user's own upload). These are MANDATORY and NOT defaultable — never infer or default them. If the user's request does not state one of the three, ASK the user for the missing ones and WAIT for their answer before creating. 'create a test' with no type/framework/script named means all three are missing → ask all three; do not silently pick k6/plu/sample. Only vus, duration, region and load profile are defaultable (see the DEFAULTS line) — the three above are not.",
|
|
1020
|
+
"'plu' / 'blu' / 'hybrid' are INTERNAL wire values — send them in the request, but NEVER show them to the user. Do not print them in questions, option labels, confirmations, summaries, or prose (no 'Browser (BLU)', no '(plu+blu)'). User-facing labels are: plu → 'API / Protocol', blu → 'Browser', hybrid → 'Hybrid (both API and Browser)'. Frameworks (k6, jmeter, selenium, playwright, …) are real product names and ARE shown to the user.",
|
|
1021
|
+
"When you ASK the user to pick testType or framework, present the FULL, exact option set — never drop, merge, or cross-contaminate options. testType: offer all THREE, using the user-facing labels above — 'API / Protocol', 'Browser', and 'Hybrid'; do not omit Hybrid. framework (ask AFTER testType is chosen, and show only that type's frameworks, each as its OWN separate option): for an API/Protocol test offer exactly k6, jmeter, gatling AND locust (all four — do not drop locust); for a Browser test offer exactly playwright, selenium, webdriverio AND nightwatch (all four — never list the API/Protocol frameworks under a Browser test, and never merge selenium and playwright into one option). For a Hybrid test, collect an API/Protocol leg (its framework + script) AND a Browser leg (its framework + script) and assemble them per the children field — Hybrid needs both legs, so it takes more than the three questions a single-type test does.",
|
|
942
1022
|
"Provide exactly one of projectId or projectName; projectName creates the project if absent.",
|
|
943
1023
|
"Script upload is two-phase: send pendingScriptUpload to get a presigned uploadUrl + s3Key, PUT the file, then call create again with the scriptRef source and s3Key returned in the response's nextStep.",
|
|
944
|
-
"
|
|
1024
|
+
"To spin up a test from a built-in sample with NO file handling (the dashboard's 'use sample script'), pass scriptRef:{source:'sample'} — the platform's bundled sample for the given framework is used. For Selenium, also pass scriptRef.subType (testng|junit|vanillajava|python|pytest|jest|serenity-cucumber) to pick the binding. testType and framework are still needed; the load profile defaults to constant 1 VU / 30s (see below).",
|
|
1025
|
+
"Pass idempotencyKey so a retried create does not duplicate the test.",
|
|
1026
|
+
"Only THREE things must be known before creating, and each is taken from the user's request when they've stated it — ask ONLY for the ones still missing, and ask about nothing else: (1) testType — plu (protocol / API load), blu (real-browser load) or hybrid (both); (2) framework — k6 / jmeter / gatling / locust for plu, playwright / selenium / webdriverio / nightwatch for blu; (3) the script — a built-in sample (scriptRef:{source:'sample'}; for Selenium also pass scriptRef.subType) OR the user's own script via the pendingScriptUpload flow. Do not guess a framework/testType, but do not re-ask for one the user already gave.",
|
|
1027
|
+
"There is no clone capability. To duplicate a test, getLoadTest the source and copy its full config into this create — vuRamp/vus, durationSec, loadGeneratorLocations and slaThresholds included; nothing is inherited from the source, so anything you omit is dropped.",
|
|
1028
|
+
"DEFAULTS apply ONLY after the three mandatory fields (testType, framework, script) are known — they never substitute for a missing one of those. Everything BEYOND those three — do not ask about it; apply the default unless the user explicitly specifies otherwise: loadProfile='constant', config.vus=1, config.durationSec=30, region us-east-1 (omit loadGeneratorLocations so the backend defaults it), and NO advanced features (do not enable log capture, response capture, artifacts, thresholds, etc.). Send config.vus=1 + config.durationSec=30 with no vuRamp for the default constant profile.",
|
|
1029
|
+
"Only when the user explicitly asks for a different load shape, set config.loadProfile: 'ramping' (config.vuRamp: array of {vus, durationSec} stages; ramp up/down is inferred from adjacent VU deltas), 'iterations' (PLU only — config.iterations = fixed run count, plus config.vus), or 'throughput' (PLU and only JMeter/Gatling/locust/k6 — config.targetRps + config.maxVus + config.durationSec). A stage's own 'type' is NOT honored — every stage persists as a hold."
|
|
945
1030
|
],
|
|
946
1031
|
"returns": [
|
|
947
1032
|
"testId",
|
|
@@ -966,6 +1051,7 @@
|
|
|
966
1051
|
}
|
|
967
1052
|
},
|
|
968
1053
|
{
|
|
1054
|
+
"name": "startLoadTestRun",
|
|
969
1055
|
"method": "POST",
|
|
970
1056
|
"path": "/api/v1/agent/loadTests/{testId}/runs",
|
|
971
1057
|
"mode": "write",
|
|
@@ -1021,7 +1107,8 @@
|
|
|
1021
1107
|
"guidance": [
|
|
1022
1108
|
"testId is the numeric test id, not a run id.",
|
|
1023
1109
|
"dryRun:true returns the VU-hour estimate and quota fit without starting anything.",
|
|
1024
|
-
"On success returns runId (UUID) + dashboardLink; poll getLoadTestRunStatus with the runId."
|
|
1110
|
+
"On success returns runId (UUID) + dashboardLink; poll getLoadTestRunStatus with the runId.",
|
|
1111
|
+
"A run without dryRun generates real load and consumes VU-hours. Unless the user has already asked to run it now, dryRun:true first, show the estimate/quota fit and the parameters that will be used (VUs, duration, target), and start the real run only after the user confirms — do not treat your own confirmation as the user's."
|
|
1025
1112
|
],
|
|
1026
1113
|
"returns": [
|
|
1027
1114
|
"runId",
|
|
@@ -1049,6 +1136,7 @@
|
|
|
1049
1136
|
}
|
|
1050
1137
|
},
|
|
1051
1138
|
{
|
|
1139
|
+
"name": "listLoadTestRuns",
|
|
1052
1140
|
"method": "GET",
|
|
1053
1141
|
"path": "/api/v1/agent/loadTests/{testId}/runs",
|
|
1054
1142
|
"mode": "read",
|
|
@@ -1105,12 +1193,20 @@
|
|
|
1105
1193
|
"name": "hadSlaBreach",
|
|
1106
1194
|
"type": "boolean",
|
|
1107
1195
|
"description": "Only runs that breached an SLA."
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
"name": "tag",
|
|
1199
|
+
"type": "string",
|
|
1200
|
+
"description": "Filter to runs carrying this tag (a run's own tags, or the tags it inherits from the test when it has none of its own)."
|
|
1108
1201
|
}
|
|
1109
1202
|
],
|
|
1110
1203
|
"intent": "List the execution history of a test — use this to find past runs of a specific test or to get a runId.",
|
|
1111
1204
|
"guidance": [
|
|
1112
1205
|
"testId is numeric; runId values returned are UUIDs.",
|
|
1206
|
+
"Each run carries a tags array — its own run-level tags if set (via updateLoadTest with runId), otherwise the tags inherited from the test. Filter with the tag query param.",
|
|
1113
1207
|
"Filter with status / verdict / date range; page with cursor + limit.",
|
|
1208
|
+
"To find a run by date, pass sinceIso/untilIso to narrow server-side — do not list the full history and scan it yourself. To compare two dated runs, make one narrowed call per date rather than one broad listing.",
|
|
1209
|
+
"If a date resolves to more than one run, ask the user which; do not assume the first or the latest.",
|
|
1114
1210
|
"One call returns this test's run history — reuse it and page with cursor when needed; do not re-list the same window."
|
|
1115
1211
|
],
|
|
1116
1212
|
"returns": [
|
|
@@ -1139,6 +1235,7 @@
|
|
|
1139
1235
|
"max_page_size": 100
|
|
1140
1236
|
},
|
|
1141
1237
|
{
|
|
1238
|
+
"name": "getLoadTestHistoricalTrends",
|
|
1142
1239
|
"method": "GET",
|
|
1143
1240
|
"path": "/api/v1/agent/loadTests/{testId}/trends",
|
|
1144
1241
|
"mode": "read",
|
|
@@ -1218,6 +1315,7 @@
|
|
|
1218
1315
|
}
|
|
1219
1316
|
},
|
|
1220
1317
|
{
|
|
1318
|
+
"name": "getLoadTestMetricsManifest",
|
|
1221
1319
|
"method": "GET",
|
|
1222
1320
|
"path": "/api/v1/agent/loadTests/{testId}/metricsManifest",
|
|
1223
1321
|
"mode": "read",
|
|
@@ -1258,6 +1356,7 @@
|
|
|
1258
1356
|
}
|
|
1259
1357
|
},
|
|
1260
1358
|
{
|
|
1359
|
+
"name": "updateLoadTest",
|
|
1261
1360
|
"method": "PUT",
|
|
1262
1361
|
"path": "/api/v1/agent/loadTests/{testId}",
|
|
1263
1362
|
"mode": "write",
|
|
@@ -1304,13 +1403,22 @@
|
|
|
1304
1403
|
"type": "string"
|
|
1305
1404
|
}
|
|
1306
1405
|
]
|
|
1406
|
+
},
|
|
1407
|
+
{
|
|
1408
|
+
"name": "runId",
|
|
1409
|
+
"type": "string",
|
|
1410
|
+
"description": "Tag a specific RUN instead of the test definition. When set, config.tags is applied to that run's own tags (the saved test is NOT changed); only config.tags may accompany runId. Omit it to edit the test."
|
|
1307
1411
|
}
|
|
1308
1412
|
],
|
|
1309
|
-
"intent": "Update an existing load test's name or configuration — use this to change tags, SLA thresholds, script or settings.",
|
|
1413
|
+
"intent": "Update an existing load test's name or configuration — use this to change tags, SLA thresholds, script or settings; also tags a specific run when runId is set.",
|
|
1310
1414
|
"guidance": [
|
|
1311
1415
|
"Partial update: send only the fields to change.",
|
|
1312
1416
|
"Pass ifVersion for optimistic concurrency; a stale value returns 409 VERSION_CONFLICT.",
|
|
1313
|
-
"Script replacement uses the same two-phase pendingScriptUpload flow as create."
|
|
1417
|
+
"Script replacement uses the same two-phase pendingScriptUpload flow as create.",
|
|
1418
|
+
"config is a partial update, but each field it carries REPLACES that field wholesale — it does not merge. tags overwrites the entire tag set; it does not append. To add a tag to a test (or the same tag across several tests), getLoadTest each one first and send the union under config.tags.",
|
|
1419
|
+
"To change the load profile, send config.loadProfile plus that profile's fields (see createLoadTest's load-profile guidance for the four shapes). Switching profiles clears the previous profile's fields — e.g. ramping→throughput empties the stages and drops iterations. iterations and throughput are PLU-only.",
|
|
1420
|
+
"To tag a specific RUN rather than the test, pass runId (a run UUID from listLoadTestRuns) together with config.tags — the tags apply to that one run and the saved test is untouched. A run inherits the test's tags until you set its own; setting run tags overrides (they also replace wholesale, so send the union to add). Omit runId to tag the test itself.",
|
|
1421
|
+
"Tags live on the load test, not on its runs — there is no per-run tagging, so do not touch runs when asked to tag a test. To tag every test in a project, list them with listLoadTests and page through with cursor until hasMore is false, then updateLoadTest each one — do not stop after the first page or a subset."
|
|
1314
1422
|
],
|
|
1315
1423
|
"returns": [
|
|
1316
1424
|
"testId",
|
|
@@ -1338,6 +1446,7 @@
|
|
|
1338
1446
|
}
|
|
1339
1447
|
},
|
|
1340
1448
|
{
|
|
1449
|
+
"name": "getLoadTest",
|
|
1341
1450
|
"method": "GET",
|
|
1342
1451
|
"path": "/api/v1/agent/loadTests/{testId}",
|
|
1343
1452
|
"mode": "read",
|
|
@@ -1353,13 +1462,7 @@
|
|
|
1353
1462
|
{
|
|
1354
1463
|
"name": "include",
|
|
1355
1464
|
"type": "string",
|
|
1356
|
-
"
|
|
1357
|
-
"config",
|
|
1358
|
-
"thresholds",
|
|
1359
|
-
"tags",
|
|
1360
|
-
"children"
|
|
1361
|
-
],
|
|
1362
|
-
"description": "Comma-separated sub-resources to expand."
|
|
1465
|
+
"description": "Comma-separated sub-resources to expand — any combination of: config, thresholds, tags, children (e.g. \"config,thresholds\"). Ask for everything you need in ONE call (include=config,thresholds,tags) rather than one request per sub-resource."
|
|
1363
1466
|
},
|
|
1364
1467
|
{
|
|
1365
1468
|
"name": "fields",
|
|
@@ -1534,6 +1637,7 @@
|
|
|
1534
1637
|
],
|
|
1535
1638
|
"capabilities": [
|
|
1536
1639
|
"listLoadTests",
|
|
1640
|
+
"searchLoadTests",
|
|
1537
1641
|
"getLoadTest",
|
|
1538
1642
|
"createLoadTest",
|
|
1539
1643
|
"updateLoadTest"
|
|
@@ -1573,7 +1677,8 @@
|
|
|
1573
1677
|
"stopLoadTestRun",
|
|
1574
1678
|
"getLoadTestRunStatus",
|
|
1575
1679
|
"listLoadTestRuns",
|
|
1576
|
-
"listActiveLoadTestRuns"
|
|
1680
|
+
"listActiveLoadTestRuns",
|
|
1681
|
+
"listProjectLoadTestRuns"
|
|
1577
1682
|
]
|
|
1578
1683
|
},
|
|
1579
1684
|
"project": {
|
|
@@ -1682,7 +1787,8 @@
|
|
|
1682
1787
|
}
|
|
1683
1788
|
],
|
|
1684
1789
|
"capabilities": [
|
|
1685
|
-
"getLoadTestHistoricalTrends"
|
|
1790
|
+
"getLoadTestHistoricalTrends",
|
|
1791
|
+
"getLoadTestProjectTrends"
|
|
1686
1792
|
]
|
|
1687
1793
|
},
|
|
1688
1794
|
"quota": {
|