@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 +52 -1
- package/README.md +9 -6
- package/dist/bin.js +3 -3
- package/dist/{chunk-XCAKB2QW.js → chunk-T6GEYHLP.js} +17 -7
- package/dist/chunk-T6GEYHLP.js.map +1 -0
- package/dist/{chunk-XSI6SZTX.js → chunk-TMUGAKI2.js} +3 -3
- package/dist/{chunk-XSI6SZTX.js.map → chunk-TMUGAKI2.js.map} +1 -1
- package/dist/{http-bootstrap-XJNTLL2C.js → http-bootstrap-Y4YKT7KV.js} +4 -4
- package/dist/{http-bootstrap-XJNTLL2C.js.map → http-bootstrap-Y4YKT7KV.js.map} +1 -1
- package/dist/{stdio-bootstrap-QK4ENRPP.js → stdio-bootstrap-JW6I4H3U.js} +4 -4
- package/dist/{stdio-bootstrap-QK4ENRPP.js.map → stdio-bootstrap-JW6I4H3U.js.map} +1 -1
- package/package.json +6 -3
- package/dist/chunk-XCAKB2QW.js.map +0 -1
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.
|
|
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
|
|
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
|
-
|
|
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** (
|
|
119
|
-
- **Scans** (
|
|
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** (
|
|
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
|
-
|
|
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-
|
|
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-
|
|
163
|
+
const { bootstrapStdio } = await import('./stdio-bootstrap-JW6I4H3U.js');
|
|
164
164
|
return bootstrapStdio(config);
|
|
165
165
|
}
|
|
166
|
-
const { bootstrapHttp } = await import('./http-bootstrap-
|
|
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-
|
|
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
|
|
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-
|
|
5653
|
-
//# sourceMappingURL=chunk-
|
|
5662
|
+
//# sourceMappingURL=chunk-T6GEYHLP.js.map
|
|
5663
|
+
//# sourceMappingURL=chunk-T6GEYHLP.js.map
|