@kaminari-ad/mcp 0.7.2 → 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-VTKVXW4G.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-CE2Y76DX.js');
163
+ const { bootstrapStdio } = await import('./stdio-bootstrap-KIBN4X7J.js');
164
164
  return bootstrapStdio(config);
165
165
  }
166
- const { bootstrapHttp } = await import('./http-bootstrap-7VZLKAM4.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.7.2";
6
+ var VERSION = "0.8.0";
7
7
 
8
8
  export { NAME, VERSION };
9
- //# sourceMappingURL=chunk-VTKVXW4G.js.map
10
- //# sourceMappingURL=chunk-VTKVXW4G.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-VTKVXW4G.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.7.2\";\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-VTKVXW4G.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';
@@ -243,6 +243,7 @@ var ProxyTargetRequest = z.object({
243
243
  z.object({
244
244
  url: z.union([z.string(), z.null()]).optional(),
245
245
  ad_tag: z.union([z.string(), z.null()]).optional(),
246
+ vast_tag: z.union([z.string(), z.null()]).optional(),
246
247
  country_code: z.string().min(2).max(2),
247
248
  emulator_id: z.string().min(1).max(100),
248
249
  proxy: ProxyTargetRequest.optional(),
@@ -282,6 +283,14 @@ var RedirectHopResponse = z.object({
282
283
  redirected_from: z.string(),
283
284
  sub_requests: z.array(SubRequestResponse)
284
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();
285
294
  var ProxyTargetResponse = z.object({
286
295
  proxy_type: z.string(),
287
296
  region: z.string().optional().default(""),
@@ -341,9 +350,12 @@ var ScanResponse = z.object({
341
350
  report_url: z.string().optional().default(""),
342
351
  public_report_url: z.string().optional().default(""),
343
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"),
344
355
  creative_screenshot_url: z.string().optional().default(""),
345
356
  creative_width: z.number().int().optional().default(0),
346
357
  creative_height: z.number().int().optional().default(0),
358
+ video: z.union([VideoMetaResponse, z.null()]).optional(),
347
359
  proxy: z.union([ProxyTargetResponse, z.null()]).optional(),
348
360
  page_title: z.string(),
349
361
  elapsed_ms: z.number().int(),
@@ -376,6 +388,7 @@ var ScanBriefResponse = z.object({
376
388
  campaign_id: z.union([z.string(), z.null()]).optional(),
377
389
  campaign_name: z.union([z.string(), z.null()]).optional(),
378
390
  is_ad_tag: z.boolean().optional().default(false),
391
+ is_vast: z.boolean().optional().default(false),
379
392
  emulator_display_name: z.string().optional().default(""),
380
393
  emulator_category: z.string().optional().default("")
381
394
  }).passthrough();
@@ -389,6 +402,7 @@ z.object({
389
402
  z.object({
390
403
  url: z.union([z.string(), z.null()]).optional(),
391
404
  ad_tag: z.union([z.string(), z.null()]).optional(),
405
+ vast_tag: z.union([z.string(), z.null()]).optional(),
392
406
  country_codes: z.array(z.string()).min(1),
393
407
  emulator_id: z.string().min(1).max(100),
394
408
  proxy: ProxyTargetRequest.optional(),
@@ -441,6 +455,7 @@ z.object({
441
455
  campaign_type: z.string().optional().default("url"),
442
456
  url: z.union([z.string(), z.null()]).optional(),
443
457
  ad_tag: z.union([z.string(), z.null()]).optional(),
458
+ vast_tag: z.union([z.string(), z.null()]).optional(),
444
459
  country_codes: z.array(z.string()).min(1),
445
460
  group_id: z.union([z.string(), z.null()]).optional(),
446
461
  emulator_categories: z.array(z.string()).optional(),
@@ -469,6 +484,7 @@ var CampaignResponse = z.object({
469
484
  campaign_type: z.string().optional().default("url"),
470
485
  url: z.string(),
471
486
  ad_tag: z.union([z.string(), z.null()]).optional(),
487
+ vast_tag: z.union([z.string(), z.null()]).optional(),
472
488
  country_codes: z.array(z.string()),
473
489
  group_id: z.string().uuid(),
474
490
  emulator_selection: EmulatorSelectionResponse,
@@ -505,6 +521,7 @@ z.object({
505
521
  name: z.union([z.string(), z.null()]),
506
522
  url: z.union([z.string(), z.null()]),
507
523
  ad_tag: z.union([z.string(), z.null()]),
524
+ vast_tag: z.union([z.string(), z.null()]),
508
525
  country_codes: z.union([z.array(z.string()), z.null()]),
509
526
  group_id: z.union([z.string(), z.null()]),
510
527
  emulator_categories: z.union([z.array(z.string()), z.null()]),
@@ -1272,6 +1289,7 @@ var CampaignSchema = schemas.CampaignResponse.pick({
1272
1289
  campaign_type: true,
1273
1290
  url: true,
1274
1291
  ad_tag: true,
1292
+ vast_tag: true,
1275
1293
  country_codes: true,
1276
1294
  group_id: true,
1277
1295
  emulator_selection: true,
@@ -1701,6 +1719,9 @@ var ScanSchema = schemas.ScanResponse.pick({
1701
1719
  report_url: true,
1702
1720
  public_report_url: true,
1703
1721
  ad_tag: true,
1722
+ vast_tag: true,
1723
+ creative_kind: true,
1724
+ video: true,
1704
1725
  creative_screenshot_url: true,
1705
1726
  page_title: true,
1706
1727
  elapsed_ms: true,
@@ -1730,6 +1751,7 @@ var ScanBriefSchema = schemas.ScanBriefResponse.pick({
1730
1751
  campaign_id: true,
1731
1752
  campaign_name: true,
1732
1753
  is_ad_tag: true,
1754
+ is_vast: true,
1733
1755
  created_at: true
1734
1756
  }).strip();
1735
1757
  var parseScanPage = (raw) => parsePagedWithItemSchema(ScanBriefSchema, raw, "scans");
@@ -3553,11 +3575,14 @@ function pickCampaignConfigBody(input) {
3553
3575
  // src/application/tools/campaigns/create-campaign.tool.ts
3554
3576
  var CreateCampaignInputShape = {
3555
3577
  name: z.string().min(1).max(200).describe("Display name (1-200 chars)."),
3556
- 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."),
3557
3579
  url: z.string().url().optional().describe("Target URL (required if campaign_type=url)."),
3558
3580
  ad_tag: z.string().optional().describe(
3559
3581
  "Ad-tag HTML/JS or an http(s) URL of a page with the rendered creative (required if campaign_type=ad_tag)."
3560
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
+ ),
3561
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."),
3562
3587
  group_id: z.string().uuid().optional().describe("Parent group UUID; defaults to the org's default group."),
3563
3588
  ...campaignConfigFields,
@@ -3583,6 +3608,7 @@ var createCampaignTool = {
3583
3608
  country_codes: input.country_codes,
3584
3609
  ...input.url !== void 0 ? { url: input.url } : {},
3585
3610
  ...input.ad_tag !== void 0 ? { ad_tag: input.ad_tag } : {},
3611
+ ...input.vast_tag !== void 0 ? { vast_tag: input.vast_tag } : {},
3586
3612
  ...input.group_id !== void 0 ? { group_id: input.group_id } : {},
3587
3613
  ...input.labels !== void 0 ? { labels: input.labels } : {},
3588
3614
  ...input.policy_set_id !== void 0 ? { policy_set_id: input.policy_set_id } : {},
@@ -3599,7 +3625,7 @@ var GetCampaignInputShape = {
3599
3625
  };
3600
3626
  var getCampaignTool = {
3601
3627
  name: "get_campaign",
3602
- 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.",
3603
3629
  annotations: {
3604
3630
  title: "Get Campaign",
3605
3631
  readOnlyHint: true,
@@ -3750,6 +3776,9 @@ var UpdateCampaignInputShape = {
3750
3776
  ad_tag: z.string().optional().describe(
3751
3777
  "New ad-tag HTML/JS or an http(s) URL of a page with the rendered creative (ad_tag-type campaigns)."
3752
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
+ ),
3753
3782
  country_codes: z.array(z.string().length(2)).optional().describe("Replace the country list."),
3754
3783
  group_id: z.string().uuid().optional().describe("Move the campaign to another group."),
3755
3784
  ...campaignConfigFields,
@@ -3773,6 +3802,7 @@ var updateCampaignTool = {
3773
3802
  ...input.name !== void 0 ? { name: input.name } : {},
3774
3803
  ...input.url !== void 0 ? { url: input.url } : {},
3775
3804
  ...input.ad_tag !== void 0 ? { ad_tag: input.ad_tag } : {},
3805
+ ...input.vast_tag !== void 0 ? { vast_tag: input.vast_tag } : {},
3776
3806
  ...input.country_codes !== void 0 ? { country_codes: input.country_codes } : {},
3777
3807
  ...input.group_id !== void 0 ? { group_id: input.group_id } : {},
3778
3808
  ...input.labels !== void 0 ? { labels: input.labels } : {},
@@ -4603,9 +4633,12 @@ var scanProxyField = z.object({
4603
4633
 
4604
4634
  // src/application/tools/scans/create-bulk-scans.tool.ts
4605
4635
  var CreateBulkScansInputShape = {
4606
- url: z.string().url().optional().describe("Direct URL. 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`."),
4607
4637
  ad_tag: z.string().optional().describe(
4608
- "Raw ad-tag HTML/JS OR an http(s) URL of a page with the creative already rendered. EITHER `url` OR `ad_tag` is required."
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`."
4609
4642
  ),
4610
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."),
4611
4644
  emulator_id: z.string().min(1).max(100).describe("Device/OS profile slug; same for every country in the batch."),
@@ -4614,7 +4647,7 @@ var CreateBulkScansInputShape = {
4614
4647
  };
4615
4648
  var createBulkScansTool = {
4616
4649
  name: "create_bulk_scans",
4617
- 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.",
4618
4651
  annotations: {
4619
4652
  title: "Create Bulk Scans",
4620
4653
  readOnlyHint: false,
@@ -4629,6 +4662,7 @@ var createBulkScansTool = {
4629
4662
  emulator_id: input.emulator_id,
4630
4663
  ...input.url !== void 0 ? { url: input.url } : {},
4631
4664
  ...input.ad_tag !== void 0 ? { ad_tag: input.ad_tag } : {},
4665
+ ...input.vast_tag !== void 0 ? { vast_tag: input.vast_tag } : {},
4632
4666
  ...input.proxy !== void 0 ? { proxy: input.proxy } : {},
4633
4667
  ...input.labels !== void 0 ? { labels: input.labels } : {}
4634
4668
  };
@@ -4638,9 +4672,14 @@ var createBulkScansTool = {
4638
4672
  }
4639
4673
  };
4640
4674
  var CreateScanInputShape = {
4641
- url: z.string().url().optional().describe("Direct URL of the ad / landing page. 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
+ ),
4642
4678
  ad_tag: z.string().optional().describe(
4643
- "Raw HTML/JS ad tag (script, iframe, image) OR an http(s) URL of a page with the creative already rendered. EITHER `url` OR `ad_tag` is required."
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`."
4644
4683
  ),
4645
4684
  country_code: z.string().length(2).describe("ISO 3166-1 alpha-2 country code, e.g. US, DE, JP. Determines proxy geo."),
4646
4685
  emulator_id: z.string().min(1).max(100).describe("Device/OS profile slug; use `list_emulators` to discover valid values."),
@@ -4651,7 +4690,7 @@ var CreateScanInputShape = {
4651
4690
  };
4652
4691
  var createScanTool = {
4653
4692
  name: "create_scan",
4654
- 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.",
4655
4694
  annotations: {
4656
4695
  title: "Create Scan",
4657
4696
  readOnlyHint: false,
@@ -4666,6 +4705,7 @@ var createScanTool = {
4666
4705
  emulator_id: input.emulator_id,
4667
4706
  ...input.url !== void 0 ? { url: input.url } : {},
4668
4707
  ...input.ad_tag !== void 0 ? { ad_tag: input.ad_tag } : {},
4708
+ ...input.vast_tag !== void 0 ? { vast_tag: input.vast_tag } : {},
4669
4709
  ...input.proxy !== void 0 ? { proxy: input.proxy } : {},
4670
4710
  ...input.labels !== void 0 ? { labels: input.labels } : {},
4671
4711
  ...input.campaign_id !== void 0 ? { campaign_id: input.campaign_id } : {},
@@ -4681,7 +4721,7 @@ var GetScanInputShape = {
4681
4721
  };
4682
4722
  var getScanTool = {
4683
4723
  name: "get_scan",
4684
- 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.",
4685
4725
  annotations: {
4686
4726
  title: "Get Scan",
4687
4727
  readOnlyHint: true,
@@ -4799,7 +4839,7 @@ var ListScansInputShape = {
4799
4839
  };
4800
4840
  var listScansTool = {
4801
4841
  name: "list_scans",
4802
- 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.",
4803
4843
  annotations: {
4804
4844
  title: "List Scans",
4805
4845
  readOnlyHint: true,
@@ -5432,5 +5472,5 @@ function formatToolError(error) {
5432
5472
  }
5433
5473
 
5434
5474
  export { BearerToken, SERVER_INSTRUCTIONS, createHttpApiGateway, createPinoLogger, declareEmptyResourcesAndPrompts, newRequestId, wireToolsIntoMcpServer };
5435
- //# sourceMappingURL=chunk-NRDA7DQQ.js.map
5436
- //# sourceMappingURL=chunk-NRDA7DQQ.js.map
5475
+ //# sourceMappingURL=chunk-ZZIYFLWG.js.map
5476
+ //# sourceMappingURL=chunk-ZZIYFLWG.js.map