← Back to search

@kaminari-ad/mcp

GitHub Actions Scanned 25d ago

Official Model Context Protocol (MCP) server for the Kaminari Ad ad-verification platform.

npm
C
68.5 / 100

Versions

0.11.0latest
Jul 28, 2026
0.10.0
Jul 28, 2026
0.9.1
Jul 21, 2026
0.9.0
Jul 21, 2026
0.8.0
Jul 10, 2026
+ show 11 moreshow less
0.7.2
Jul 10, 2026
0.6.0
Jun 30, 2026
0.5.2
Jun 20, 2026
0.5.0
Jun 17, 2026
0.4.0
Jun 4, 2026
0.3.0
May 20, 2026
0.2.2
May 20, 2026
0.2.1
May 18, 2026
0.2.0
May 17, 2026
0.1.5
May 17, 2026
0.1.0
May 17, 2026
PermissionsTool SafetyAuthAnnotationsCode QualityStabilitySpecVuln HistoryAuthorTransparencyCommunity

Tools 108

list_emulators
annotations: none low

List every device/OS emulator profile available for scans (id, display name, category, browser). For `create_scan`, use the `id` as `emulator_id`. For `create_campaign` / `update_campaign`, use the `category` in `emulator_categories` or the `id` in `emulator_specific_ids`.

update_org
annotations: none low

Update the caller's organization display name.

revoke_api_key
annotations: none low

Permanently invalidate an API key. Any subsequent request using it returns 401. Cannot be undone — the user would have to `create_api_key` again.

remove_user
annotations: none low

Revoke a member's access to the organization. The user is signed out and any active API keys they created remain unless revoked separately. CANNOT remove the owner — use `transfer_ownership` first.

update_user_role
annotations: none low

Change an organization member's role. The owner role can only be transferred via `transfer_ownership`. Returns `{updated: true}` on success; refetch with `list_org_users` if you need the new role echoed.

list_org_users
annotations: none low

List every member of the caller's organization with their role, ownership flag, and join date.

list_account_labels
annotations: none low

List the organization's custom label definitions (key, display_name, position, auto_extract). Labels enrich scans and can be used as filters in `list_scans`.

create_api_key
annotations: none low

Mint a new API key for the caller's organization. The full secret is returned in `full_key` THIS ONE TIME ONLY — show it to the user and instruct them to store it; the server keeps only a hash and cannot reveal it again.

invite_user
annotations: none low

Send an invitation email so a new person can join the caller's organization with a chosen role. Returns the pending member record.

get_account
annotations: none low

Get the organization owning the current API key (id, name, owner_id, is_active, created_at). Use this to confirm authentication and capture the org context for follow-up tool calls.

list_org_roles
annotations: none low

List the roles defined for the organization — built-in (owner, admin, member) plus any custom roles, with each role's permission set.

transfer_ownership
annotations: none low

Hand the organization owner role to another existing member. ONE-WAY: the previous owner becomes a regular member afterwards. Require explicit confirmation from the user.

list_api_keys
annotations: none low

List the organization's API keys: id, key prefix (first 8 chars of the secret), display name, expiry, created_at. The full secret is NEVER returned by this endpoint — only the prefix.

create_custom_role
annotations: none low

Create a custom organization role with the supplied permission set. Returns the persisted role; assign it to users via `update_user_role`.

update_account_labels
annotations: none low

REPLACE the organization's full set of custom label definitions. The API replaces the list (no merge); read the current list with `list_account_labels` first. Returns the persisted list with allocated positions.

delete_tag_definition
annotations: none low

Delete a CUSTOM tag definition. Historical tag assignments are preserved; future scans will not receive this tag. System tags cannot be deleted.

get_tag_definition
annotations: none low

Get full definition of one tag: display name, description, severity, category, source (system vs custom), public-report visibility, usage counts, plus `linked_rules` — the custom rules currently producing this tag (id, name, active flag). Fetch a specific rule's full config via `get_custom_rule`. Returns 404 for a retired (archived) tag this organization does not own, including every archived system tag.

list_tags
annotations: none low

List every tag definition in service for this organization (system tags + organization custom tags) with category, severity, visibility, and usage counters (scans + rules per tag). Optionally filter by category, and pass `include_archived` to also see the retired definitions this organization owns.

update_tag_definition
annotations: none low

Update display fields of a CUSTOM tag (system tags are read-only). Only supplied fields are touched. To read the updated definition, follow up with `get_tag_definition`.

list_scan_tags
annotations: none low

List every tag (system + custom) attached to one scan by the checker pipeline, with display name, category, and severity. Tags whose definition has since been archived are omitted — the scan can therefore report fewer tags than when it ran.

parse_custom_taxonomy_text
annotations: none low

Preview-parse pasted free-form text into a taxonomy tree (NOT persisted). Returns `nodes: [{level, name, description}]` + `warnings: string[]`. After review, persist via `create_custom_taxonomy` (remember to flag exactly one node as is_default).

restore_custom_taxonomy
annotations: none low

Re-activate a previously soft-deleted custom taxonomy. Returns the restored taxonomy with its full tree (is_active=true).

get_custom_taxonomy
annotations: none low

Get one custom taxonomy by UUID with its full node tree (each node has id, parent_id, level, position, name, description, is_default).

list_custom_taxonomies
annotations: none low

List the calling org's custom classification taxonomies. Returns slim summaries (id, name, slug, version, node_count, is_active). Only active taxonomies are listed unless you pass `include_inactive: true`; soft-deleted ones then appear with `is_active=false`. Fetch the full tree via `get_custom_taxonomy`.

create_custom_taxonomy
annotations: none low

Create a custom classification taxonomy with its initial tree. Exactly one node should have is_default=true (fallback for scans the LLM cannot classify confidently). Returns the persisted taxonomy with allocated node UUIDs and version=1.

delete_custom_taxonomy
annotations: none low

Soft-delete a custom taxonomy (sets is_active=false). Historical scan classifications keep referencing the id; new scans skip this taxonomy. Use `restore_custom_taxonomy` to undo.

update_custom_taxonomy
annotations: none low

REPLACE a custom taxonomy's name, description, and full tree atomically. The API bumps `version` on every successful update; ongoing scan classifications continue with the previous tree until they finish, so updates are safe but not retroactive.

cancel_run
annotations: none low

Cancel every pending scan within one run. Running scans complete; pending ones get refunded. Returns the count of cancelled scans.

get_run
annotations: none low

Get one run by UUID with totals (queued, completed, failed, partial, cancelled), parent campaign, label, source.

list_run_scans
annotations: none low

List the tile-scan items produced by one run (status, country, offer URL, absolute screenshot URL, report_url + public_report_url deep-links, elapsed ms, error). Link users to a scan with the returned `report_url` (auth dashboard) or `public_report_url` (shareable) — never hand-build URLs. For full scan details (input URL, labels, classification, redirect chain) fetch a specific scan via `get_scan`.

bulk_update_alert_status
annotations: none low

Change the status of many alerts at once. Select EITHER an explicit `ids` list (max 1000) OR `all_matching: true` with the `filter_*` fields, which mirror `list_alerts`. Alerts already in a state the transition cannot leave are skipped rather than failing the call, so the response reports `updated` and `skipped` counts — compare `updated + skipped` against the selection size to see how many were no-ops. Prefer `update_alert_status` for a single alert.

get_alert_stats
annotations: none low

Get alert counts grouped by status: open, escalated, resolved, dismissed. Accepts every filter `list_alerts` does except `status` — the response buckets BY status — so passing the same filters to both makes the four counts sum to the `total` that `list_alerts` reports. Unfiltered, the counts cover the whole organization over all time. Use this to size a selection before calling `bulk_update_alert_status` with `all_matching`.

update_alert_status
annotations: none low

Update an alert's status in its lifecycle: open → escalated → resolved | dismissed. The API enforces valid transitions; an invalid one returns 422.

list_alerts
annotations: none low

List violation alerts (one per scan + violating rule combo) with offer URL, country, status, scan back-reference, and the kind-aware fields `rule_type` (tag / iab_v3 / brand / ai_category / custom_taxonomy) + `matched_value` (the canonical text the scan matched against). Filter by campaign, status, policy set, tag, country and creation-date range; `policy_set_id`, `tag` and `country_code` take comma-separated values and match any of them. Pass the same filters to `get_alert_stats` to get counts that agree with this list.

set_default_policy_set
annotations: none low

Mark or clear one of your organization's policy sets as the default for new campaigns. At most one owned set may be default. Creating a campaign without `policy_set_id` then binds this set (or stays unbound if none is set). Pass `policy_set_id: null` on create_campaign to opt out of the default. Foreign public sets cannot be made default. The API returns 204; this tool echoes `is_default`.

request_policy_set_approval
annotations: none low

Submit a private policy set for Kaminari Ad team review so it can be marked PUBLIC and used by other organizations. The set must be complete and well-formed. Returns immediately; approval status is reflected on the policy set entity once the review completes.

list_policy_sets
annotations: none low

Paginated list of policy sets: named collections of violation rules (tag / IAB V3 / brand / AI category / custom-taxonomy entries) that define what counts as a violation. Campaigns bind to one policy set. Returns `{items, total, page, limit}`. List items omit `entries` for payload size — fetch a single set via `get_policy_set` when you need them. `is_default` is true on the owned set that new campaigns bind when `policy_set_id` is omitted. Use `visibility=public` to discover Kaminari Ad-curated sets.

update_policy_set
annotations: none low

REPLACE a policy set's name, description, and entry list. The API requires all three fields on every update — read the current set with `get_policy_set` first if you only want to change one thing. Supports all five rule kinds (tag / iab_v3 / brand / ai_category / custom_taxonomy).

list_policy_set_campaigns
annotations: none low

List the campaigns bound to a policy set, paginated, each with `id`, `name` and `is_archived`. `get_policy_set` returns only the first page of bindings plus a `campaigns_total`, so use this tool when a set has more campaigns than that page holds, or to search them by name. Read the membership here before `detach_policy_set_campaigns` — and before `delete_policy_set`, which the API refuses while any active campaign is still bound.

create_policy_set
annotations: none low

Create a new policy set (named collection of violation rules). Each rule is one of: tag slug, IAB V3 category prefix, advertiser brand, freeform AI category, or per-org custom-taxonomy node. Bind campaigns to the set via `update_campaign`.

get_policy_set
annotations: none low

Get one policy set by UUID with its complete list of entries (each entry is one of five rule kinds — tag / iab_v3 / brand / ai_category / custom_taxonomy — plus applicable country codes). `is_default` is true when this owned set is the organization's default for new campaigns.

delete_policy_set
annotations: none low

Permanently delete a policy set. IMPORTANT: API returns HTTP 400 if any active campaign is still bound to this set. To unbind first, call `list_campaigns` with a `policy_set_id` filter (when available) or scan your campaigns for matches, then `update_campaign` for each match setting `policy_set_id=null`, then retry delete. Alerts created under this set persist (their `policy_set_id` becomes `null`).

unpublish_policy_set
annotations: none low

Return one of your organization's policy sets to PRIVATE. Inverse of request_policy_set_approval: removes an approved set from the shared catalog other organizations browse, or withdraws a publication request that is still awaiting review. The set stays fully usable inside your own organization. Campaigns in other organizations that already reference the set keep their binding — going private blocks new attachments rather than breaking existing ones. Safe to call on a set that is already private.

detach_policy_set_campaigns
annotations: none low

Unbind campaigns from a policy set INCREMENTALLY — the bindings you don't name survive. Pass `campaign_ids` for specific campaigns or `detach_all: true` to clear the whole membership. This and `attach_policy_set_campaigns` are the only way to change membership; `update_policy_set` edits the set's name, description and rules, never its campaigns. Detaching leaves the policy set and its rules intact, and alerts already raised under it are kept.

attach_policy_set_campaigns
annotations: none low

Bind campaigns to a policy set. This and `detach_policy_set_campaigns` are the only way to change membership — `update_policy_set` edits the set's name, description and rules, never its campaigns. Membership changes here are incremental: this set's other members are left alone. IMPORTANT: a campaign can belong to only one policy set, so naming a campaign currently on a DIFFERENT set MOVES it here — it stops being evaluated against its old set's rules, and no warning is returned. Check `list_campaigns` (`policy_set_id`) first when the campaign may already be bound elsewhere. Split lists longer than 500 across calls; verify with `list_policy_set_campaigns`.

get_webhook
annotations: none low

Get one webhook endpoint by UUID with URL, subscribed event types, active flag.

create_webhook
annotations: none low

Register a webhook endpoint for the chosen event types. Response is a `{ webhook, secret }` envelope — the HMAC-SHA256 SIGNING SECRET is returned once and the caller MUST store it to verify event signatures.

list_webhook_deliveries
annotations: none low

List delivery attempts for one webhook endpoint with event type, status (pending / delivered / failed), HTTP response status if any, and attempt timestamp. Filter by `success` and / or a `from_ts` / `to_ts` range. Paginated.

rotate_webhook_secret
annotations: none low

Generate a new signing secret for a webhook. The new secret is returned IN FULL once — tell the user to store it. Subsequent deliveries are signed with the new secret; the old one stops working immediately.

test_webhook
annotations: none low

Dispatch a synthetic event with the sample payload for the given `event_type` to the webhook endpoint and return the receiver's response synchronously. Includes HTTP status, elapsed time, and a snippet of the response body so the operator can diagnose receiver bugs.

replay_webhook_delivery
annotations: none low

Queue a re-attempt for one specific webhook-delivery attempt by id. Useful when an endpoint was temporarily down. Result of the replay shows up as a new entry in `list_webhook_deliveries`.

list_webhooks
annotations: none low

List the organization's registered webhook endpoints with their URL, subscribed event types, and active flag.

bulk_replay_webhook
annotations: none low

Replay every delivery attempt for this webhook endpoint that landed in [from_ts, to_ts). Returns `{ replayed, skipped }` counts. Use to recover after a downstream outage — every event in the window is re-fired.

update_webhook
annotations: none low

Update a webhook endpoint's URL, event-type subscriptions, and/or active flag. Signing secret is NOT rotated by this call — use `rotate_webhook_secret` for that.

list_webhook_event_types
annotations: none low

List the catalog of event types a webhook can subscribe to (e.g. `scan.done`, `alert.opened`, `campaign.run.completed`) with each event's description and a sample payload.

delete_webhook
annotations: none low

Unregister a webhook endpoint. No further events are delivered; in-flight retries are dropped. Past delivery history is preserved.

get_invoice_pdf
annotations: none low

Download one invoice as an inline PDF (base64-encoded). Returned as a single MCP resource content block — agents can save / forward it without a second API call.

list_invoices
annotations: none low

List invoices issued to the organization with number, type, status, total in micros, currency, due/paid dates. Filter by `type` and / or `status`. Use `get_invoice_pdf` to download the PDF for a specific invoice.

resume_campaign_group_schedule
annotations: none low

Re-enable the scheduler for every campaign in the group. Inverse of `pause_campaign_group_schedule`.

unarchive_campaign_group
annotations: none low

Restore an archived campaign group and re-expose its campaigns in default lists.

get_campaign_group
annotations: none low

Get one campaign group by UUID with default/archive/pause flags and campaign count.

create_campaign_group
annotations: none low

Create a new campaign group (folder). Free operation, no scans queued.

run_campaign_group
annotations: none low

Fire an immediate run of every active (non-archived, non-paused) campaign in the group. Returns aggregate stats: how many campaigns triggered, the per-campaign run UUIDs, and any per-campaign failures.

cancel_campaign_group
annotations: none low

Cancel every pending scan across every campaign in the group. Refunds credits for cancelled scans. Returns the total cancelled count.

update_campaign_group
annotations: none low

Rename a campaign group. To pause/resume its scheduler, use `pause_campaign_group_schedule` / `resume_campaign_group_schedule` instead.

list_campaign_groups
annotations: none low

List campaign groups — folders that group related campaigns — with per-group campaign count and `last_run_at`. Filter by archived flag, name substring, or creation / last-run date range; a group's last run is the newest run across its campaigns. Not paginated; the org-scoped list is typically small (a few dozen groups max).

pause_campaign_group_schedule
annotations: none low

Pause the scheduler for EVERY campaign in the group. Already-pending scans complete; no new scheduled runs are produced until you `resume_campaign_group_schedule`.

archive_campaign_group
annotations: none low

Soft-delete the group AND every campaign in it. The default group cannot be archived; ask the user to move campaigns out first.

get_proxy_targeting
annotations: none low

List the proxy regions, cities, and ISPs accepted for a country. Call this before setting proxy targeting on create_scan, create_bulk_scans, create_campaign, or update_campaign — the accepted values come from the upstream network provider and cannot be listed in those tools' schemas, so a guess is a 422. Anything listed here is accepted. Values are ordered by pool size, largest first; prefer values near the front. Two traps: residential and mobile are separate pools, so pass the proxy_type the scan will use; and without a region the cities are the whole country's, so if you target a region, call again with that region and take the city from that narrower list — a region and a city that do not belong together are accepted but leave the provider no exit node.

set_campaign_alert_overrides
annotations: none low

REPLACE the per-campaign alert-routing override. `mode=inherit` drops the override so the campaign follows the org-wide destinations; `mode=override` routes its alerts ONLY to `destination_ids`; `mode=silence` sends nothing for the campaign. There is no 'route everywhere except these' mode — to exclude one destination, pass `override` with the destinations you DO want (see `list_alert_destinations`). To read the new state, follow up with `get_campaign_alert_overrides`.

get_campaign_alert_overrides
annotations: none low

Get the per-campaign override of which alert destinations receive its alerts. `mode` is one of `inherit` (no override — the campaign follows the org-wide destinations), `override` (alerts go ONLY to the returned `destination_ids`), or `silence` (the campaign sends nothing).

list_alert_destinations
annotations: none low

List configured alert-notification destinations (channels): Slack workspaces, Telegram chats, email lists, generic webhooks. Each entry has id, kind, display name, version, and creation timestamp.

delete_alert_destination
annotations: none low

Remove an alert-notification destination. The org stops receiving pings on this channel immediately; campaign-level overrides referencing it are pruned.

set_alert_destination_version
annotations: none low

Switch a destination to a specific versioned config — used after re-authorizing a Slack workspace, rotating a Telegram bot token, etc. The new version must already exist in the destination's history. The API returns no body on success; this tool reports `{ updated: true }`. Use `list_alert_destinations` to read the new state if needed.

create_custom_rule
annotations: none low

Define a custom tag-detection rule. Use `rule_type='regexp_request_url'` to match captured network and subresource URLs; fresh scans carry up to 5,000 URLs, while later tests/rechecks use a reduced persisted request tree and are best-effort. Use `rule_type='regexp_request_body'` to match the CONTENTS of those sub-resources instead — the right choice when the code you want to catch keeps changing its filename; those contents are kept for one day. `rule_type='regexp_url'` remains redirect-chain-only. The API auto-registers a tag definition for each emitted slug and rejects built-in system-slug collisions with HTTP 422 / `checking.system_slug_reserved`. Matches tag future scans; existing scans are untouched until `recheck_scans`.

delete_custom_rule
annotations: none low

Permanently delete a custom rule. Already-applied tags on past scans are preserved; the rule simply stops running on future scans.

get_custom_rule
annotations: none low

Get one custom rule by UUID with name, tag-slug, type, config object, target, active flag.

test_custom_rule
annotations: none low

Preview-test a rule definition against a stored scan without persisting it. For `regexp_request_url`, the historical snapshot contains main-frame hops plus at most 200 persisted subrequests with selected resource types omitted, so a no-match does not prove the original fresh scan lacked the request. For `regexp_request_body`, the captured contents live for ONE DAY — pick a scan from the last 24 hours, because an older one reports no match with nothing left to read. Returns match state, elapsed time, and per-tag detail; the preview response does not expose the matched request URL separately. Slug-collision validation does not run in preview mode.

update_custom_rule
annotations: none low

Update a custom tag-detection rule. Only supplied fields are sent, but `config` replaces the stored object wholesale; read the rule first and resend every required key. `regexp_request_url` and `regexp_request_body` need a non-empty pattern (max 4,096), flags `''`/`'i'`, and a target of `'page'`, `'creative'` or `'creative_and_page'`. Same-slug GLOBAL rule edits preserve separately managed tag metadata; use `update_tag_definition` to change it. Existing scans are not re-evaluated until `recheck_scans`.

list_custom_rules
annotations: none low

Paginated list of the organization's custom tag-detection rules (regex / heuristics) with their config, target, and active flag. Returns `{items, total, page, limit}`. To iterate: there is a next page iff `page * limit < total` (or equivalently `items.length === limit` until the last page). `page` is 1-indexed.

list_usage
annotations: none low

List per-scan usage rows (cost in micros, kind, scan id, timestamp). Use to attribute cost to specific scans or campaigns.

get_usage_summary
annotations: none low

Get a one-liner aggregate of usage for the current billing period: total cost (micros), check count, period start/end.

list_balance_history
annotations: none low

List ledger transactions (charges, refunds, top-ups, invoice settlements and their corrections) on the organization's balance. Each row: type, amount in micros, description, timestamp. Filter by `type` (multi-select) and / or date range.

get_billing_summary
annotations: none low

Get the organization's billing snapshot: balance (in micros), current plan, period usage counters, suspension state, and whether new scans are accepted right now.

list_campaign_runs
annotations: none low

List every run (scheduled execution) of one campaign, paginated, with per-run counters.

update_campaign
annotations: none low

Update one or more fields of a campaign. Fields not supplied are left unchanged. `policy_set_id` accepts null to clear the binding, `referrer` accepts null to clear the publisher page scans are checked from, and `max_discovered_ads` accepts null to go back to the platform ad cap. `ignore_first_n_domains` is the exception: it is not nullable, so pass 0 to go back to skipping nothing.

create_campaign
annotations: none low

Create a recurring scan campaign (template). The schedule produces N scans per run where N = number of countries times number of device profiles times `repeat_count`. Scans cost credits when they run, not when the campaign is created, so a high `repeat_count` multiplies the bill on every run. The returned campaign echoes `repeat_count`, `repeat_mode`, and `retry_max_attempts`, so read it back to confirm what the campaign will do.

list_campaigns_picker
annotations: none low

Slim per-row campaign list for selection UIs — id, name, group_id, is_archived. Cheaper than `list_campaigns` for orgs with thousands of campaigns. Use `get_campaign(id)` after a selection to fetch full details.

list_campaigns
annotations: none low

List campaigns for the caller's organization, optionally filtered by group, archived flag, name substring, or creation / last-run date range. Paginated. Each row carries the same fields as `get_campaign`, including the repeat / retry settings (`repeat_count`, `repeat_mode`, `retry_max_attempts`) — use them to spot the campaigns that multiply their per-run scan count.

archive_campaign
annotations: none low

Soft-delete (archive) a campaign. Removes it from default lists and stops the scheduler; previously-collected scans are preserved.

get_campaign
annotations: none low

Get one campaign by UUID: name, type (url|ad_tag|vast|ad_discovery), target URL / ad-tag / VAST tag (vast_tag), countries, emulator selection, proxy targeting, schedule status, archive status, parent group. Also echoes the repeat / retry settings — `repeat_count`, `repeat_mode`, `retry_max_attempts` — so this is how you confirm what `create_campaign` or `update_campaign` actually saved, and how many scans a run will produce (countries x device profiles x `repeat_count`). `ad_discovery` campaigns store the publisher page in the URL field.

run_campaign
annotations: none low

Trigger an immediate, ad-hoc run of a campaign. Costs N credits where N = number of countries × number of emulators in the campaign config. Returns the new run with progress counters (total / completed / failed / partial / cancelled); track further progress via `get_run`.

unarchive_campaign
annotations: none low

Restore an archived campaign. Inverse of `archive_campaign`. The campaign re-appears in default lists; if `schedule_enabled` was true, the scheduler resumes producing runs.

cancel_campaign
annotations: none low

Cancel every pending scan across all unfinished runs of a campaign. Running scans complete normally; pending scans are marked cancelled and credits refunded. Returns count of cancelled scans.

get_scan_landing_screenshot
annotations: none low

Fetch the screenshot of one landing tab on an ad-tag scan as an inline image (base64-encoded WebP — the API stores and serves every screenshot as WebP, so the client must be able to decode it). Use `get_scan` first to discover available `landings[*].ord` values.

get_scan_creative_video
annotations: none low

Fetch the MP4 MediaFile a VAST scan downloaded, as one inline resource block. Only VAST scans have it; others return not-found. Prefer `get_scan_creative_screenshot` for a still frame and `get_scan_vast_xml` for the declared metadata — both are far cheaper. Reach for the video itself only when the moving image is the evidence. Files over 8 MiB are refused rather than inlined; fall back to `get_scan_creative_screenshot` or the report URL from `get_scan` for those.

get_scan_creative_screenshot
annotations: none low

Fetch the creative screenshot for an ad-tag scan as an inline image (base64-encoded WebP — the API stores and serves every screenshot as WebP, so the client must be able to decode it). Returns 404 if the scan is not an ad-tag scan or has no creative captured yet.

get_scan_creative_html
annotations: none low

Fetch the generated creative markup for an ad-tag scan as text — the HTML the ad tag produced, with the scripts, iframes and click-through URLs it embedded. Use it to explain WHY a creative was tagged when a screenshot cannot show it (obfuscated redirectors, hidden trackers, injected handlers). Only ad-tag scans have this artifact; a URL or VAST scan returns not-found. The markup is returned inert as text and is never executed. Markup over 256 KiB is refused — open the report URL from `get_scan` for those.

create_bulk_scans
annotations: none low

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.

list_scans
annotations: none low

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 — link users with those, never hand-build URLs. Repeated scans look like near-duplicate rows: `repeat_index` / `repeat_total` place each one inside its repeat group (0-based) and a non-null `repeat_session_id` means the group ran in `shared` mode (one browser, one IP, cookies carried across repeats) — group by it to compare the repeats of one combination. `retry_attempt` / `retry_max_attempts` count technical re-crawls of that same scan, not extra scans. `repeat_scan_ids` is not part of this response; use `get_scan` for a single scan's full detail.

list_scan_children
annotations: none low

List the discovered-ad child scans of a publisher ad-discovery scan — one per detected ad block on the page. Each child brief carries ad_kind (banner|pop), slot_index, and the ad's attribution split in two: network is the ad network's NAME and is empty when the ad server is unrecognised, network_host is the domain observed — so read network first and fall back to network_host. Both are empty when the ad came from infrastructure that is not an ad network (tag manager, analytics) or from the publisher's own creative CDN; a pop carries a network but no host, because pop networks rotate their serving domains. The repeat / retry fields are present but never meaningful here: a child is always its own group of one (`repeat_index` 0, `repeat_total` 1, `repeat_session_id` null) and is never re-crawled, because repeats and retries apply to the publisher scan — repeating an ad-discovery scan gives you several parents, each with its own children. Returns a paginated envelope with screenshot + report deep-links; link users with those, never hand-build URLs.

get_scan_vast_xml
annotations: none low

Fetch the VAST document for a VAST scan as text, with wrappers already resolved so the whole chain is visible in one payload. Use it to inspect the tracking pixels, verification vendors, companion ads and click-through targets a video ad declared — the parsed summary on `get_scan` (`video` block) covers duration, media file and ad system, but not the full element tree. Only VAST scans have this artifact; others return not-found. Documents over 256 KiB are refused.

create_scan
annotations: none low

Queue a single new scan for a URL, ad-tag, or VAST video tag against one country. Takes one target and one country — there is no multi-URL form; call it once per URL. COSTS CREDITS and bills the caller's organization: this call creates exactly `repeat_count` scans (default 1) and bills every one of them. Returns the newly-created scan record; when `repeat_count` > 1 the response's `repeat_scan_ids` lists the sibling scans this call also created.

recheck_scans
annotations: none low

Re-run the checker pipeline against recent COMPLETED scans (e.g. after updating policies or custom rules). Returns the number of scans queued for re-evaluation. No new crawl fee — only the checker cost.

get_scan
annotations: none low

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` or `video` today; treat it as an open string), and a `video` block (duration, media-file URL, the creative's `click_through` destination, VAST version, ad system, VPAID flag, wrapper depth). Repeats and retries: `repeat_index` / `repeat_total` place this scan inside its repeat group (0-based, so 2 of 5 reads as repeat_index 1), a non-null `repeat_session_id` means the group ran in `shared` mode (same browser, same IP, cookies carried over) and is the key to correlate its members — a shared group of one has nothing to carry over, so it stays null — `repeat_scan_ids` is filled only on the create response, and `retry_attempt` / `retry_max_attempts` show how many technical re-crawls this scan already consumed. Link users with the returned `report_url` / `public_report_url` — never construct URLs yourself.

cancel_scan
annotations: none low

Cancel one pending scan by UUID. Already-running or completed scans are no-ops. Cancellation refunds the scan credit.

get_scan_screenshot
annotations: none low

Fetch the primary screenshot for a scan as an inline image (base64-encoded WebP — the API stores and serves every screenshot as WebP, so the client must be able to decode it). Pass `width` to request a resized version (50-2000 px). Returns one MCP image content block.

list_geos
annotations: none low

List every country the Kaminari Ad platform can scan ads from, with ISO 3166-1 alpha-2 code, name, continent, and emoji.

Permissions 3

network medium
Server uses network capabilities via: fetch()
shell high
Server uses shell capabilities via: child_process, spawn(), spawnSync()
env_vars low
Server uses env_vars capabilities via: process.env

Scan Findings 228

low
Tool 'list_emulators' has no annotations annotation_checker · 100%
low
Tool 'update_org' has no annotations annotation_checker · 100%
low
Tool 'revoke_api_key' has no annotations annotation_checker · 100%
low
Tool 'remove_user' has no annotations annotation_checker · 100%
low
Tool 'update_user_role' has no annotations annotation_checker · 100%
low
Tool 'list_org_users' has no annotations annotation_checker · 100%
low
Tool 'list_account_labels' has no annotations annotation_checker · 100%
low
Tool 'create_api_key' has no annotations annotation_checker · 100%
low
Tool 'invite_user' has no annotations annotation_checker · 100%
low
Tool 'get_account' has no annotations annotation_checker · 100%
low
Tool 'list_org_roles' has no annotations annotation_checker · 100%
low
Tool 'transfer_ownership' has no annotations annotation_checker · 100%
low
Tool 'list_api_keys' has no annotations annotation_checker · 100%
low
Tool 'create_custom_role' has no annotations annotation_checker · 100%
low
Tool 'update_account_labels' has no annotations annotation_checker · 100%
low
Tool 'delete_tag_definition' has no annotations annotation_checker · 100%
low
Tool 'get_tag_definition' has no annotations annotation_checker · 100%
low
Tool 'list_tags' has no annotations annotation_checker · 100%
low
Tool 'update_tag_definition' has no annotations annotation_checker · 100%
low
Tool 'list_scan_tags' has no annotations annotation_checker · 100%
low
Tool 'parse_custom_taxonomy_text' has no annotations annotation_checker · 100%
low
Tool 'restore_custom_taxonomy' has no annotations annotation_checker · 100%
low
Tool 'get_custom_taxonomy' has no annotations annotation_checker · 100%
low
Tool 'list_custom_taxonomies' has no annotations annotation_checker · 100%
low
Tool 'create_custom_taxonomy' has no annotations annotation_checker · 100%
low
Tool 'delete_custom_taxonomy' has no annotations annotation_checker · 100%
low
Tool 'update_custom_taxonomy' has no annotations annotation_checker · 100%
low
Tool 'cancel_run' has no annotations annotation_checker · 100%
low
Tool 'get_run' has no annotations annotation_checker · 100%
low
Tool 'list_run_scans' has no annotations annotation_checker · 100%
low
Tool 'bulk_update_alert_status' has no annotations annotation_checker · 100%
low
Tool 'get_alert_stats' has no annotations annotation_checker · 100%
low
Tool 'update_alert_status' has no annotations annotation_checker · 100%
low
Tool 'list_alerts' has no annotations annotation_checker · 100%
low
Tool 'set_default_policy_set' has no annotations annotation_checker · 100%
low
Tool 'request_policy_set_approval' has no annotations annotation_checker · 100%
low
Tool 'list_policy_sets' has no annotations annotation_checker · 100%
low
Tool 'update_policy_set' has no annotations annotation_checker · 100%
low
Tool 'list_policy_set_campaigns' has no annotations annotation_checker · 100%
low
Tool 'create_policy_set' has no annotations annotation_checker · 100%
low
Tool 'get_policy_set' has no annotations annotation_checker · 100%
low
Tool 'delete_policy_set' has no annotations annotation_checker · 100%
low
Tool 'unpublish_policy_set' has no annotations annotation_checker · 100%
low
Tool 'detach_policy_set_campaigns' has no annotations annotation_checker · 100%
low
Tool 'attach_policy_set_campaigns' has no annotations annotation_checker · 100%
low
Tool 'get_webhook' has no annotations annotation_checker · 100%
low
Tool 'create_webhook' has no annotations annotation_checker · 100%
low
Tool 'list_webhook_deliveries' has no annotations annotation_checker · 100%
low
Tool 'rotate_webhook_secret' has no annotations annotation_checker · 100%
low
Tool 'test_webhook' has no annotations annotation_checker · 100%
low
Tool 'replay_webhook_delivery' has no annotations annotation_checker · 100%
low
Tool 'list_webhooks' has no annotations annotation_checker · 100%
low
Tool 'bulk_replay_webhook' has no annotations annotation_checker · 100%
low
Tool 'update_webhook' has no annotations annotation_checker · 100%
low
Tool 'list_webhook_event_types' has no annotations annotation_checker · 100%
low
Tool 'delete_webhook' has no annotations annotation_checker · 100%
low
Tool 'get_invoice_pdf' has no annotations annotation_checker · 100%
low
Tool 'list_invoices' has no annotations annotation_checker · 100%
low
Tool 'resume_campaign_group_schedule' has no annotations annotation_checker · 100%
low
Tool 'unarchive_campaign_group' has no annotations annotation_checker · 100%
low
Tool 'get_campaign_group' has no annotations annotation_checker · 100%
low
Tool 'create_campaign_group' has no annotations annotation_checker · 100%
low
Tool 'run_campaign_group' has no annotations annotation_checker · 100%
low
Tool 'cancel_campaign_group' has no annotations annotation_checker · 100%
low
Tool 'update_campaign_group' has no annotations annotation_checker · 100%
low
Tool 'list_campaign_groups' has no annotations annotation_checker · 100%
low
Tool 'pause_campaign_group_schedule' has no annotations annotation_checker · 100%
low
Tool 'archive_campaign_group' has no annotations annotation_checker · 100%
low
Tool 'get_proxy_targeting' has no annotations annotation_checker · 100%
low
Tool 'set_campaign_alert_overrides' has no annotations annotation_checker · 100%
low
Tool 'get_campaign_alert_overrides' has no annotations annotation_checker · 100%
low
Tool 'list_alert_destinations' has no annotations annotation_checker · 100%
low
Tool 'delete_alert_destination' has no annotations annotation_checker · 100%
low
Tool 'set_alert_destination_version' has no annotations annotation_checker · 100%
low
Tool 'create_custom_rule' has no annotations annotation_checker · 100%
low
Tool 'delete_custom_rule' has no annotations annotation_checker · 100%
low
Tool 'get_custom_rule' has no annotations annotation_checker · 100%
low
Tool 'test_custom_rule' has no annotations annotation_checker · 100%
low
Tool 'update_custom_rule' has no annotations annotation_checker · 100%
low
Tool 'list_custom_rules' has no annotations annotation_checker · 100%
low
Tool 'list_usage' has no annotations annotation_checker · 100%
low
Tool 'get_usage_summary' has no annotations annotation_checker · 100%
low
Tool 'list_balance_history' has no annotations annotation_checker · 100%
low
Tool 'get_billing_summary' has no annotations annotation_checker · 100%
low
Tool 'list_campaign_runs' has no annotations annotation_checker · 100%
low
Tool 'update_campaign' has no annotations annotation_checker · 100%
low
Tool 'create_campaign' has no annotations annotation_checker · 100%
low
Tool 'list_campaigns_picker' has no annotations annotation_checker · 100%
low
Tool 'list_campaigns' has no annotations annotation_checker · 100%
low
Tool 'archive_campaign' has no annotations annotation_checker · 100%
low
Tool 'get_campaign' has no annotations annotation_checker · 100%
low
Tool 'run_campaign' has no annotations annotation_checker · 100%
low
Tool 'unarchive_campaign' has no annotations annotation_checker · 100%
low
Tool 'cancel_campaign' has no annotations annotation_checker · 100%
low
Tool 'get_scan_landing_screenshot' has no annotations annotation_checker · 100%
low
Tool 'get_scan_creative_video' has no annotations annotation_checker · 100%
low
Tool 'get_scan_creative_screenshot' has no annotations annotation_checker · 100%
low
Tool 'get_scan_creative_html' has no annotations annotation_checker · 100%
low
Tool 'create_bulk_scans' has no annotations annotation_checker · 100%
low
Tool 'list_scans' has no annotations annotation_checker · 100%
low
Tool 'list_scan_children' has no annotations annotation_checker · 100%
low
Tool 'get_scan_vast_xml' has no annotations annotation_checker · 100%
low
Tool 'create_scan' has no annotations annotation_checker · 100%
low
Tool 'recheck_scans' has no annotations annotation_checker · 100%
low
Tool 'get_scan' has no annotations annotation_checker · 100%
low
Tool 'cancel_scan' has no annotations annotation_checker · 100%
low
Tool 'get_scan_screenshot' has no annotations annotation_checker · 100%
low
Tool 'list_geos' has no annotations annotation_checker · 100%
medium
OAuth implementation without PKCE auth_checker · 75%
info
Sandbox failed to start for behavioral verification behavioral_verifier · 100%
info
package.json metadata manifest_parser · 100%
info
Tool: list_emulators manifest_parser · 90%
info
Tool: update_org manifest_parser · 90%
info
Tool: revoke_api_key manifest_parser · 90%
info
Tool: remove_user manifest_parser · 90%
info
Tool: update_user_role manifest_parser · 90%
info
Tool: list_org_users manifest_parser · 90%
info
Tool: list_account_labels manifest_parser · 90%
info
Tool: create_api_key manifest_parser · 90%
info
Tool: invite_user manifest_parser · 90%
info
Tool: get_account manifest_parser · 90%
info
Tool: list_org_roles manifest_parser · 90%
info
Tool: transfer_ownership manifest_parser · 90%
info
Tool: list_api_keys manifest_parser · 90%
info
Tool: create_custom_role manifest_parser · 90%
info
Tool: update_account_labels manifest_parser · 90%
info
Tool: delete_tag_definition manifest_parser · 90%
info
Tool: get_tag_definition manifest_parser · 90%
info
Tool: list_tags manifest_parser · 90%
info
Tool: update_tag_definition manifest_parser · 90%
info
Tool: list_scan_tags manifest_parser · 90%
info
Tool: parse_custom_taxonomy_text manifest_parser · 90%
info
Tool: restore_custom_taxonomy manifest_parser · 90%
info
Tool: get_custom_taxonomy manifest_parser · 90%
info
Tool: list_custom_taxonomies manifest_parser · 90%
info
Tool: create_custom_taxonomy manifest_parser · 90%
info
Tool: delete_custom_taxonomy manifest_parser · 90%
info
Tool: update_custom_taxonomy manifest_parser · 90%
info
Tool: cancel_run manifest_parser · 90%
info
Tool: get_run manifest_parser · 90%
info
Tool: list_run_scans manifest_parser · 90%
info
Tool: bulk_update_alert_status manifest_parser · 90%
info
Tool: get_alert_stats manifest_parser · 90%
info
Tool: update_alert_status manifest_parser · 90%
info
Tool: list_alerts manifest_parser · 90%
info
Tool: set_default_policy_set manifest_parser · 90%
info
Tool: request_policy_set_approval manifest_parser · 90%
info
Tool: list_policy_sets manifest_parser · 90%
info
Tool: update_policy_set manifest_parser · 90%
info
Tool: list_policy_set_campaigns manifest_parser · 90%
info
Tool: create_policy_set manifest_parser · 90%
info
Tool: get_policy_set manifest_parser · 90%
info
Tool: delete_policy_set manifest_parser · 90%
info
Tool: unpublish_policy_set manifest_parser · 90%
info
Tool: detach_policy_set_campaigns manifest_parser · 90%
info
Tool: attach_policy_set_campaigns manifest_parser · 90%
info
Tool: get_webhook manifest_parser · 90%
info
Tool: create_webhook manifest_parser · 90%
info
Tool: list_webhook_deliveries manifest_parser · 90%
info
Tool: rotate_webhook_secret manifest_parser · 90%
info
Tool: test_webhook manifest_parser · 90%
info
Tool: replay_webhook_delivery manifest_parser · 90%
info
Tool: list_webhooks manifest_parser · 90%
info
Tool: bulk_replay_webhook manifest_parser · 90%
info
Tool: update_webhook manifest_parser · 90%
info
Tool: list_webhook_event_types manifest_parser · 90%
info
Tool: delete_webhook manifest_parser · 90%
info
Tool: get_invoice_pdf manifest_parser · 90%
info
Tool: list_invoices manifest_parser · 90%
info
Tool: resume_campaign_group_schedule manifest_parser · 90%
info
Tool: unarchive_campaign_group manifest_parser · 90%
info
Tool: get_campaign_group manifest_parser · 90%
info
Tool: create_campaign_group manifest_parser · 90%
info
Tool: run_campaign_group manifest_parser · 90%
info
Tool: cancel_campaign_group manifest_parser · 90%
info
Tool: update_campaign_group manifest_parser · 90%
info
Tool: list_campaign_groups manifest_parser · 90%
info
Tool: pause_campaign_group_schedule manifest_parser · 90%
info
Tool: archive_campaign_group manifest_parser · 90%
info
Tool: get_proxy_targeting manifest_parser · 90%
info
Tool: set_campaign_alert_overrides manifest_parser · 90%
info
Tool: get_campaign_alert_overrides manifest_parser · 90%
info
Tool: list_alert_destinations manifest_parser · 90%
info
Tool: delete_alert_destination manifest_parser · 90%
info
Tool: set_alert_destination_version manifest_parser · 90%
info
Tool: create_custom_rule manifest_parser · 90%
info
Tool: delete_custom_rule manifest_parser · 90%
info
Tool: get_custom_rule manifest_parser · 90%
info
Tool: test_custom_rule manifest_parser · 90%
info
Tool: update_custom_rule manifest_parser · 90%
info
Tool: list_custom_rules manifest_parser · 90%
info
Tool: list_usage manifest_parser · 90%
info
Tool: get_usage_summary manifest_parser · 90%
info
Tool: list_balance_history manifest_parser · 90%
info
Tool: get_billing_summary manifest_parser · 90%
info
Tool: list_campaign_runs manifest_parser · 90%
info
Tool: update_campaign manifest_parser · 90%
info
Tool: create_campaign manifest_parser · 90%
info
Tool: list_campaigns_picker manifest_parser · 90%
info
Tool: list_campaigns manifest_parser · 90%
info
Tool: archive_campaign manifest_parser · 90%
info
Tool: get_campaign manifest_parser · 90%
info
Tool: run_campaign manifest_parser · 90%
info
Tool: unarchive_campaign manifest_parser · 90%
info
Tool: cancel_campaign manifest_parser · 90%
info
Tool: get_scan_landing_screenshot manifest_parser · 90%
info
Tool: get_scan_creative_video manifest_parser · 90%
info
Tool: get_scan_creative_screenshot manifest_parser · 90%
info
Tool: get_scan_creative_html manifest_parser · 90%
info
Tool: create_bulk_scans manifest_parser · 90%
info
Tool: list_scans manifest_parser · 90%
info
Tool: list_scan_children manifest_parser · 90%
info
Tool: get_scan_vast_xml manifest_parser · 90%
info
Tool: create_scan manifest_parser · 90%
info
Tool: recheck_scans manifest_parser · 90%
info
Tool: get_scan manifest_parser · 90%
info
Tool: cancel_scan manifest_parser · 90%
info
Tool: get_scan_screenshot manifest_parser · 90%
info
Tool: list_geos manifest_parser · 90%
info
Transport: streamable-http manifest_parser · 80%
info
Required env vars (6) manifest_parser · 80%
info
Sandbox failed to start for output poisoning scan output_poisoning · 100%
medium
Permission: network access detected permission_analyzer · 70%
high
Permission: shell access detected permission_analyzer · 95%
low
Permission: env_vars access detected permission_analyzer · 90%
critical
Tool poisoning in 'get_proxy_targeting': Cross-tool sequencing directive poisoning · 85%
info
SBOM generated: 702 components sbom_generator · 100%
medium
No build provenance detected (SLSA L0) slsa_assessor · 90%