Skip to content

Commit 57c949e

Browse files
committed
feat: add webhook receiver helpers
1 parent cf51a9c commit 57c949e

19 files changed

Lines changed: 1043 additions & 37 deletions

ASC-COVERAGE-MATRIX-2026-05-05.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Source baseline:
99

1010
Update 2026-05-07: automated OpenAPI coverage tooling is now available. See `ASC-OPENAPI-COVERAGE-GENERATED.md` for the generated Apple 4.3 path/operation matrix.
1111
Update 2026-05-08: accessibility declaration management is covered by `accessibility_*` tools.
12+
Update 2026-05-08: local webhook receiver helpers are available for signature verification, payload parsing, and event/delivery triage.
1213

1314
This matrix tracks current `asc-mcp` coverage against the official App Store Connect API documentation. It is intentionally product-oriented: it names what users can do today, what is missing, and which additions should come first.
1415

@@ -18,7 +19,7 @@ P0 additions:
1819
- App Clips, background assets, app tags, routing app coverages, and customer review summaries.
1920

2021
P1 additions:
21-
- Webhook receiver-side signature verification, event payload decoder, and triage resources/prompts.
22+
- Hosted webhook receiver templates and reusable triage resources/prompts.
2223
- Merchant IDs and Pass Type IDs under provisioning.
2324
- Analytics/customer-review summarization and metric recommendation ergonomics.
2425

@@ -29,8 +30,8 @@ P1 additions:
2930
| Essentials: auth, errors, paging, uploads, rate limits | Partial | P1 | `auth` | API key inventory/revocation helpers |
3031
| App Store app metadata and release operations | Partial | P0 | `apps`, `accessibility`, `versions`, `app_info`, `pricing`, `app_events`, `screenshots`, `custom_pages`, `ppo`, `promoted`, `review_attachments`, `reviews` | App Clips; background assets; app tags; routing app coverages; customer review summary endpoint |
3132
| TestFlight builds, testers, groups, and beta app review | Partial | P0 | `builds`, `build_processing`, `build_beta`, `beta_groups`, `beta_feedback`, `beta_testers`, `beta_app`, `pre_release`, `beta_license` | beta recruitment criteria; beta app clip invocation/localization APIs |
32-
| Webhook notifications | Covered | P2 | `webhooks` | OpenAPI drift checks and receiver-side helper ergonomics |
33-
| Webhook notification receiver resources | Missing | P1 | none | signature verification helpers; event payload decoder; prompt/resource templates for event triage |
33+
| Webhook notifications | Covered | P2 | `webhooks` | OpenAPI drift checks and hosted receiver examples |
34+
| Webhook notification receiver resources | Partial | P1 | `webhooks` | hosted receiver server templates; prompt/resource templates for event triage |
3435
| In-app purchases, subscriptions, and offers | Covered | P2 | `iap`, `subscriptions`, `offer_codes`, `winback`, `intro_offers`, `promo_offers` | OpenAPI drift checks and schema tightening |
3536
| Provisioning and identifiers | Partial | P1 | `provisioning` | merchant IDs; pass type IDs |
3637
| Users, access, and sandbox testers | Partial | P2 | `users`, `sandbox` | API key inventory helpers; API key revocation workflow |
@@ -43,7 +44,7 @@ P1 additions:
4344

4445
1. Add `--read-only` runtime guard so static and live validation can run safely in production-like MCP hosts.
4546
2. Update `AppsWorker` for app-level `accessibilityUrl` if Apple keeps it as a separate app metadata field outside declaration resources.
46-
3. Add webhook receiver helpers: signature verification, event payload decoder, and triage prompts/resources.
47+
3. Add reusable webhook receiver playbooks and optional hosted receiver templates around the new local helper tools.
4748
4. Add merchant/pass identifiers, App Clips, background assets, Game Center, and alternative distribution as larger domain workers.
4849

4950
## Safety Notes

ASC-OPENAPI-COVERAGE-GENERATED.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ Unclassified paths: 0
3131
| Essentials: auth, errors, paging, uploads, rate limits | Partial | P1 | 0 | 0 | `auth` | Core runtime behavior is covered; OpenAPI drift is now generated from Apple's official specification. |
3232
| Provisioning and identifiers | Partial | P1 | 32 | 49 | `provisioning` | Core signing automation exists; Wallet and Apple Pay identifiers are useful next additions. |
3333
| Reporting, analytics, metrics, and diagnostics | Partial | P1 | 47 | 56 | `analytics`, `metrics` | Read-heavy workflows are safe and valuable; summaries and recommendations are high UX leverage. |
34-
| Webhook notification receiver resources | Missing | P1 | 0 | 0 | none | The App Store Connect management API is covered; receiver-side helpers are local MCP value-add and should not call Apple. |
34+
| Webhook notification receiver resources | Partial | P1 | 0 | 0 | `webhooks` | Local receiver helpers are now available and remain read-only; future work can add deployable receiver templates and reusable playbooks. |
3535
| Xcode Cloud workflows and builds | Partial | P1 | 56 | 59 | `xcode_cloud` | Covers read-heavy CI dashboards plus start/rebuild build runs; destructive workflow/product management remains intentionally deferred. |
3636
| Alternative distribution | Missing | P2 | 21 | 28 | none | Region- and entitlement-sensitive APIs should be opt-in and strongly documented. |
3737
| Game Center | Missing | P2 | 238 | 337 | none | Large domain; should be added only after OpenAPI-driven scaffolding is in place. |
3838
| In-app purchases, subscriptions, and offers | Covered | P2 | 129 | 163 | `iap`, `subscriptions`, `offer_codes`, `winback`, `intro_offers`, `promo_offers` | Coverage is broad enough for production workflows; future work is mostly schema tightening and OpenAPI drift checks. |
3939
| Users, access, and sandbox testers | Partial | P2 | 13 | 20 | `users`, `sandbox` | User management is serviceable; API key operations should remain carefully annotated as high-risk. |
40-
| Webhook notifications | Covered | P2 | 6 | 8 | `webhooks` | Covers app webhooks, individual webhook reads, create/update/delete, delivery listing, redelivery, and ping testing. |
40+
| Webhook notifications | Covered | P2 | 6 | 8 | `webhooks` | Covers app webhooks, individual webhook reads, create/update/delete, delivery listing, redelivery, ping testing, and local receiver diagnostics. |
4141

4242
## Missing Apple Domains
4343

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [2.4.0] - 2026-05-08
11+
12+
### Added
13+
14+
- Local webhook receiver helpers: `webhooks_verify_signature`, `webhooks_parse_payload`, and `webhooks_triage_event` for HMAC validation, payload normalization, and actionable event/delivery triage without calling App Store Connect.
15+
16+
### Changed
17+
18+
- README worker counts, webhook tool docs, and coverage matrix now reflect 348 tools across 36 worker domains.
19+
1020
## [2.3.0] - 2026-05-08
1121

1222
### Added

README.md

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
## Overview
3131

32-
**asc-mcp** is a Swift-based MCP server that bridges [Claude](https://claude.ai) (or any MCP-compatible host) with the [App Store Connect API](https://developer.apple.com/documentation/appstoreconnectapi). It exposes **345 tools** across 36 worker domains, enabling you to automate your entire iOS/macOS release workflow through natural language.
32+
**asc-mcp** is a Swift-based MCP server that bridges [Claude](https://claude.ai) (or any MCP-compatible host) with the [App Store Connect API](https://developer.apple.com/documentation/appstoreconnectapi). It exposes **348 tools** across 36 worker domains, enabling you to automate your entire iOS/macOS release workflow through natural language.
3333

3434
### Key capabilities
3535

@@ -43,6 +43,7 @@
4343
- **Provisioning** — bundle IDs, devices, certificates, profiles, capabilities
4444
- **Marketing** — screenshots, app previews, custom product pages, A/B testing (PPO), promoted purchases
4545
- **Accessibility declarations** — manage App Store accessibility support declarations by device family
46+
- **Webhooks** — manage webhook configurations, inspect delivery diagnostics, verify signatures, parse payloads, and triage events
4647
- **Analytics & Metrics** — sales/financial reports, analytics reports, performance metrics, diagnostics
4748
- **Metadata management** — localized descriptions, keywords, What's New across all locales
4849
- **MCP 2025-11-25 surface** — tool annotations, output schemas for stable tools, structured JSON results, and safe result-size metadata
@@ -53,7 +54,7 @@
5354
```bash
5455
# 1. Install via Mint
5556
brew install mint
56-
mint install zelentsov-dev/asc-mcp@v2.3.0
57+
mint install zelentsov-dev/asc-mcp@v2.4.0
5758

5859
# 2. Add to Claude Code with env vars (simplest setup)
5960
claude mcp add asc-mcp \
@@ -85,7 +86,7 @@ Or use a JSON config file — see [Configuration](#configuration) below.
8586
brew install mint
8687

8788
# Install asc-mcp from GitHub
88-
mint install zelentsov-dev/asc-mcp@v2.3.0
89+
mint install zelentsov-dev/asc-mcp@v2.4.0
8990

9091
# Register in Claude Code
9192
claude mcp add asc-mcp -- ~/.mint/bin/asc-mcp
@@ -96,13 +97,13 @@ To install a specific branch or tag:
9697
```bash
9798
mint install zelentsov-dev/asc-mcp@main # main branch
9899
mint install zelentsov-dev/asc-mcp@develop # develop branch
99-
mint install zelentsov-dev/asc-mcp@v2.3.0 # specific tag
100+
mint install zelentsov-dev/asc-mcp@v2.4.0 # specific tag
100101
```
101102

102103
To update to the latest version:
103104

104105
```bash
105-
mint install zelentsov-dev/asc-mcp@v2.3.0 --force
106+
mint install zelentsov-dev/asc-mcp@v2.4.0 --force
106107
```
107108

108109
### Option B: Build from Source
@@ -362,7 +363,7 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
362363
}
363364
```
364365
365-
> **Note:** Windsurf has a 100-tool limit. The server exposes 345 tools by default, so you must use `--workers` to select a subset. See [Worker Filtering](#worker-filtering) below.
366+
> **Note:** Windsurf has a 100-tool limit. The server exposes 348 tools by default, so you must use `--workers` to select a subset. See [Worker Filtering](#worker-filtering) below.
366367
367368
</details>
368369
@@ -371,7 +372,7 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
371372
372373
### Worker Filtering
373374
374-
The server exposes **345 tools** across 36 worker domains. Some MCP clients impose a tool limit (e.g., Windsurf caps at 100). Use `--workers` to enable only the workers you need:
375+
The server exposes **348 tools** across 36 worker domains. Some MCP clients impose a tool limit (e.g., Windsurf caps at 100). Use `--workers` to enable only the workers you need:
375376
376377
```bash
377378
# Only load apps, builds, and version lifecycle tools
@@ -397,7 +398,7 @@ asc-mcp --read-only
397398
asc-mcp --read-only --workers apps,builds,reviews,analytics
398399
```
399400
400-
In this mode, read tools such as `*_list`, `*_get`, `*_search`, `*_status`, `auth_*`, analytics, and metrics remain available. Tools that can create, update, upload, submit, release, delete, revoke, clear, cancel, or otherwise mutate App Store Connect are blocked before their worker handler runs. `company_switch` remains available because it changes only the local active company context.
401+
In this mode, read tools such as `*_list`, `*_get`, `*_search`, `*_status`, `*_verify`, `*_parse`, `*_triage`, `auth_*`, analytics, and metrics remain available. Tools that can create, update, upload, submit, release, delete, revoke, clear, cancel, or otherwise mutate App Store Connect are blocked before their worker handler runs. `company_switch` remains available because it changes only the local active company context.
401402
402403
### OpenAPI Drift Tooling
403404
@@ -425,7 +426,7 @@ The generated report records Apple spec metadata, path and operation counts, dom
425426
| `auth` | `auth_` | 4 | JWT token tools |
426427
| `apps` | `apps_` | 9 | App listing, metadata, localizations |
427428
| `accessibility` | `accessibility_` | 6 | App Store accessibility declarations |
428-
| `webhooks` | `webhooks_` | 8 | Webhook notifications and deliveries |
429+
| `webhooks` | `webhooks_` | 11 | Webhook notifications, delivery diagnostics, and receiver helpers |
429430
| `xcode_cloud` | `xcode_cloud_` | 30 | Xcode Cloud products, workflows, build runs, artifacts, issues, test results, and SCM |
430431
| `builds` | `builds_` | 4 | Build management |
431432
| `build_processing` | `builds_get_processing_*`, `builds_update_encryption`, `builds_check_readiness` | 4 | Build states, encryption |
@@ -464,7 +465,7 @@ When connected to an LLM client, tool definitions consume context tokens. Here's
464465
465466
| Configuration | Tools | ~Tokens |
466467
|---|---:|---:|
467-
| All workers (default) | 345 | **~39,000** |
468+
| All workers (default) | 348 | **~39,400** |
468469
| Release workflow: `apps,builds,versions,reviews` | ~57 | ~7,000 |
469470
| Monetization: `apps,iap,subscriptions,pricing` | ~78 | ~9,000 |
470471
| TestFlight: `apps,builds,beta_groups,beta_testers` | ~56 | ~6,000 |
@@ -473,11 +474,11 @@ When connected to an LLM client, tool definitions consume context tokens. Here's
473474
474475
**Heaviest workers:** Xcode Cloud (30 tools), Subscriptions (29 tools), InAppPurchases (24 tools), Provisioning (17 tools), Screenshots (16 tools).
475476
476-
For Claude (200K context) ~39K tokens is about 20% of the window. For clients with smaller context windows, use `--workers` to reduce the footprint.
477+
For Claude (200K context) ~39.4K tokens is about 20% of the window. For clients with smaller context windows, use `--workers` to reduce the footprint.
477478
478479
## Available Tools
479480
480-
**345 tools** organized across 36 worker domains (use `--workers` to filter — see [Worker Filtering](#worker-filtering)):
481+
**348 tools** organized across 36 worker domains (use `--workers` to filter — see [Worker Filtering](#worker-filtering)):
481482
482483
<details>
483484
<summary><strong>Company Management</strong> — 3 tools</summary>
@@ -534,7 +535,7 @@ For Claude (200K context) ~39K tokens is about 20% of the window. For clients wi
534535
</details>
535536
536537
<details>
537-
<summary><strong>Webhook Notifications</strong>8 tools</summary>
538+
<summary><strong>Webhook Notifications</strong>11 tools</summary>
538539
539540
| Tool | Description |
540541
|------|-------------|
@@ -546,6 +547,9 @@ For Claude (200K context) ~39K tokens is about 20% of the window. For clients wi
546547
| `webhooks_list_deliveries` | List delivery attempts |
547548
| `webhooks_redeliver` | Redeliver an existing delivery |
548549
| `webhooks_ping` | Send a test ping |
550+
| `webhooks_verify_signature` | Verify `x-apple-signature` against the exact raw payload body |
551+
| `webhooks_parse_payload` | Parse and normalize a raw webhook notification payload |
552+
| `webhooks_triage_event` | Produce an actionable triage plan for webhook events or delivery failures |
549553
550554
</details>
551555

SECURITY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
| Version | Supported |
66
|---------|-----------|
7+
| 2.4.x | Yes |
78
| 2.3.x | Yes |
89
| 2.2.x | Yes |
910
| 2.1.x | Yes |

Sources/asc-mcp/Core/ASCCoverageInventory.swift

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,21 +134,24 @@ enum ASCCoverageInventory {
134134
"send webhook ping"
135135
],
136136
missingCapabilities: [],
137-
notes: "Covers app webhooks, individual webhook reads, create/update/delete, delivery listing, redelivery, and ping testing."
137+
notes: "Covers app webhooks, individual webhook reads, create/update/delete, delivery listing, redelivery, ping testing, and local receiver diagnostics."
138138
),
139139
ASCCoverageArea(
140140
name: "Webhook notification receiver resources",
141141
appleDocumentationURL: "https://developer.apple.com/documentation/appstoreconnectapi/webhook-notifications",
142-
status: .missing,
142+
status: .partial,
143143
priority: .p1,
144-
workerKeys: [],
145-
coveredCapabilities: [],
146-
missingCapabilities: [
147-
"receiver-side signature verification helpers",
144+
workerKeys: ["webhooks"],
145+
coveredCapabilities: [
146+
"receiver-side x-apple-signature verification",
148147
"webhook event payload decoder",
149-
"prompt/resource templates for event triage"
148+
"event and delivery triage recommendations"
149+
],
150+
missingCapabilities: [
151+
"hosted receiver server templates",
152+
"MCP prompt/resource templates for reusable event playbooks"
150153
],
151-
notes: "The App Store Connect management API is covered; receiver-side helpers are local MCP value-add and should not call Apple."
154+
notes: "Local receiver helpers are now available and remain read-only; future work can add deployable receiver templates and reusable playbooks."
152155
),
153156
ASCCoverageArea(
154157
name: "In-app purchases, subscriptions, and offers",

Sources/asc-mcp/Core/Application.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public func runApplication(options: AppRuntimeOptions = AppRuntimeOptions()) asy
4545
- auth_* — authentication
4646
- apps_* — app management and metadata
4747
- accessibility_* — App Store accessibility declarations by device family
48-
- webhooks_* — webhook notifications and delivery diagnostics
48+
- webhooks_* — webhook notifications, delivery diagnostics, signature verification, payload parsing, and triage
4949
- xcode_cloud_* — Xcode Cloud products, workflows, builds, artifacts, issues, test results, and SCM resources
5050
- builds_* — build management
5151
- app_versions_* — version lifecycle (create, submit, release)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Foundation
22

33
enum ServerVersion {
4-
static let current = "2.3.0"
4+
static let current = "2.4.0"
55
}

0 commit comments

Comments
 (0)