@kaminari-ad/mcp 0.11.0 → 0.12.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,48 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.12.0] - 2026-08-07
11
+
12
+ ### Security
13
+
14
+ - **Bump `undici` 8.5.0 to 8.10.0** to clear the npm-audit gate after the
15
+ upstream disclosure of one high-severity advisory
16
+ (GHSA-4cwx-7wf7-3272 — a malformed `private` Cache-Control directive
17
+ makes a shared cache store a per-user response and serve it to other
18
+ users) and four medium ones (GHSA-jr45-8vmc-qm54,
19
+ GHSA-m8rv-5g2x-5cg5, GHSA-8xcm-r25x-g524, GHSA-v3r7-h72x-cjcm). All
20
+ five are fixed in 8.9.0. `undici` is a direct dependency.
21
+
22
+ ### Changed
23
+
24
+ - **Requires api >= v1.33.0 for the webhook tools.** The regenerated zod
25
+ schemas make `failing_since` and `paused_until` required on
26
+ `EndpointHealthResponse`, and the webhook parser picks the whole nested
27
+ `health` object, so against an older API every webhook tool
28
+ (`list_webhooks`, `get_webhook`, `create_webhook`, `update_webhook`,
29
+ `rotate_webhook_secret`) fails with
30
+ `upstream: malformed webhook: health.failing_since: Invalid input`.
31
+ - **README tool list matches the registry again.** It documented 83 tools
32
+ and had drifted 15 behind: the custom-taxonomy domain, the three
33
+ screenshot fetchers, `get_invoice_pdf`, `list_scan_children`,
34
+ `create_custom_role`, and the two account-label tools were all
35
+ registered but undocumented — and the screenshot fetchers and invoice
36
+ PDF were still listed as deliberately not exposed.
37
+ - **`get_alert_stats` counts all time.** The API used to count only the last
38
+ 30 days when no dates were given, while `list_alerts` listed all time, so
39
+ the four buckets never summed to the list's `total`. The API now defaults
40
+ both to all time; the tool description says so, so a model comparing the
41
+ two no longer has to guess which window it got. Requires the API deploy
42
+ that ships the new default — against an older API the counts still cover
43
+ 30 days.
44
+ - **Regenerated `/api/v1` types and zod schemas.** Picks up the new alert
45
+ filters (`policy_set_id`, `tag`, `country_code`, `date_from`, `date_to`,
46
+ `timezone` on list + stats, and the matching `filter_*` fields on
47
+ bulk-status), `policy_set_name` on `AlertResponse`, plus drift that had
48
+ accumulated since the last regen: `last_run_at` on campaign groups,
49
+ campaign/group date filters, and `failing_since` / `paused_until` on
50
+ webhook endpoint health.
51
+
10
52
  ## [0.11.0] - 2026-07-28
11
53
 
12
54
  ### Added
@@ -983,7 +1025,16 @@ Initial public release. The first version that ships to npm under
983
1025
  need them.
984
1026
  - Invoice PDF fetcher — same reason.
985
1027
 
986
- [Unreleased]: https://github.com/kaminari-ad/mcp/compare/v0.2.1...HEAD
1028
+ [Unreleased]: https://github.com/kaminari-ad/mcp/compare/v0.12.0...HEAD
1029
+ [0.12.0]: https://github.com/kaminari-ad/mcp/compare/v0.11.0...v0.12.0
1030
+ [0.11.0]: https://github.com/kaminari-ad/mcp/compare/v0.10.0...v0.11.0
1031
+ [0.10.0]: https://github.com/kaminari-ad/mcp/compare/v0.8.0...v0.10.0
1032
+ [0.8.0]: https://github.com/kaminari-ad/mcp/compare/v0.6.0...v0.8.0
1033
+ [0.6.0]: https://github.com/kaminari-ad/mcp/compare/v0.5.2...v0.6.0
1034
+ [0.5.2]: https://github.com/kaminari-ad/mcp/compare/v0.5.0...v0.5.2
1035
+ [0.5.0]: https://github.com/kaminari-ad/mcp/compare/v0.3.0...v0.5.0
1036
+ [0.3.0]: https://github.com/kaminari-ad/mcp/compare/v0.2.2...v0.3.0
1037
+ [0.2.2]: https://github.com/kaminari-ad/mcp/compare/v0.2.1...v0.2.2
987
1038
  [0.2.1]: https://github.com/kaminari-ad/mcp/compare/v0.2.0...v0.2.1
988
1039
  [0.2.0]: https://github.com/kaminari-ad/mcp/compare/v0.1.5...v0.2.0
989
1040
  [0.1.5]: https://github.com/kaminari-ad/mcp/compare/v0.1.0...v0.1.5
package/README.md CHANGED
@@ -63,7 +63,7 @@ Add to your MCP client config (Cursor: `~/.cursor/mcp.json`; Claude Desktop: `~/
63
63
  }
64
64
  ```
65
65
 
66
- Restart your client. You should see `kaminari-ad` in the MCP servers list with 83 tools exposed.
66
+ Restart your client. You should see `kaminari-ad` in the MCP servers list with 98 tools exposed.
67
67
 
68
68
  ### 2b. Hosted HTTP transport (no install)
69
69
 
@@ -113,24 +113,27 @@ which decides which credential type minted it.
113
113
 
114
114
  ## Tools
115
115
 
116
- 83 tools mirroring most of 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. Highlights:
116
+ 98 tools mirroring most of 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:
117
117
 
118
- - **Account** (11) — `get_account`, `update_org`, `list_org_users`, `invite_user`, `update_user_role`, `remove_user`, `transfer_ownership`, `list_org_roles`, `list_api_keys`, `create_api_key`, `revoke_api_key`
119
- - **Scans** (6) — `list_scans`, `get_scan`, `create_scan`, `create_bulk_scans`, `recheck_scans`, `cancel_scan`
118
+ - **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`
119
+ - **Scans** (10) — `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`
120
120
  - **Campaigns** (10) — `list_campaigns`, `list_campaigns_picker`, `get_campaign`, `create_campaign`, `update_campaign`, `archive_campaign`, `unarchive_campaign`, `cancel_campaign`, `run_campaign`, `list_campaign_runs`
121
121
  - **Campaign groups** (10) — list/get/create/update/run/cancel/archive/unarchive + `pause_campaign_group_schedule`, `resume_campaign_group_schedule`
122
122
  - **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)
123
123
  - **Tags** (5) — `list_tags`, `get_tag_definition`, `update_tag_definition`, `delete_tag_definition`, `list_scan_tags`
124
124
  - **Custom rules** (6) — `list_custom_rules`, `get_custom_rule`, `create_custom_rule`, `update_custom_rule`, `delete_custom_rule`, `test_custom_rule`
125
+ - **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`
125
126
  - **Policy sets** (6) — `list_policy_sets`, `get_policy_set`, `create_policy_set`, `update_policy_set`, `delete_policy_set`, `request_policy_set_approval`
126
127
  - **Alerts** (3) — `list_alerts`, `update_alert_status`, `get_alert_stats`
127
128
  - **Webhooks** (11) — `list_webhooks`, `get_webhook`, `create_webhook`, `update_webhook`, `delete_webhook`, `list_webhook_event_types`, `list_webhook_deliveries`, `test_webhook`, `rotate_webhook_secret`, `replay_webhook_delivery`, `bulk_replay_webhook`
128
129
  - **Billing** (4) — `get_billing_summary`, `list_usage`, `get_usage_summary`, `list_balance_history`
129
- - **Invoicing** (1) — `list_invoices`
130
+ - **Invoicing** (2) — `list_invoices`, `get_invoice_pdf`
130
131
  - **Alert notifications** (5) — `list_alert_destinations`, `delete_alert_destination`, `set_alert_destination_version`, `get_campaign_alert_overrides`, `set_campaign_alert_overrides`
131
132
  - **Reference data** (2) — `list_geos`, `list_emulators`
132
133
 
133
- Not exposed (intentionally): binary scan-screenshot fetchers, invoice PDF, and the public marketing forms (`/contact`, `/demo-inquiries`). Open an issue if you need one of those.
134
+ Screenshots (`get_scan_screenshot`, `get_scan_creative_screenshot`, `get_scan_landing_screenshot`) come back as inline MCP `image` blocks and `get_invoice_pdf` as an inline resource block no second fetch, no presigned URL.
135
+
136
+ Not exposed (intentionally): the raw creative artifacts (`creative-html`, `creative-video`, `vast-xml`) and the public marketing forms (`/contact`, `/demo-inquiries`). Open an issue if you need one of those.
134
137
 
135
138
  ## Example agent prompts
136
139
 
package/dist/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { NAME, VERSION, err, ok } from './chunk-XSI6SZTX.js';
2
+ import { NAME, VERSION, err, ok } from './chunk-TMUGAKI2.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-QK4ENRPP.js');
163
+ const { bootstrapStdio } = await import('./stdio-bootstrap-JW6I4H3U.js');
164
164
  return bootstrapStdio(config);
165
165
  }
166
- const { bootstrapHttp } = await import('./http-bootstrap-XJNTLL2C.js');
166
+ const { bootstrapHttp } = await import('./http-bootstrap-Y4YKT7KV.js');
167
167
  return bootstrapHttp(config);
168
168
  }
169
169
  main().then(
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { err, ok } from './chunk-XSI6SZTX.js';
2
+ import { err, ok } from './chunk-TMUGAKI2.js';
3
3
  import { createHash, randomUUID } from 'crypto';
4
4
  import createClient from 'openapi-fetch';
5
5
  import { fetch } from 'undici';
@@ -471,7 +471,8 @@ var CampaignGroupResponse = z.object({
471
471
  is_archived: z.boolean(),
472
472
  schedule_paused: z.boolean(),
473
473
  created_at: z.string().datetime({ offset: true }),
474
- campaign_count: z.union([z.number(), z.null()]).optional()
474
+ campaign_count: z.union([z.number(), z.null()]).optional(),
475
+ last_run_at: z.union([z.string(), z.null()]).optional()
475
476
  }).passthrough();
476
477
  z.object({ name: z.union([z.string(), z.null()]) }).partial().passthrough();
477
478
  var BulkCampaignFailure = z.object({
@@ -867,6 +868,7 @@ var AlertResponse = z.object({
867
868
  scan_url: z.string(),
868
869
  offer_url: z.string(),
869
870
  tag_display_name: z.string(),
871
+ policy_set_name: z.union([z.string(), z.null()]).optional(),
870
872
  rule_type: z.string().optional().default("tag"),
871
873
  matched_value: z.union([z.string(), z.null()]).optional()
872
874
  }).passthrough();
@@ -883,7 +885,13 @@ z.object({
883
885
  ids: z.union([z.array(z.string().uuid()), z.null()]).optional(),
884
886
  all_matching: z.boolean().optional().default(false),
885
887
  filter_status: z.union([AlertStatus, z.null()]).optional(),
886
- filter_campaign_id: z.union([z.string(), z.null()]).optional()
888
+ filter_campaign_id: z.union([z.string(), z.null()]).optional(),
889
+ filter_policy_set_ids: z.union([z.array(z.string().uuid()), z.null()]).optional(),
890
+ filter_tag_slugs: z.union([z.array(z.string()), z.null()]).optional(),
891
+ filter_country_codes: z.union([z.array(z.string()), z.null()]).optional(),
892
+ filter_date_from: z.union([z.string(), z.null()]).optional(),
893
+ filter_date_to: z.union([z.string(), z.null()]).optional(),
894
+ filter_timezone: z.union([z.string(), z.null()]).optional()
887
895
  }).passthrough();
888
896
  z.object({ updated: z.number().int(), skipped: z.number().int() }).passthrough();
889
897
  var AlertStatsResponse = z.object({
@@ -974,7 +982,9 @@ var EndpointHealthResponse = z.object({
974
982
  consecutive_failures: z.number().int(),
975
983
  last_delivery_at: z.union([z.string(), z.null()]),
976
984
  last_delivery_status: z.union([z.number(), z.null()]),
977
- success_rate_7d: z.number()
985
+ success_rate_7d: z.number(),
986
+ failing_since: z.union([z.string(), z.null()]),
987
+ paused_until: z.union([z.string(), z.null()])
978
988
  }).passthrough();
979
989
  var WebhookResponse = z.object({
980
990
  id: z.string().uuid(),
@@ -3187,7 +3197,7 @@ var setCampaignAlertOverridesTool = {
3187
3197
  var GetAlertStatsInputShape = {};
3188
3198
  var getAlertStatsTool = {
3189
3199
  name: "get_alert_stats",
3190
- description: "Get alert counts grouped by status: open, escalated, resolved, dismissed (total is implicit in the sum). Status names match the canonical AlertStatus enum used by `list_alerts` and `update_alert_status`.",
3200
+ description: "Get alert counts grouped by status: open, escalated, resolved, dismissed. Counts cover the caller's organization over all time and are not filtered, so the four sum to the `total` an unfiltered `list_alerts` reports. Status names match the canonical AlertStatus enum used by `list_alerts` and `update_alert_status`.",
3191
3201
  annotations: {
3192
3202
  title: "Get Alert Stats",
3193
3203
  readOnlyHint: true,
@@ -5649,5 +5659,5 @@ function formatToolError(error) {
5649
5659
  }
5650
5660
 
5651
5661
  export { BearerToken, SERVER_INSTRUCTIONS, createHttpApiGateway, createPinoLogger, declareEmptyResourcesAndPrompts, newRequestId, wireToolsIntoMcpServer };
5652
- //# sourceMappingURL=chunk-XCAKB2QW.js.map
5653
- //# sourceMappingURL=chunk-XCAKB2QW.js.map
5662
+ //# sourceMappingURL=chunk-T6GEYHLP.js.map
5663
+ //# sourceMappingURL=chunk-T6GEYHLP.js.map