@kaminari-ad/mcp 0.25.0 → 0.26.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,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.26.0] - 2026-10-06
11
+
12
+ > Requires the API-side bulk parity deploy. Until it lands, the API
13
+ > silently ignores the new `create_bulk_scans` fields. Do not tag this
14
+ > release ahead of the API.
15
+
16
+ ### Added
17
+
18
+ - **`create_bulk_scans` takes the same optional fields as `create_scan`.**
19
+ `campaign_id`, `run_id`, `ad_discovery`, `max_discovered_ads` and
20
+ `ad_formats` apply to every country in the batch. With a `campaign_id`,
21
+ bulk scans can raise alerts.
22
+
23
+ ### Changed
24
+
25
+ - **`campaign_id` explains that alerts depend on it**, on both scan tools.
26
+ The three shared fields now live in one module, so the two tools'
27
+ descriptions cannot drift. Request schemas are regenerated from the API,
28
+ and country codes are documented as case-insensitive.
29
+
10
30
  ## [0.25.0] - 2026-10-04
11
31
 
12
32
  > Requires the API-side batch rule test deploy. Until it lands, the tool
package/dist/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { NAME, VERSION, err, ok } from './chunk-IG36AHO3.js';
2
+ import { NAME, VERSION, err, ok } from './chunk-DZ5IF6SC.js';
3
3
  import process from 'process';
4
4
  import { z } from 'zod';
5
5
 
@@ -162,10 +162,10 @@ async function main() {
162
162
  }
163
163
  const config = configResult.value;
164
164
  if (config.transport === "stdio") {
165
- const { bootstrapStdio } = await import('./stdio-bootstrap-3IOUWYG3.js');
165
+ const { bootstrapStdio } = await import('./stdio-bootstrap-SD25OPK7.js');
166
166
  return bootstrapStdio(config);
167
167
  }
168
- const { bootstrapHttp } = await import('./http-bootstrap-6L4VQJRM.js');
168
+ const { bootstrapHttp } = await import('./http-bootstrap-AR3RJBCT.js');
169
169
  return bootstrapHttp(config);
170
170
  }
171
171
  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.25.0";
6
+ var VERSION = "0.26.0";
7
7
 
8
8
  export { NAME, VERSION };
9
- //# sourceMappingURL=chunk-IG36AHO3.js.map
10
- //# sourceMappingURL=chunk-IG36AHO3.js.map
9
+ //# sourceMappingURL=chunk-DZ5IF6SC.js.map
10
+ //# sourceMappingURL=chunk-DZ5IF6SC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/version.ts"],"names":[],"mappings":";;;;AASO,IAAM,IAAA,GAAO;AACb,IAAM,OAAA,GAAU","file":"chunk-IG36AHO3.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.25.0\";\n"]}
1
+ {"version":3,"sources":["../src/shared/version.ts"],"names":[],"mappings":";;;;AASO,IAAM,IAAA,GAAO;AACb,IAAM,OAAA,GAAU","file":"chunk-DZ5IF6SC.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.26.0\";\n"]}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { err, ok } from './chunk-IG36AHO3.js';
2
+ import { err, ok } from './chunk-DZ5IF6SC.js';
3
3
  import { createHash, randomUUID } from 'crypto';
4
4
  import createClient from 'openapi-fetch';
5
5
  import { fetch } from 'undici';
@@ -262,7 +262,6 @@ z.object({
262
262
  vast_tag: z.union([z.string(), z.null()]).optional(),
263
263
  referrer: z.union([z.string(), z.null()]).optional(),
264
264
  ignore_first_n_domains: z.number().int().gte(0).lte(5).optional().default(0),
265
- country_code: z.string().min(2).max(2),
266
265
  emulator_id: z.string().min(1).max(100),
267
266
  proxy: ProxyTargetRequest.optional(),
268
267
  labels: z.record(z.string()).optional(),
@@ -273,7 +272,8 @@ z.object({
273
272
  ad_formats: z.union([z.array(AdKind), z.null()]).optional(),
274
273
  repeat_count: z.number().int().gte(1).optional().default(1),
275
274
  repeat_mode: RepeatModeType.optional(),
276
- retry_max_attempts: z.number().int().gte(0).optional().default(0)
275
+ retry_max_attempts: z.number().int().gte(0).optional().default(0),
276
+ country_code: z.string().min(2).max(2)
277
277
  }).passthrough();
278
278
  var ScanStatus = z.enum([
279
279
  "pending",
@@ -461,13 +461,18 @@ z.object({
461
461
  vast_tag: z.union([z.string(), z.null()]).optional(),
462
462
  referrer: z.union([z.string(), z.null()]).optional(),
463
463
  ignore_first_n_domains: z.number().int().gte(0).lte(5).optional().default(0),
464
- country_codes: z.array(z.string()).min(1),
465
464
  emulator_id: z.string().min(1).max(100),
466
465
  proxy: ProxyTargetRequest.optional(),
467
466
  labels: z.record(z.string()).optional(),
467
+ campaign_id: z.union([z.string(), z.null()]).optional(),
468
+ run_id: z.union([z.string(), z.null()]).optional(),
469
+ ad_discovery: z.boolean().optional().default(false),
470
+ max_discovered_ads: z.union([z.number(), z.null()]).optional(),
471
+ ad_formats: z.union([z.array(AdKind), z.null()]).optional(),
468
472
  repeat_count: z.number().int().gte(1).optional().default(1),
469
473
  repeat_mode: RepeatModeType.optional(),
470
- retry_max_attempts: z.number().int().gte(0).optional().default(0)
474
+ retry_max_attempts: z.number().int().gte(0).optional().default(0),
475
+ country_codes: z.array(z.string().min(2).max(2)).min(1)
471
476
  }).passthrough();
472
477
  z.object({
473
478
  scope_type: z.enum(["last_n", "hours"]),
@@ -5477,6 +5482,15 @@ var cancelScanTool = {
5477
5482
  return ok(result.value);
5478
5483
  }
5479
5484
  };
5485
+ var scanCampaignIdField = z.string().uuid().optional().describe(
5486
+ "Optional campaign UUID to attribute the scan to. Required for alerts: policies are attached to campaigns, so a scan without a campaign is checked and tagged but never raises an alert."
5487
+ );
5488
+ var scanRunIdField = z.string().uuid().optional().describe(
5489
+ "Optional run UUID inside the campaign. Omit it to join the campaign's API run for the day."
5490
+ );
5491
+ var scanAdDiscoveryField = z.boolean().optional().describe(
5492
+ "Publisher ad discovery: detect ad blocks on the page and spawn one child scan per detected ad (banner/video/pop). Only valid with `url`. Each child is a separate billed scan; list them with `list_scan_children`."
5493
+ );
5480
5494
  var scanProxyField = z.object({
5481
5495
  proxy_type: z.enum(["residential", "mobile"]).optional().describe(
5482
5496
  "Proxy network type. Default: residential. Residential and mobile are separate pools with separate catalogues, so pass the same value to `get_proxy_targeting` that you send here."
@@ -5508,15 +5522,22 @@ var CreateBulkScansInputShape = {
5508
5522
  ),
5509
5523
  referrer: scanReferrerField,
5510
5524
  ignore_first_n_domains: ignoreFirstNDomainsScanField,
5511
- 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."),
5525
+ country_codes: z.array(z.string().length(2)).min(1).max(50).describe(
5526
+ "List of ISO 3166-1 alpha-2 country codes, any case; one scan per country is created."
5527
+ ),
5512
5528
  emulator_id: z.string().min(1).max(100).describe("Device/OS profile slug; same for every country in the batch."),
5513
5529
  proxy: scanProxyField,
5514
5530
  labels: z.record(z.string()).optional().describe("Arbitrary metadata copied onto every created scan."),
5531
+ campaign_id: scanCampaignIdField,
5532
+ run_id: scanRunIdField,
5533
+ ad_discovery: scanAdDiscoveryField,
5534
+ max_discovered_ads: maxDiscoveredAdsField,
5535
+ ad_formats: adFormatsField,
5515
5536
  ...repeatRetryFields
5516
5537
  };
5517
5538
  var createBulkScansTool = {
5518
5539
  name: "create_bulk_scans",
5519
- 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 times `repeat_count`. Returns one entry per country; each entry's `repeat_scan_ids` lists that country's extra repeats.",
5540
+ 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). Every other field applies to each country, `campaign_id` included. COSTS N CREDITS where N = number of countries times `repeat_count`. Returns one entry per country; each entry's `repeat_scan_ids` lists that country's extra repeats.",
5520
5541
  annotations: {
5521
5542
  title: "Create Bulk Scans",
5522
5543
  readOnlyHint: false,
@@ -5536,6 +5557,11 @@ var createBulkScansTool = {
5536
5557
  ...input.ignore_first_n_domains !== void 0 ? { ignore_first_n_domains: input.ignore_first_n_domains } : {},
5537
5558
  ...input.proxy !== void 0 ? { proxy: input.proxy } : {},
5538
5559
  ...input.labels !== void 0 ? { labels: input.labels } : {},
5560
+ ...input.campaign_id !== void 0 ? { campaign_id: input.campaign_id } : {},
5561
+ ...input.run_id !== void 0 ? { run_id: input.run_id } : {},
5562
+ ...input.ad_discovery !== void 0 ? { ad_discovery: input.ad_discovery } : {},
5563
+ ...input.max_discovered_ads !== void 0 ? { max_discovered_ads: input.max_discovered_ads } : {},
5564
+ ...input.ad_formats !== void 0 ? { ad_formats: input.ad_formats } : {},
5539
5565
  ...pickRepeatRetryBody(input)
5540
5566
  };
5541
5567
  const result = await ctx.api.createBulkScans(body);
@@ -5559,11 +5585,9 @@ var CreateScanInputShape = {
5559
5585
  emulator_id: z.string().min(1).max(100).describe("Device/OS profile slug; use `list_emulators` to discover valid values."),
5560
5586
  proxy: scanProxyField,
5561
5587
  labels: z.record(z.string()).optional().describe("Arbitrary string -> string metadata attached to the scan."),
5562
- campaign_id: z.string().uuid().optional().describe("Optional campaign UUID to attribute the scan to."),
5563
- run_id: z.string().uuid().optional().describe("Optional run UUID inside the campaign."),
5564
- ad_discovery: z.boolean().optional().describe(
5565
- "Publisher ad discovery: detect ad blocks on the page and spawn one child scan per detected ad (banner/video/pop). Only valid with `url`. Each child is a separate billed scan; list them with `list_scan_children`."
5566
- ),
5588
+ campaign_id: scanCampaignIdField,
5589
+ run_id: scanRunIdField,
5590
+ ad_discovery: scanAdDiscoveryField,
5567
5591
  max_discovered_ads: maxDiscoveredAdsField,
5568
5592
  ad_formats: adFormatsField,
5569
5593
  ...repeatRetryFields
@@ -6484,5 +6508,5 @@ function formatToolError(error) {
6484
6508
  }
6485
6509
 
6486
6510
  export { BearerToken, SERVER_INSTRUCTIONS, createHttpApiGateway, createPinoLogger, declareEmptyResourcesAndPrompts, newRequestId, wireToolsIntoMcpServer };
6487
- //# sourceMappingURL=chunk-MIDK3IA2.js.map
6488
- //# sourceMappingURL=chunk-MIDK3IA2.js.map
6511
+ //# sourceMappingURL=chunk-G5DUWW6D.js.map
6512
+ //# sourceMappingURL=chunk-G5DUWW6D.js.map