@kaminari-ad/mcp 0.6.0 → 0.8.0

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/CHANGELOG.md CHANGED
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.0] - 2026-07-10
11
+
12
+ ### Added
13
+
14
+ - **VAST video-ad support.** `create_scan`, `create_bulk_scans`,
15
+ `create_campaign` (new `vast` campaign type), and `update_campaign` now
16
+ accept a `vast_tag` — an http(s) URL of a VAST endpoint or raw VAST XML —
17
+ mutually exclusive with `url` / `ad_tag`. Scan responses surface
18
+ `creative_kind` (`banner` | `video`) plus a `video` block (duration,
19
+ media-file URL, VAST version, ad system, VPAID flag, wrapper depth), and the
20
+ scan-list brief carries `is_vast`. Regenerated the OpenAPI type + zod-schema
21
+ snapshots against the updated `/api/v1` surface.
22
+
10
23
  ## [0.6.0] - 2026-06-30
11
24
 
12
25
  ### Changed
package/dist/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { NAME, VERSION, err, ok } from './chunk-CEKRYHCR.js';
2
+ import { NAME, VERSION, err, ok } from './chunk-HZXVKCW3.js';
3
3
  import process from 'process';
4
4
  import { z } from 'zod';
5
5
 
@@ -160,10 +160,10 @@ async function main() {
160
160
  }
161
161
  const config = configResult.value;
162
162
  if (config.transport === "stdio") {
163
- const { bootstrapStdio } = await import('./stdio-bootstrap-4UHUIN7N.js');
163
+ const { bootstrapStdio } = await import('./stdio-bootstrap-KIBN4X7J.js');
164
164
  return bootstrapStdio(config);
165
165
  }
166
- const { bootstrapHttp } = await import('./http-bootstrap-DAPC3LFX.js');
166
+ const { bootstrapHttp } = await import('./http-bootstrap-5SJGGI5Y.js');
167
167
  return bootstrapHttp(config);
168
168
  }
169
169
  main().then(
@@ -3,8 +3,8 @@ export { err, ok } from 'neverthrow';
3
3
 
4
4
  // src/shared/version.ts
5
5
  var NAME = "@kaminari-ad/mcp";
6
- var VERSION = "0.6.0";
6
+ var VERSION = "0.8.0";
7
7
 
8
8
  export { NAME, VERSION };
9
- //# sourceMappingURL=chunk-CEKRYHCR.js.map
10
- //# sourceMappingURL=chunk-CEKRYHCR.js.map
9
+ //# sourceMappingURL=chunk-HZXVKCW3.js.map
10
+ //# sourceMappingURL=chunk-HZXVKCW3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/version.ts"],"names":[],"mappings":";;;;AASO,IAAM,IAAA,GAAO;AACb,IAAM,OAAA,GAAU","file":"chunk-CEKRYHCR.js","sourcesContent":["/**\n * Package version and name. Hard-coded as constants here, asserted to\n * match `package.json` by a unit test.\n *\n * Why not import `package.json`: it would force JSON-module support at\n * runtime and tsup-bundling would inline the entire manifest. Two\n * constants + one assertion test is simpler and gives the same safety.\n */\n\nexport const NAME = \"@kaminari-ad/mcp\";\nexport const VERSION = \"0.6.0\";\n"]}
1
+ {"version":3,"sources":["../src/shared/version.ts"],"names":[],"mappings":";;;;AASO,IAAM,IAAA,GAAO;AACb,IAAM,OAAA,GAAU","file":"chunk-HZXVKCW3.js","sourcesContent":["/**\n * Package version and name. Hard-coded as constants here, asserted to\n * match `package.json` by a unit test.\n *\n * Why not import `package.json`: it would force JSON-module support at\n * runtime and tsup-bundling would inline the entire manifest. Two\n * constants + one assertion test is simpler and gives the same safety.\n */\n\nexport const NAME = \"@kaminari-ad/mcp\";\nexport const VERSION = \"0.8.0\";\n"]}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { err, ok } from './chunk-CEKRYHCR.js';
2
+ import { err, ok } from './chunk-HZXVKCW3.js';
3
3
  import { createHash, randomUUID } from 'crypto';
4
4
  import createClient from 'openapi-fetch';
5
5
  import { fetch } from 'undici';
@@ -155,12 +155,16 @@ var OrganizationStatus = z.enum([
155
155
  "suspended",
156
156
  "rejected"
157
157
  ]);
158
+ var OrgTransitionAction = z.enum(["approve", "reject", "suspend", "reactivate"]);
159
+ var OrgTransitionOptionResponse = z.object({ target_status: OrganizationStatus, action: OrgTransitionAction }).passthrough();
158
160
  var OrgResponse = z.object({
159
161
  id: z.string().uuid(),
160
162
  name: z.string(),
161
- owner_id: z.string().uuid(),
163
+ owner_id: z.union([z.string(), z.null()]),
162
164
  status: OrganizationStatus,
165
+ domain: z.union([z.string(), z.null()]).optional(),
163
166
  created_at: z.string().datetime({ offset: true }),
167
+ available_transitions: z.array(OrgTransitionOptionResponse).optional().default([]),
164
168
  is_active: z.boolean()
165
169
  }).passthrough();
166
170
  z.object({ name: z.union([z.string(), z.null()]) }).partial().passthrough();
@@ -190,6 +194,7 @@ var UserResponse = z.object({
190
194
  name: z.string(),
191
195
  role_id: z.string().uuid(),
192
196
  role_name: z.string(),
197
+ role_scope: z.string().optional().default("org"),
193
198
  organization_id: z.string().uuid(),
194
199
  organization_name: z.string(),
195
200
  is_active: z.boolean(),
@@ -238,6 +243,7 @@ var ProxyTargetRequest = z.object({
238
243
  z.object({
239
244
  url: z.union([z.string(), z.null()]).optional(),
240
245
  ad_tag: z.union([z.string(), z.null()]).optional(),
246
+ vast_tag: z.union([z.string(), z.null()]).optional(),
241
247
  country_code: z.string().min(2).max(2),
242
248
  emulator_id: z.string().min(1).max(100),
243
249
  proxy: ProxyTargetRequest.optional(),
@@ -251,6 +257,7 @@ var ScanStatus = z.enum([
251
257
  "crawled",
252
258
  "checking",
253
259
  "checking_async",
260
+ "rechecking",
254
261
  "completed",
255
262
  "partial",
256
263
  "failed",
@@ -276,6 +283,14 @@ var RedirectHopResponse = z.object({
276
283
  redirected_from: z.string(),
277
284
  sub_requests: z.array(SubRequestResponse)
278
285
  }).passthrough();
286
+ var VideoMetaResponse = z.object({
287
+ duration_ms: z.number().int().default(0),
288
+ mediafile_url: z.string().default(""),
289
+ vast_version: z.string().default(""),
290
+ ad_system: z.string().default(""),
291
+ is_vpaid: z.boolean().default(false),
292
+ wrapper_depth: z.number().int().default(0)
293
+ }).partial().passthrough();
279
294
  var ProxyTargetResponse = z.object({
280
295
  proxy_type: z.string(),
281
296
  region: z.string().optional().default(""),
@@ -335,9 +350,12 @@ var ScanResponse = z.object({
335
350
  report_url: z.string().optional().default(""),
336
351
  public_report_url: z.string().optional().default(""),
337
352
  ad_tag: z.union([z.string(), z.null()]).optional(),
353
+ vast_tag: z.union([z.string(), z.null()]).optional(),
354
+ creative_kind: z.string().optional().default("banner"),
338
355
  creative_screenshot_url: z.string().optional().default(""),
339
356
  creative_width: z.number().int().optional().default(0),
340
357
  creative_height: z.number().int().optional().default(0),
358
+ video: z.union([VideoMetaResponse, z.null()]).optional(),
341
359
  proxy: z.union([ProxyTargetResponse, z.null()]).optional(),
342
360
  page_title: z.string(),
343
361
  elapsed_ms: z.number().int(),
@@ -346,6 +364,8 @@ var ScanResponse = z.object({
346
364
  classification: z.union([ScanClassificationResponse, z.null()]).optional(),
347
365
  campaign_id: z.union([z.string(), z.null()]).optional(),
348
366
  campaign_name: z.union([z.string(), z.null()]).optional(),
367
+ campaign_group_id: z.union([z.string(), z.null()]).optional(),
368
+ campaign_group_name: z.union([z.string(), z.null()]).optional(),
349
369
  created_at: z.string().datetime({ offset: true }),
350
370
  completed_at: z.union([z.string(), z.null()]),
351
371
  landings: z.array(LandingResponse).optional()
@@ -367,7 +387,10 @@ var ScanBriefResponse = z.object({
367
387
  created_at: z.string().datetime({ offset: true }),
368
388
  campaign_id: z.union([z.string(), z.null()]).optional(),
369
389
  campaign_name: z.union([z.string(), z.null()]).optional(),
370
- is_ad_tag: z.boolean().optional().default(false)
390
+ is_ad_tag: z.boolean().optional().default(false),
391
+ is_vast: z.boolean().optional().default(false),
392
+ emulator_display_name: z.string().optional().default(""),
393
+ emulator_category: z.string().optional().default("")
371
394
  }).passthrough();
372
395
  z.object({
373
396
  items: z.array(ScanBriefResponse),
@@ -379,6 +402,7 @@ z.object({
379
402
  z.object({
380
403
  url: z.union([z.string(), z.null()]).optional(),
381
404
  ad_tag: z.union([z.string(), z.null()]).optional(),
405
+ vast_tag: z.union([z.string(), z.null()]).optional(),
382
406
  country_codes: z.array(z.string()).min(1),
383
407
  emulator_id: z.string().min(1).max(100),
384
408
  proxy: ProxyTargetRequest.optional(),
@@ -431,6 +455,7 @@ z.object({
431
455
  campaign_type: z.string().optional().default("url"),
432
456
  url: z.union([z.string(), z.null()]).optional(),
433
457
  ad_tag: z.union([z.string(), z.null()]).optional(),
458
+ vast_tag: z.union([z.string(), z.null()]).optional(),
434
459
  country_codes: z.array(z.string()).min(1),
435
460
  group_id: z.union([z.string(), z.null()]).optional(),
436
461
  emulator_categories: z.array(z.string()).optional(),
@@ -459,6 +484,7 @@ var CampaignResponse = z.object({
459
484
  campaign_type: z.string().optional().default("url"),
460
485
  url: z.string(),
461
486
  ad_tag: z.union([z.string(), z.null()]).optional(),
487
+ vast_tag: z.union([z.string(), z.null()]).optional(),
462
488
  country_codes: z.array(z.string()),
463
489
  group_id: z.string().uuid(),
464
490
  emulator_selection: EmulatorSelectionResponse,
@@ -488,12 +514,14 @@ var CampaignPickerItem = z.object({
488
514
  id: z.string().uuid(),
489
515
  name: z.string(),
490
516
  group_id: z.string().uuid(),
491
- is_archived: z.boolean()
517
+ is_archived: z.boolean(),
518
+ policy_set_id: z.union([z.string(), z.null()]).optional()
492
519
  }).passthrough();
493
520
  z.object({
494
521
  name: z.union([z.string(), z.null()]),
495
522
  url: z.union([z.string(), z.null()]),
496
523
  ad_tag: z.union([z.string(), z.null()]),
524
+ vast_tag: z.union([z.string(), z.null()]),
497
525
  country_codes: z.union([z.array(z.string()), z.null()]),
498
526
  group_id: z.union([z.string(), z.null()]),
499
527
  emulator_categories: z.union([z.array(z.string()), z.null()]),
@@ -555,6 +583,7 @@ var ScanTagResponse = z.object({
555
583
  tag_slug: z.string(),
556
584
  detail: z.string(),
557
585
  url: z.string().optional().default(""),
586
+ surface: z.string().optional().default("page"),
558
587
  display_name: z.string().optional().default(""),
559
588
  category: z.string().optional().default(""),
560
589
  severity: z.string().optional().default(""),
@@ -566,12 +595,13 @@ var TagDefinitionWithStatsResponse = z.object({
566
595
  source: z.string(),
567
596
  display_name: z.string(),
568
597
  description: z.string(),
569
- is_system: z.boolean(),
598
+ scope: z.string(),
570
599
  organization_id: z.union([z.string(), z.null()]),
571
600
  visibility: z.string(),
572
601
  severity: z.string(),
573
602
  scans_count: z.number().int(),
574
- rules_count: z.number().int()
603
+ rules_count: z.number().int(),
604
+ archived_at: z.union([z.string(), z.null()]).optional()
575
605
  }).passthrough();
576
606
  var LinkedRuleResponse = z.object({
577
607
  id: z.string().uuid(),
@@ -586,12 +616,13 @@ var TagDefinitionDetailResponse = z.object({
586
616
  source: z.string(),
587
617
  display_name: z.string(),
588
618
  description: z.string(),
589
- is_system: z.boolean(),
619
+ scope: z.string(),
590
620
  organization_id: z.union([z.string(), z.null()]),
591
621
  visibility: z.string(),
592
622
  severity: z.string(),
593
623
  scans_count: z.number().int(),
594
624
  rules_count: z.number().int(),
625
+ archived_at: z.union([z.string(), z.null()]).optional(),
595
626
  linked_rules: z.array(LinkedRuleResponse).optional()
596
627
  }).passthrough();
597
628
  var TagVisibility = z.enum(["hidden", "internal", "public"]);
@@ -611,14 +642,15 @@ z.object({
611
642
  }).passthrough();
612
643
  var CustomRuleResponse = z.object({
613
644
  id: z.string().uuid(),
614
- organization_id: z.string().uuid(),
645
+ organization_id: z.union([z.string(), z.null()]),
615
646
  name: z.string(),
616
647
  tag_slug: z.string(),
617
648
  rule_type: z.string(),
618
649
  config: z.object({}).partial().passthrough(),
619
650
  target: z.string(),
620
651
  is_active: z.boolean(),
621
- created_at: z.string().datetime({ offset: true })
652
+ created_at: z.string().datetime({ offset: true }),
653
+ scope: z.string().optional().default("personal")
622
654
  }).passthrough();
623
655
  z.object({
624
656
  items: z.array(CustomRuleResponse),
@@ -638,7 +670,10 @@ z.object({
638
670
  scan_id: z.string().uuid(),
639
671
  rule_type: z.string(),
640
672
  config: z.object({}).partial().passthrough(),
641
- target: z.string().optional().default("page")
673
+ target: z.string().optional().default("page"),
674
+ name: z.string().optional().default("Test Rule"),
675
+ context: z.enum(["isolated", "production"]).optional().default("isolated"),
676
+ rule_id: z.union([z.string(), z.null()]).optional()
642
677
  }).passthrough();
643
678
  var RuleTestTagResult = z.object({ tag_slug: z.string(), detail: z.string().optional().default("") }).passthrough();
644
679
  var RuleTestResponse = z.object({
@@ -681,7 +716,8 @@ var PolicyEntryRequest = z.object({
681
716
  z.object({
682
717
  name: z.string().min(1).max(200),
683
718
  description: z.string().max(2e3).optional().default(""),
684
- entries: z.array(PolicyEntryRequest).min(1).max(500)
719
+ entries: z.array(PolicyEntryRequest).min(1).max(500),
720
+ campaign_ids: z.array(z.string().uuid()).max(2e3).optional()
685
721
  }).passthrough();
686
722
  var PolicyEntryIabV3Response = z.object({
687
723
  tier1: z.string(),
@@ -712,6 +748,7 @@ var PolicyEntryResponse = z.object({
712
748
  custom_taxonomy: z.union([PolicyEntryCustomTaxonomyResponse, z.null()]).optional(),
713
749
  country_codes: z.array(z.string())
714
750
  }).passthrough();
751
+ var LinkedCampaignResponse = z.object({ id: z.string().uuid(), name: z.string(), is_archived: z.boolean() }).passthrough();
715
752
  var PolicySetResponse = z.object({
716
753
  id: z.string().uuid(),
717
754
  name: z.string(),
@@ -720,6 +757,8 @@ var PolicySetResponse = z.object({
720
757
  visibility: z.string(),
721
758
  is_approved: z.boolean(),
722
759
  entries: z.array(PolicyEntryResponse),
760
+ campaigns: z.array(LinkedCampaignResponse).optional(),
761
+ campaigns_total: z.number().int().optional().default(0),
723
762
  created_at: z.string().datetime({ offset: true })
724
763
  }).passthrough();
725
764
  var VisibilityType = z.enum(["private", "public"]);
@@ -743,9 +782,22 @@ z.object({
743
782
  z.object({
744
783
  name: z.string().min(1).max(200),
745
784
  description: z.string().max(2e3).optional().default(""),
746
- entries: z.array(PolicyEntryRequest).min(1).max(500)
785
+ entries: z.array(PolicyEntryRequest).min(1).max(500),
786
+ campaign_ids: z.array(z.string().uuid()).max(2e3).optional()
747
787
  }).passthrough();
748
- var AlertStatus = z.enum(["open", "acknowledged", "resolved", "dismissed"]);
788
+ z.object({
789
+ items: z.array(LinkedCampaignResponse),
790
+ total: z.number().int(),
791
+ page: z.number().int(),
792
+ limit: z.number().int(),
793
+ pages: z.number().int()
794
+ }).passthrough();
795
+ z.object({ campaign_ids: z.array(z.string().uuid()).min(1).max(500) }).passthrough();
796
+ z.object({
797
+ campaign_ids: z.array(z.string().uuid()).max(500),
798
+ detach_all: z.boolean().default(false)
799
+ }).partial().passthrough();
800
+ var AlertStatus = z.enum(["open", "escalated", "resolved", "dismissed"]);
749
801
  z.union([AlertStatus, z.null()]).optional();
750
802
  var AlertResponse = z.object({
751
803
  id: z.string().uuid(),
@@ -756,7 +808,7 @@ var AlertResponse = z.object({
756
808
  organization_id: z.string().uuid(),
757
809
  tag_slug: z.string(),
758
810
  country_code: z.string(),
759
- status: z.string(),
811
+ status: AlertStatus,
760
812
  closed_by: z.union([z.string(), z.null()]),
761
813
  created_at: z.string().datetime({ offset: true }),
762
814
  updated_at: z.union([z.string(), z.null()]),
@@ -774,9 +826,17 @@ z.object({
774
826
  pages: z.number().int()
775
827
  }).passthrough();
776
828
  z.object({ status: AlertStatus }).passthrough();
829
+ z.object({
830
+ status: AlertStatus,
831
+ ids: z.union([z.array(z.string().uuid()), z.null()]).optional(),
832
+ all_matching: z.boolean().optional().default(false),
833
+ filter_status: z.union([AlertStatus, z.null()]).optional(),
834
+ filter_campaign_id: z.union([z.string(), z.null()]).optional()
835
+ }).passthrough();
836
+ z.object({ updated: z.number().int(), skipped: z.number().int() }).passthrough();
777
837
  var AlertStatsResponse = z.object({
778
838
  open: z.number().int(),
779
- acknowledged: z.number().int(),
839
+ escalated: z.number().int(),
780
840
  resolved: z.number().int(),
781
841
  dismissed: z.number().int()
782
842
  }).passthrough();
@@ -846,6 +906,7 @@ var BalanceTransactionResponse = z.object({
846
906
  description: z.string(),
847
907
  reference_kind: z.union([z.string(), z.null()]),
848
908
  reference_id: z.union([z.string(), z.null()]),
909
+ document_number: z.union([z.string(), z.null()]).optional(),
849
910
  actor_user_id: z.union([z.string(), z.null()]),
850
911
  created_at: z.string().datetime({ offset: true })
851
912
  }).passthrough();
@@ -950,6 +1011,7 @@ var AlertNotificationDestinationResponse = z.object({
950
1011
  telegram_chat_type: z.union([z.string(), z.null()]),
951
1012
  email_address: z.union([z.string(), z.null()]),
952
1013
  included_label_keys: z.array(z.string()),
1014
+ included_statuses: z.array(z.string()),
953
1015
  created_at: z.string().datetime({ offset: true }),
954
1016
  updated_at: z.string().datetime({ offset: true })
955
1017
  }).passthrough();
@@ -974,6 +1036,10 @@ var InvoiceResponse = z.object({
974
1036
  type: z.string(),
975
1037
  status: z.string(),
976
1038
  total_micros: z.number().int(),
1039
+ net_micros: z.number().int(),
1040
+ vat_micros: z.number().int(),
1041
+ vat_rate: z.string(),
1042
+ vat_reason: z.string(),
977
1043
  currency: z.string(),
978
1044
  period_start: z.union([z.string(), z.null()]),
979
1045
  period_end: z.union([z.string(), z.null()]),
@@ -992,7 +1058,6 @@ z.object({
992
1058
  limit: z.number().int(),
993
1059
  pages: z.number().int()
994
1060
  }).passthrough();
995
- z.object({ url: z.union([z.string(), z.null()]), ready: z.boolean() }).passthrough();
996
1061
  z.object({
997
1062
  name: z.string().min(2).max(100),
998
1063
  email: z.string().email(),
@@ -1224,6 +1289,7 @@ var CampaignSchema = schemas.CampaignResponse.pick({
1224
1289
  campaign_type: true,
1225
1290
  url: true,
1226
1291
  ad_tag: true,
1292
+ vast_tag: true,
1227
1293
  country_codes: true,
1228
1294
  group_id: true,
1229
1295
  emulator_selection: true,
@@ -1460,7 +1526,7 @@ var RuleTestSchema = schemas.RuleTestResponse.pick({
1460
1526
  var parseRuleTest = (raw) => parseWithSchema(RuleTestSchema, raw, "rule-test");
1461
1527
  var AlertStatsSchema = schemas.AlertStatsResponse.pick({
1462
1528
  open: true,
1463
- acknowledged: true,
1529
+ escalated: true,
1464
1530
  resolved: true,
1465
1531
  dismissed: true
1466
1532
  }).strip();
@@ -1653,6 +1719,9 @@ var ScanSchema = schemas.ScanResponse.pick({
1653
1719
  report_url: true,
1654
1720
  public_report_url: true,
1655
1721
  ad_tag: true,
1722
+ vast_tag: true,
1723
+ creative_kind: true,
1724
+ video: true,
1656
1725
  creative_screenshot_url: true,
1657
1726
  page_title: true,
1658
1727
  elapsed_ms: true,
@@ -1682,6 +1751,7 @@ var ScanBriefSchema = schemas.ScanBriefResponse.pick({
1682
1751
  campaign_id: true,
1683
1752
  campaign_name: true,
1684
1753
  is_ad_tag: true,
1754
+ is_vast: true,
1685
1755
  created_at: true
1686
1756
  }).strip();
1687
1757
  var parseScanPage = (raw) => parsePagedWithItemSchema(ScanBriefSchema, raw, "scans");
@@ -1692,7 +1762,7 @@ var TagDefinitionSchema = schemas.TagDefinitionWithStatsResponse.pick({
1692
1762
  display_name: true,
1693
1763
  description: true,
1694
1764
  severity: true,
1695
- is_system: true,
1765
+ scope: true,
1696
1766
  organization_id: true,
1697
1767
  visibility: true,
1698
1768
  scans_count: true,
@@ -1711,7 +1781,7 @@ var TagDetailSchema = schemas.TagDefinitionDetailResponse.pick({
1711
1781
  display_name: true,
1712
1782
  description: true,
1713
1783
  severity: true,
1714
- is_system: true,
1784
+ scope: true,
1715
1785
  organization_id: true,
1716
1786
  visibility: true,
1717
1787
  scans_count: true,
@@ -3032,7 +3102,7 @@ var setCampaignAlertOverridesTool = {
3032
3102
  var GetAlertStatsInputShape = {};
3033
3103
  var getAlertStatsTool = {
3034
3104
  name: "get_alert_stats",
3035
- description: "Get alert counts grouped by status: open, acknowledged, resolved, dismissed (total is implicit in the sum). Status names match the canonical AlertStatus enum used by `list_alerts` and `update_alert_status`.",
3105
+ description: "Get alert counts grouped by status: open, escalated, resolved, dismissed (total is implicit in the sum). Status names match the canonical AlertStatus enum used by `list_alerts` and `update_alert_status`.",
3036
3106
  annotations: {
3037
3107
  title: "Get Alert Stats",
3038
3108
  readOnlyHint: true,
@@ -3049,8 +3119,8 @@ var getAlertStatsTool = {
3049
3119
  };
3050
3120
  var ListAlertsInputShape = {
3051
3121
  campaign_id: z.string().uuid().optional().describe("Filter to one campaign's alerts."),
3052
- status: z.enum(["open", "acknowledged", "resolved", "dismissed"]).optional().describe(
3053
- "Filter by alert status. Open = unhandled; acknowledged = seen by an operator; resolved = closed; dismissed = closed without action."
3122
+ status: z.enum(["open", "escalated", "resolved", "dismissed"]).optional().describe(
3123
+ "Filter by alert status. Open = unhandled; escalated = flagged for attention; resolved = closed; dismissed = closed without action."
3054
3124
  ),
3055
3125
  page: z.number().int().min(1).max(500).default(1).describe("1-indexed page number."),
3056
3126
  limit: z.number().int().min(1).max(200).default(50).describe("Page size.")
@@ -3080,11 +3150,11 @@ var listAlertsTool = {
3080
3150
  };
3081
3151
  var UpdateAlertStatusInputShape = {
3082
3152
  alert_id: z.string().uuid().describe("Alert UUID."),
3083
- status: z.enum(["open", "acknowledged", "resolved", "dismissed"]).describe("New status: open | acknowledged | resolved | dismissed.")
3153
+ status: z.enum(["open", "escalated", "resolved", "dismissed"]).describe("New status: open | escalated | resolved | dismissed.")
3084
3154
  };
3085
3155
  var updateAlertStatusTool = {
3086
3156
  name: "update_alert_status",
3087
- description: "Update an alert's status in its lifecycle: open \u2192 acknowledged \u2192 resolved | dismissed. The API enforces valid transitions; an invalid one returns 422.",
3157
+ description: "Update an alert's status in its lifecycle: open \u2192 escalated \u2192 resolved | dismissed. The API enforces valid transitions; an invalid one returns 422.",
3088
3158
  annotations: {
3089
3159
  title: "Update Alert Status",
3090
3160
  readOnlyHint: false,
@@ -3505,9 +3575,14 @@ function pickCampaignConfigBody(input) {
3505
3575
  // src/application/tools/campaigns/create-campaign.tool.ts
3506
3576
  var CreateCampaignInputShape = {
3507
3577
  name: z.string().min(1).max(200).describe("Display name (1-200 chars)."),
3508
- campaign_type: z.enum(["url", "ad_tag"]).describe("`url` or `ad_tag` \u2014 must match the target field below."),
3578
+ campaign_type: z.enum(["url", "ad_tag", "vast"]).describe("`url`, `ad_tag`, or `vast` \u2014 must match the target field below."),
3509
3579
  url: z.string().url().optional().describe("Target URL (required if campaign_type=url)."),
3510
- ad_tag: z.string().optional().describe("Ad-tag HTML/JS (required if campaign_type=ad_tag)."),
3580
+ ad_tag: z.string().optional().describe(
3581
+ "Ad-tag HTML/JS or an http(s) URL of a page with the rendered creative (required if campaign_type=ad_tag)."
3582
+ ),
3583
+ vast_tag: z.string().optional().describe(
3584
+ "VAST video ad tag: an http(s) URL of a VAST endpoint OR raw VAST XML (required if campaign_type=vast)."
3585
+ ),
3511
3586
  country_codes: z.array(z.string().length(2)).min(1).describe("ISO 3166-1 alpha-2 codes \u2014 one scan per country per run."),
3512
3587
  group_id: z.string().uuid().optional().describe("Parent group UUID; defaults to the org's default group."),
3513
3588
  ...campaignConfigFields,
@@ -3533,6 +3608,7 @@ var createCampaignTool = {
3533
3608
  country_codes: input.country_codes,
3534
3609
  ...input.url !== void 0 ? { url: input.url } : {},
3535
3610
  ...input.ad_tag !== void 0 ? { ad_tag: input.ad_tag } : {},
3611
+ ...input.vast_tag !== void 0 ? { vast_tag: input.vast_tag } : {},
3536
3612
  ...input.group_id !== void 0 ? { group_id: input.group_id } : {},
3537
3613
  ...input.labels !== void 0 ? { labels: input.labels } : {},
3538
3614
  ...input.policy_set_id !== void 0 ? { policy_set_id: input.policy_set_id } : {},
@@ -3549,7 +3625,7 @@ var GetCampaignInputShape = {
3549
3625
  };
3550
3626
  var getCampaignTool = {
3551
3627
  name: "get_campaign",
3552
- description: "Get one campaign by UUID: name, type, target URL/ad-tag, countries, schedule status, archive status, parent group.",
3628
+ description: "Get one campaign by UUID: name, type (url|ad_tag|vast), target URL / ad-tag / VAST tag (vast_tag), countries, schedule status, archive status, parent group.",
3553
3629
  annotations: {
3554
3630
  title: "Get Campaign",
3555
3631
  readOnlyHint: true,
@@ -3697,7 +3773,12 @@ var UpdateCampaignInputShape = {
3697
3773
  campaign_id: z.string().uuid().describe("Campaign UUID to update."),
3698
3774
  name: z.string().min(1).max(200).optional().describe("New display name."),
3699
3775
  url: z.string().url().optional().describe("New target URL (url-type campaigns)."),
3700
- ad_tag: z.string().optional().describe("New ad-tag HTML/JS (ad_tag-type campaigns)."),
3776
+ ad_tag: z.string().optional().describe(
3777
+ "New ad-tag HTML/JS or an http(s) URL of a page with the rendered creative (ad_tag-type campaigns)."
3778
+ ),
3779
+ vast_tag: z.string().optional().describe(
3780
+ "New VAST video ad tag: an http(s) URL of a VAST endpoint OR raw VAST XML (vast-type campaigns)."
3781
+ ),
3701
3782
  country_codes: z.array(z.string().length(2)).optional().describe("Replace the country list."),
3702
3783
  group_id: z.string().uuid().optional().describe("Move the campaign to another group."),
3703
3784
  ...campaignConfigFields,
@@ -3721,6 +3802,7 @@ var updateCampaignTool = {
3721
3802
  ...input.name !== void 0 ? { name: input.name } : {},
3722
3803
  ...input.url !== void 0 ? { url: input.url } : {},
3723
3804
  ...input.ad_tag !== void 0 ? { ad_tag: input.ad_tag } : {},
3805
+ ...input.vast_tag !== void 0 ? { vast_tag: input.vast_tag } : {},
3724
3806
  ...input.country_codes !== void 0 ? { country_codes: input.country_codes } : {},
3725
3807
  ...input.group_id !== void 0 ? { group_id: input.group_id } : {},
3726
3808
  ...input.labels !== void 0 ? { labels: input.labels } : {},
@@ -3738,7 +3820,7 @@ var CreateCustomRuleInputShape = {
3738
3820
  "Display name. For non-LLM rules this also becomes the `display_name` of the auto-registered tag definition (see `tag_slug`)."
3739
3821
  ),
3740
3822
  tag_slug: z.string().max(100).optional().describe(
3741
- "Tag slug to assign on match. Empty = create-only (advanced). The API auto-registers a custom tag definition for this slug with `display_name = name`. **MUST NOT collide with a built-in system tag slug** (see `list_tags` where `is_system=true`); colliding requests return 422 with code `checking.system_slug_reserved`. For `rule_type='llm'` use `config.tags` keys instead and leave `tag_slug` empty."
3823
+ "Tag slug to assign on match. Empty = create-only (advanced). The API auto-registers a custom tag definition for this slug with `display_name = name`. **MUST NOT collide with a built-in system tag slug** (see `list_tags` where `scope=system`); colliding requests return 422 with code `checking.system_slug_reserved`. For `rule_type='llm'` use `config.tags` keys instead and leave `tag_slug` empty."
3742
3824
  ),
3743
3825
  rule_type: z.string().max(50).describe(
3744
3826
  "Rule engine. One of: `stopword_content`, `stopword_url`, `regexp_content`, `regexp_url`, `blacklist_domain`, `combo`, `llm`. The API validates."
@@ -3838,7 +3920,7 @@ var TestCustomRuleInputShape = {
3838
3920
  "Rule engine type. One of: `stopword_content`, `stopword_url`, `regexp_content`, `regexp_url`, `blacklist_domain`, `combo`, `llm`."
3839
3921
  ),
3840
3922
  config: z.record(z.unknown()).describe(
3841
- "Rule-type-specific config to test. Same shape as `create_custom_rule`'s `config`. NOTE: `test_custom_rule` evaluates the rule against a scan WITHOUT persisting it, so slug-collision validation does NOT run here \u2014 verify slugs against `list_tags` (`is_system=true`) before promoting to `create_custom_rule`."
3923
+ "Rule-type-specific config to test. Same shape as `create_custom_rule`'s `config`. NOTE: `test_custom_rule` evaluates the rule against a scan WITHOUT persisting it, so slug-collision validation does NOT run here \u2014 verify slugs against `list_tags` (`scope=system`) before promoting to `create_custom_rule`."
3842
3924
  ),
3843
3925
  target: z.string().max(30).describe(
3844
3926
  "Where to apply the rule (e.g. 'page' for landing HTML). See API docs for the full set of valid values."
@@ -3847,7 +3929,7 @@ var TestCustomRuleInputShape = {
3847
3929
  };
3848
3930
  var testCustomRuleTool = {
3849
3931
  name: "test_custom_rule",
3850
- description: "Preview-test a rule definition against an existing scan WITHOUT persisting the rule. Returns `matched: bool`, evaluation time, and per-tag-slug details. Use to validate config before `create_custom_rule`. NOTE: slug-collision validation does NOT run in preview mode \u2014 verify any `tag_slug` (or LLM `config.tags` keys) against `list_tags` (`is_system=true`) before promoting to `create_custom_rule`, which would otherwise reject the same payload with HTTP 422 / code `checking.system_slug_reserved`.",
3932
+ description: "Preview-test a rule definition against an existing scan WITHOUT persisting the rule. Returns `matched: bool`, evaluation time, and per-tag-slug details. Use to validate config before `create_custom_rule`. NOTE: slug-collision validation does NOT run in preview mode \u2014 verify any `tag_slug` (or LLM `config.tags` keys) against `list_tags` (`scope=system`) before promoting to `create_custom_rule`, which would otherwise reject the same payload with HTTP 422 / code `checking.system_slug_reserved`.",
3851
3933
  annotations: {
3852
3934
  title: "Test Custom Rule",
3853
3935
  readOnlyHint: true,
@@ -3873,7 +3955,7 @@ var UpdateCustomRuleInputShape = {
3873
3955
  "New display name. For non-LLM rules this also becomes the new `display_name` of the auto-registered tag definition."
3874
3956
  ),
3875
3957
  tag_slug: z.string().max(100).optional().describe(
3876
- "New tag slug to assign on match. **MUST NOT collide with a built-in system tag slug** (see `list_tags` where `is_system=true`); colliding requests return 422 with code `checking.system_slug_reserved`. Re-registering an existing custom slug refreshes its tag definition's `display_name` / `description`."
3958
+ "New tag slug to assign on match. **MUST NOT collide with a built-in system tag slug** (see `list_tags` where `scope=system`); colliding requests return 422 with code `checking.system_slug_reserved`. Re-registering an existing custom slug refreshes its tag definition's `display_name` / `description`."
3877
3959
  ),
3878
3960
  config: z.record(z.unknown()).optional().describe(
3879
3961
  "New rule-type-specific config object. For `rule_type='llm'` the keys of `config.tags` are auto-registered as tag definitions; any key that collides with a system slug returns the same 422 contract."
@@ -4551,8 +4633,13 @@ var scanProxyField = z.object({
4551
4633
 
4552
4634
  // src/application/tools/scans/create-bulk-scans.tool.ts
4553
4635
  var CreateBulkScansInputShape = {
4554
- url: z.string().url().optional().describe("Direct URL. EITHER `url` OR `ad_tag` is required."),
4555
- ad_tag: z.string().optional().describe("Raw ad-tag HTML/JS. EITHER `url` OR `ad_tag` is required."),
4636
+ url: z.string().url().optional().describe("Direct URL. Provide exactly one of `url`, `ad_tag`, or `vast_tag`."),
4637
+ ad_tag: z.string().optional().describe(
4638
+ "Raw ad-tag HTML/JS OR an http(s) URL of a page with the creative already rendered. Provide exactly one of `url`, `ad_tag`, or `vast_tag`."
4639
+ ),
4640
+ vast_tag: z.string().optional().describe(
4641
+ "VAST video ad tag: an http(s) URL of a VAST endpoint OR raw VAST XML. Provide exactly one of `url`, `ad_tag`, or `vast_tag`."
4642
+ ),
4556
4643
  country_codes: z.array(z.string().length(2)).min(1).max(50).describe("List of ISO 3166-1 alpha-2 country codes; one scan per country is created."),
4557
4644
  emulator_id: z.string().min(1).max(100).describe("Device/OS profile slug; same for every country in the batch."),
4558
4645
  proxy: scanProxyField,
@@ -4560,7 +4647,7 @@ var CreateBulkScansInputShape = {
4560
4647
  };
4561
4648
  var createBulkScansTool = {
4562
4649
  name: "create_bulk_scans",
4563
- description: "Queue one new scan per country in a single call (e.g. test the same URL from US + DE + JP). COSTS N CREDITS where N = number of countries. Returns the list of created scans.",
4650
+ description: "Queue one new scan per country in a single call (e.g. test the same URL, ad-tag, or VAST video tag from US + DE + JP). COSTS N CREDITS where N = number of countries. Returns the list of created scans.",
4564
4651
  annotations: {
4565
4652
  title: "Create Bulk Scans",
4566
4653
  readOnlyHint: false,
@@ -4575,6 +4662,7 @@ var createBulkScansTool = {
4575
4662
  emulator_id: input.emulator_id,
4576
4663
  ...input.url !== void 0 ? { url: input.url } : {},
4577
4664
  ...input.ad_tag !== void 0 ? { ad_tag: input.ad_tag } : {},
4665
+ ...input.vast_tag !== void 0 ? { vast_tag: input.vast_tag } : {},
4578
4666
  ...input.proxy !== void 0 ? { proxy: input.proxy } : {},
4579
4667
  ...input.labels !== void 0 ? { labels: input.labels } : {}
4580
4668
  };
@@ -4584,8 +4672,15 @@ var createBulkScansTool = {
4584
4672
  }
4585
4673
  };
4586
4674
  var CreateScanInputShape = {
4587
- url: z.string().url().optional().describe("Direct URL of the ad / landing page. EITHER `url` OR `ad_tag` is required."),
4588
- ad_tag: z.string().optional().describe("Raw HTML/JS ad tag (script, iframe, image). EITHER `url` OR `ad_tag` is required."),
4675
+ url: z.string().url().optional().describe(
4676
+ "Direct URL of the ad / landing page. Provide exactly one of `url`, `ad_tag`, or `vast_tag`."
4677
+ ),
4678
+ ad_tag: z.string().optional().describe(
4679
+ "Raw HTML/JS ad tag (script, iframe, image) OR an http(s) URL of a page with the creative already rendered. Provide exactly one of `url`, `ad_tag`, or `vast_tag`."
4680
+ ),
4681
+ vast_tag: z.string().optional().describe(
4682
+ "VAST video ad tag: an http(s) URL of a VAST endpoint OR raw VAST XML (a document containing a <VAST> element). Fetched and played in a real browser. Provide exactly one of `url`, `ad_tag`, or `vast_tag`."
4683
+ ),
4589
4684
  country_code: z.string().length(2).describe("ISO 3166-1 alpha-2 country code, e.g. US, DE, JP. Determines proxy geo."),
4590
4685
  emulator_id: z.string().min(1).max(100).describe("Device/OS profile slug; use `list_emulators` to discover valid values."),
4591
4686
  proxy: scanProxyField,
@@ -4595,7 +4690,7 @@ var CreateScanInputShape = {
4595
4690
  };
4596
4691
  var createScanTool = {
4597
4692
  name: "create_scan",
4598
- description: "Queue a single new scan for a URL or ad-tag against one country. COSTS CREDITS and bills the caller's organization. Returns the newly-created scan record.",
4693
+ description: "Queue a single new scan for a URL, ad-tag, or VAST video tag against one country. COSTS CREDITS and bills the caller's organization. Returns the newly-created scan record.",
4599
4694
  annotations: {
4600
4695
  title: "Create Scan",
4601
4696
  readOnlyHint: false,
@@ -4610,6 +4705,7 @@ var createScanTool = {
4610
4705
  emulator_id: input.emulator_id,
4611
4706
  ...input.url !== void 0 ? { url: input.url } : {},
4612
4707
  ...input.ad_tag !== void 0 ? { ad_tag: input.ad_tag } : {},
4708
+ ...input.vast_tag !== void 0 ? { vast_tag: input.vast_tag } : {},
4613
4709
  ...input.proxy !== void 0 ? { proxy: input.proxy } : {},
4614
4710
  ...input.labels !== void 0 ? { labels: input.labels } : {},
4615
4711
  ...input.campaign_id !== void 0 ? { campaign_id: input.campaign_id } : {},
@@ -4625,7 +4721,7 @@ var GetScanInputShape = {
4625
4721
  };
4626
4722
  var getScanTool = {
4627
4723
  name: "get_scan",
4628
- description: "Get full detail for one scan by UUID: status, offer URL, absolute screenshot URL, report_url + public_report_url deep-links, timing, labels, and the parent campaign if any. Link users with the returned `report_url` / `public_report_url` \u2014 never construct URLs yourself.",
4724
+ description: "Get full detail for one scan by UUID: status, offer URL, absolute screenshot URL, report_url + public_report_url deep-links, timing, labels, and the parent campaign if any. VAST video scans also carry `vast_tag`, `creative_kind` (banner|video), and a `video` block (duration, media-file URL, VAST version, ad system, VPAID flag, wrapper depth). Link users with the returned `report_url` / `public_report_url` \u2014 never construct URLs yourself.",
4629
4725
  annotations: {
4630
4726
  title: "Get Scan",
4631
4727
  readOnlyHint: true,
@@ -4743,7 +4839,7 @@ var ListScansInputShape = {
4743
4839
  };
4744
4840
  var listScansTool = {
4745
4841
  name: "list_scans",
4746
- description: "List scans for the caller's organization with optional filters (status, country, URL substring, date range, run/campaign/group, tag, AI/IAB/brand category, dynamic labels). Returns a paginated envelope; each scan carries an absolute screenshot URL plus report_url (auth dashboard) and public_report_url (shareable) deep-links \u2014 link users with those, never hand-build URLs.",
4842
+ description: "List scans for the caller's organization with optional filters (status, country, URL substring, date range, run/campaign/group, tag, AI/IAB/brand category, dynamic labels). Returns a paginated envelope; each brief carries `is_ad_tag` and `is_vast` flags, an absolute screenshot URL plus report_url (auth dashboard) and public_report_url (shareable) deep-links \u2014 link users with those, never hand-build URLs.",
4747
4843
  annotations: {
4748
4844
  title: "List Scans",
4749
4845
  readOnlyHint: true,
@@ -5376,5 +5472,5 @@ function formatToolError(error) {
5376
5472
  }
5377
5473
 
5378
5474
  export { BearerToken, SERVER_INSTRUCTIONS, createHttpApiGateway, createPinoLogger, declareEmptyResourcesAndPrompts, newRequestId, wireToolsIntoMcpServer };
5379
- //# sourceMappingURL=chunk-AINV7DXM.js.map
5380
- //# sourceMappingURL=chunk-AINV7DXM.js.map
5475
+ //# sourceMappingURL=chunk-ZZIYFLWG.js.map
5476
+ //# sourceMappingURL=chunk-ZZIYFLWG.js.map