@kaminari-ad/mcp 0.24.2 → 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 +39 -0
- package/README.md +2 -2
- package/dist/bin.js +3 -3
- package/dist/{chunk-4P6CNASK.js → chunk-DZ5IF6SC.js} +3 -3
- package/dist/{chunk-4P6CNASK.js.map → chunk-DZ5IF6SC.js.map} +1 -1
- package/dist/{chunk-GPJ6BQNP.js → chunk-G5DUWW6D.js} +135 -14
- package/dist/chunk-G5DUWW6D.js.map +1 -0
- package/dist/{http-bootstrap-KBFALUIO.js → http-bootstrap-AR3RJBCT.js} +4 -4
- package/dist/{http-bootstrap-KBFALUIO.js.map → http-bootstrap-AR3RJBCT.js.map} +1 -1
- package/dist/{stdio-bootstrap-M4TOIBTL.js → stdio-bootstrap-SD25OPK7.js} +4 -4
- package/dist/{stdio-bootstrap-M4TOIBTL.js.map → stdio-bootstrap-SD25OPK7.js.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-GPJ6BQNP.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,45 @@ 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
|
+
|
|
30
|
+
## [0.25.0] - 2026-10-04
|
|
31
|
+
|
|
32
|
+
> Requires the API-side batch rule test deploy. Until it lands, the tool
|
|
33
|
+
> gets 404 from `POST /api/v1/custom-rules/test-batch`. Do not tag this
|
|
34
|
+
> release ahead of the API.
|
|
35
|
+
|
|
36
|
+
### Added
|
|
37
|
+
|
|
38
|
+
- **`test_custom_rules_batch`.** Preview up to 20 unsaved rule definitions
|
|
39
|
+
against up to 50 stored scans in one call, instead of chaining
|
|
40
|
+
`test_custom_rule`. The reply is one cell per rule and scan plus counts.
|
|
41
|
+
A cell that could not run carries `error` and `error_code` without
|
|
42
|
+
failing the rest. `deadline_exceeded` means the call ran out of time
|
|
43
|
+
before that cell, and the agent re-sends just those cells. A
|
|
44
|
+
rate-limited error means the organization already has a batch running.
|
|
45
|
+
Request and response schemas are regenerated from the API. The scan cap
|
|
46
|
+
comes from the generated schema; the 20-rule cap is restated in the tool
|
|
47
|
+
because each rule carries its own agent-facing field descriptions.
|
|
48
|
+
|
|
10
49
|
## [0.24.2] - 2026-10-03
|
|
11
50
|
|
|
12
51
|
### Added
|
package/README.md
CHANGED
|
@@ -115,7 +115,7 @@ which decides which credential type minted it.
|
|
|
115
115
|
|
|
116
116
|
## Tools
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
109 tools covering the public `/api/v1` surface of Kaminari Ad. Every tool carries MCP behaviour annotations (`title`, `readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`) so MCP clients can warn before destructive actions. The complete list, by domain:
|
|
119
119
|
|
|
120
120
|
- **Account** (14) — `get_account`, `update_org`, `list_org_users`, `invite_user`, `update_user_role`, `remove_user`, `transfer_ownership`, `list_org_roles`, `create_custom_role`, `list_account_labels`, `update_account_labels`, `list_api_keys`, `create_api_key`, `revoke_api_key`
|
|
121
121
|
- **Scans** (13) — `list_scans`, `get_scan`, `list_scan_children`, `create_scan`, `create_bulk_scans`, `recheck_scans`, `cancel_scan`, `get_scan_screenshot`, `get_scan_creative_screenshot`, `get_scan_landing_screenshot`, `get_scan_creative_html`, `get_scan_creative_video`, `get_scan_vast_xml`
|
|
@@ -123,7 +123,7 @@ which decides which credential type minted it.
|
|
|
123
123
|
- **Campaign groups** (10) — list/get/create/update/run/cancel/archive/unarchive + `pause_campaign_group_schedule`, `resume_campaign_group_schedule`
|
|
124
124
|
- **Runs** (3) — `get_run`, `list_run_scans`, `cancel_run` (use `list_campaign_runs` to enumerate runs of a campaign — the API has no standalone `/runs` index)
|
|
125
125
|
- **Tags** (5) — `list_tags`, `get_tag_definition`, `update_tag_definition`, `delete_tag_definition`, `list_scan_tags`
|
|
126
|
-
- **Custom rules** (
|
|
126
|
+
- **Custom rules** (7) — `list_custom_rules`, `get_custom_rule`, `create_custom_rule`, `update_custom_rule`, `delete_custom_rule`, `test_custom_rule`, `test_custom_rules_batch`
|
|
127
127
|
- **Custom taxonomies** (7) — `list_custom_taxonomies`, `get_custom_taxonomy`, `create_custom_taxonomy`, `update_custom_taxonomy`, `delete_custom_taxonomy`, `restore_custom_taxonomy`, `parse_custom_taxonomy_text`
|
|
128
128
|
- **Policy sets** (11) — `list_policy_sets`, `get_policy_set`, `create_policy_set`, `update_policy_set`, `delete_policy_set`, `request_policy_set_approval`, `unpublish_policy_set`, `set_default_policy_set`, `list_policy_set_campaigns`, `attach_policy_set_campaigns`, `detach_policy_set_campaigns`
|
|
129
129
|
- **Alerts** (4) — `list_alerts`, `update_alert_status`, `bulk_update_alert_status`, `get_alert_stats`
|
package/dist/bin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { NAME, VERSION, err, ok } from './chunk-
|
|
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-
|
|
165
|
+
const { bootstrapStdio } = await import('./stdio-bootstrap-SD25OPK7.js');
|
|
166
166
|
return bootstrapStdio(config);
|
|
167
167
|
}
|
|
168
|
-
const { bootstrapHttp } = await import('./http-bootstrap-
|
|
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.
|
|
6
|
+
var VERSION = "0.26.0";
|
|
7
7
|
|
|
8
8
|
export { NAME, VERSION };
|
|
9
|
-
//# sourceMappingURL=chunk-
|
|
10
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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-
|
|
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"]),
|
|
@@ -789,6 +794,37 @@ var RuleTestResponse = z.object({
|
|
|
789
794
|
llm_prompt_url: z.string().optional().default(""),
|
|
790
795
|
llm_response_url: z.string().optional().default("")
|
|
791
796
|
}).passthrough();
|
|
797
|
+
var RuleTestBatchRule = z.object({
|
|
798
|
+
id: z.union([z.string(), z.null()]).optional(),
|
|
799
|
+
rule_type: z.string(),
|
|
800
|
+
config: z.object({}).partial().passthrough(),
|
|
801
|
+
target: z.string().optional().default("page"),
|
|
802
|
+
name: z.string().optional().default("Test Rule")
|
|
803
|
+
}).passthrough();
|
|
804
|
+
var RuleTestBatchRequest = z.object({
|
|
805
|
+
rules: z.array(RuleTestBatchRule).min(1).max(20),
|
|
806
|
+
scan_ids: z.array(z.string().uuid()).min(1).max(50)
|
|
807
|
+
}).passthrough();
|
|
808
|
+
var RuleTestBatchCell = z.object({
|
|
809
|
+
index: z.number().int(),
|
|
810
|
+
rule_id: z.union([z.string(), z.null()]).optional(),
|
|
811
|
+
scan_id: z.string().uuid(),
|
|
812
|
+
matched: z.boolean(),
|
|
813
|
+
tags: z.array(RuleTestTagResult),
|
|
814
|
+
elapsed_ms: z.number().int(),
|
|
815
|
+
error: z.union([z.string(), z.null()]).optional(),
|
|
816
|
+
error_code: z.union([z.string(), z.null()]).optional()
|
|
817
|
+
}).passthrough();
|
|
818
|
+
var RuleTestBatchSummary = z.object({
|
|
819
|
+
total: z.number().int(),
|
|
820
|
+
matched: z.number().int(),
|
|
821
|
+
failed: z.number().int(),
|
|
822
|
+
deadline_exceeded: z.number().int()
|
|
823
|
+
}).passthrough();
|
|
824
|
+
var RuleTestBatchResponse = z.object({
|
|
825
|
+
results: z.array(RuleTestBatchCell),
|
|
826
|
+
summary: RuleTestBatchSummary
|
|
827
|
+
}).passthrough();
|
|
792
828
|
var IabV3PolicyCategoryRequest = z.object({
|
|
793
829
|
tier1: z.string().min(1).max(200),
|
|
794
830
|
tier2: z.union([z.string(), z.null()]).optional(),
|
|
@@ -1265,6 +1301,8 @@ var schemas = {
|
|
|
1265
1301
|
TagDefinitionDetailResponse,
|
|
1266
1302
|
CustomRuleResponse,
|
|
1267
1303
|
RuleTestResponse,
|
|
1304
|
+
RuleTestBatchRequest,
|
|
1305
|
+
RuleTestBatchResponse,
|
|
1268
1306
|
PolicyEntryResponse,
|
|
1269
1307
|
LinkedCampaignResponse,
|
|
1270
1308
|
PolicySetResponse,
|
|
@@ -1628,6 +1666,7 @@ var RuleTestSchema = schemas.RuleTestResponse.pick({
|
|
|
1628
1666
|
tags: true
|
|
1629
1667
|
}).strip();
|
|
1630
1668
|
var parseRuleTest = (raw) => parseWithSchema(RuleTestSchema, raw, "rule-test");
|
|
1669
|
+
var parseRuleTestBatch = (raw) => parseWithSchema(schemas.RuleTestBatchResponse.strip(), raw, "rule-test-batch");
|
|
1631
1670
|
var AlertStatsSchema = schemas.AlertStatsResponse.pick({
|
|
1632
1671
|
open: true,
|
|
1633
1672
|
escalated: true,
|
|
@@ -2529,6 +2568,9 @@ function createHttpApiGateway(config) {
|
|
|
2529
2568
|
async testCustomRule(body) {
|
|
2530
2569
|
return call("POST", "/api/v1/custom-rules/test", { body }, parseRuleTest);
|
|
2531
2570
|
},
|
|
2571
|
+
async testCustomRulesBatch(body) {
|
|
2572
|
+
return call("POST", "/api/v1/custom-rules/test-batch", { body }, parseRuleTestBatch);
|
|
2573
|
+
},
|
|
2532
2574
|
// ── Policy sets ───────────────────────────────────────────────
|
|
2533
2575
|
async listPolicySets(filters) {
|
|
2534
2576
|
return call("GET", "/api/v1/policy-sets", { params: { query: filters } }, parsePolicySetPage);
|
|
@@ -4533,6 +4575,65 @@ var testCustomRuleTool = {
|
|
|
4533
4575
|
return ok(result.value);
|
|
4534
4576
|
}
|
|
4535
4577
|
};
|
|
4578
|
+
var TestCustomRulesBatchInputShape = {
|
|
4579
|
+
rules: z.array(
|
|
4580
|
+
z.object({
|
|
4581
|
+
id: z.string().uuid().optional().describe(
|
|
4582
|
+
"Optional UUID you choose to tell rules apart in the reply; echoed back as rule_id. The API accepts only a UUID here. It is not looked up and does not select a saved rule."
|
|
4583
|
+
),
|
|
4584
|
+
rule_type: z.string().max(50).describe(
|
|
4585
|
+
"Rule engine type. Same set as `test_custom_rule`: `stopword_content`, `stopword_url`, `regexp_content`, `regexp_url`, `regexp_request_url`, `regexp_request_body`, `blacklist_domain`, `combo`, `llm`."
|
|
4586
|
+
),
|
|
4587
|
+
config: patternAwareRuleConfigField.describe(
|
|
4588
|
+
"Rule-type-specific config. Same shape as `test_custom_rule`'s `config`. " + PATTERN_RULE_CONFIG_DOC + " " + COMBO_MATCH_SCOPE_DOC
|
|
4589
|
+
),
|
|
4590
|
+
target: z.string().max(30).default("page").describe(
|
|
4591
|
+
"Where to apply the rule. Defaults to 'page'. `regexp_request_url` and `regexp_request_body` also accept 'creative' and 'creative_and_page'."
|
|
4592
|
+
),
|
|
4593
|
+
name: z.string().min(1).max(200).default("Test Rule").describe(
|
|
4594
|
+
"Label the LLM prompt quotes as [USER RULE: \"<name>\"]. Same field as the single test. Defaults to 'Test Rule', which is what that test sends when name is omitted. Capped at 200 like `create_custom_rule`'s name, so a draft that tests well can be saved as is."
|
|
4595
|
+
)
|
|
4596
|
+
})
|
|
4597
|
+
).min(1).max(20).describe("Up to 20 rules. Every rule runs against every scan in `scan_ids`."),
|
|
4598
|
+
scan_ids: schemas.RuleTestBatchRequest.shape.scan_ids.describe(
|
|
4599
|
+
"Up to 50 stored scan UUIDs. Testing one rule against many scans is the usual case."
|
|
4600
|
+
)
|
|
4601
|
+
};
|
|
4602
|
+
var testCustomRulesBatchTool = {
|
|
4603
|
+
name: "test_custom_rules_batch",
|
|
4604
|
+
description: "Preview-test up to 20 rule definitions against up to 50 stored scans in one call, without saving them. Returns one cell per rule and scan; a cell's `index` is the rule's position in `rules`, so pair it with `scan_id` to identify the cell. A rule definition the API rejects fails the whole call as invalid input before anything runs. Otherwise a cell that could not run has `error` and `error_code` and never fails the rest: `deadline_exceeded` means the call ran out of time before that cell (about 110s per call) \u2014 call again with just those rules and scans; others are `timed_out`, `llm_failed`, `content_prohibited`, `scan_not_found`, `invalid_rule`, `failed`. `summary.failed` counts every cell with an error and `summary.deadline_exceeded` is the part of them the deadline cut off. A rate-limited error means this organization already has a batch running; wait for it. Many AI (`llm`) rules over many scans are better split across calls. Historical limits match `test_custom_rule`: `regexp_request_body` only has captured bodies for the last day, and `regexp_request_url` on a stored scan is best-effort.",
|
|
4605
|
+
annotations: {
|
|
4606
|
+
title: "Test Custom Rules Batch",
|
|
4607
|
+
readOnlyHint: true,
|
|
4608
|
+
destructiveHint: false,
|
|
4609
|
+
idempotentHint: true,
|
|
4610
|
+
openWorldHint: false
|
|
4611
|
+
},
|
|
4612
|
+
inputSchema: z.object(TestCustomRulesBatchInputShape),
|
|
4613
|
+
handler: async (input, ctx) => {
|
|
4614
|
+
for (const [index, rule] of input.rules.entries()) {
|
|
4615
|
+
const inputError = patternRuleInputError(rule);
|
|
4616
|
+
if (inputError?.kind === "invalid-input") {
|
|
4617
|
+
const message = "rules[" + String(index) + "]: " + inputError.message;
|
|
4618
|
+
return err(
|
|
4619
|
+
inputError.fieldErrors === void 0 ? { kind: "invalid-input", message } : { kind: "invalid-input", message, fieldErrors: inputError.fieldErrors }
|
|
4620
|
+
);
|
|
4621
|
+
}
|
|
4622
|
+
}
|
|
4623
|
+
const result = await ctx.api.testCustomRulesBatch({
|
|
4624
|
+
rules: input.rules.map((rule) => ({
|
|
4625
|
+
rule_type: rule.rule_type,
|
|
4626
|
+
config: rule.config,
|
|
4627
|
+
target: rule.target,
|
|
4628
|
+
name: rule.name,
|
|
4629
|
+
...rule.id === void 0 ? {} : { id: rule.id }
|
|
4630
|
+
})),
|
|
4631
|
+
scan_ids: input.scan_ids
|
|
4632
|
+
});
|
|
4633
|
+
if (result.isErr()) return err(mapApiError(result.error));
|
|
4634
|
+
return ok(result.value);
|
|
4635
|
+
}
|
|
4636
|
+
};
|
|
4536
4637
|
var UpdateCustomRuleInputShape = {
|
|
4537
4638
|
rule_id: z.string().uuid().describe("Rule UUID to update."),
|
|
4538
4639
|
name: z.string().min(1).max(200).optional().describe(
|
|
@@ -5381,6 +5482,15 @@ var cancelScanTool = {
|
|
|
5381
5482
|
return ok(result.value);
|
|
5382
5483
|
}
|
|
5383
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
|
+
);
|
|
5384
5494
|
var scanProxyField = z.object({
|
|
5385
5495
|
proxy_type: z.enum(["residential", "mobile"]).optional().describe(
|
|
5386
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."
|
|
@@ -5412,15 +5522,22 @@ var CreateBulkScansInputShape = {
|
|
|
5412
5522
|
),
|
|
5413
5523
|
referrer: scanReferrerField,
|
|
5414
5524
|
ignore_first_n_domains: ignoreFirstNDomainsScanField,
|
|
5415
|
-
country_codes: z.array(z.string().length(2)).min(1).max(50).describe(
|
|
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
|
+
),
|
|
5416
5528
|
emulator_id: z.string().min(1).max(100).describe("Device/OS profile slug; same for every country in the batch."),
|
|
5417
5529
|
proxy: scanProxyField,
|
|
5418
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,
|
|
5419
5536
|
...repeatRetryFields
|
|
5420
5537
|
};
|
|
5421
5538
|
var createBulkScansTool = {
|
|
5422
5539
|
name: "create_bulk_scans",
|
|
5423
|
-
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.",
|
|
5424
5541
|
annotations: {
|
|
5425
5542
|
title: "Create Bulk Scans",
|
|
5426
5543
|
readOnlyHint: false,
|
|
@@ -5440,6 +5557,11 @@ var createBulkScansTool = {
|
|
|
5440
5557
|
...input.ignore_first_n_domains !== void 0 ? { ignore_first_n_domains: input.ignore_first_n_domains } : {},
|
|
5441
5558
|
...input.proxy !== void 0 ? { proxy: input.proxy } : {},
|
|
5442
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 } : {},
|
|
5443
5565
|
...pickRepeatRetryBody(input)
|
|
5444
5566
|
};
|
|
5445
5567
|
const result = await ctx.api.createBulkScans(body);
|
|
@@ -5463,11 +5585,9 @@ var CreateScanInputShape = {
|
|
|
5463
5585
|
emulator_id: z.string().min(1).max(100).describe("Device/OS profile slug; use `list_emulators` to discover valid values."),
|
|
5464
5586
|
proxy: scanProxyField,
|
|
5465
5587
|
labels: z.record(z.string()).optional().describe("Arbitrary string -> string metadata attached to the scan."),
|
|
5466
|
-
campaign_id:
|
|
5467
|
-
run_id:
|
|
5468
|
-
ad_discovery:
|
|
5469
|
-
"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`."
|
|
5470
|
-
),
|
|
5588
|
+
campaign_id: scanCampaignIdField,
|
|
5589
|
+
run_id: scanRunIdField,
|
|
5590
|
+
ad_discovery: scanAdDiscoveryField,
|
|
5471
5591
|
max_discovered_ads: maxDiscoveredAdsField,
|
|
5472
5592
|
ad_formats: adFormatsField,
|
|
5473
5593
|
...repeatRetryFields
|
|
@@ -6263,6 +6383,7 @@ function registerAllTools(register) {
|
|
|
6263
6383
|
register(updateCustomRuleTool);
|
|
6264
6384
|
register(deleteCustomRuleTool);
|
|
6265
6385
|
register(testCustomRuleTool);
|
|
6386
|
+
register(testCustomRulesBatchTool);
|
|
6266
6387
|
register(listCustomTaxonomiesTool);
|
|
6267
6388
|
register(getCustomTaxonomyTool);
|
|
6268
6389
|
register(createCustomTaxonomyTool);
|
|
@@ -6387,5 +6508,5 @@ function formatToolError(error) {
|
|
|
6387
6508
|
}
|
|
6388
6509
|
|
|
6389
6510
|
export { BearerToken, SERVER_INSTRUCTIONS, createHttpApiGateway, createPinoLogger, declareEmptyResourcesAndPrompts, newRequestId, wireToolsIntoMcpServer };
|
|
6390
|
-
//# sourceMappingURL=chunk-
|
|
6391
|
-
//# sourceMappingURL=chunk-
|
|
6511
|
+
//# sourceMappingURL=chunk-G5DUWW6D.js.map
|
|
6512
|
+
//# sourceMappingURL=chunk-G5DUWW6D.js.map
|