Skip to content

Commit ba98522

Browse files
committed
Merge branch 'develop'
2 parents 322295c + 8472df0 commit ba98522

22 files changed

Lines changed: 3014 additions & 292 deletions

README.md

Lines changed: 45 additions & 118 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 **348 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 **389 tools** across 32 worker domains, enabling you to automate your entire iOS/macOS release workflow through natural language.
3333

3434
### Key capabilities
3535

@@ -39,7 +39,7 @@
3939
- **Build management** — track processing, encryption compliance, readiness checks
4040
- **Customer reviews** — list, respond, update, delete responses, aggregate statistics
4141
- **In-app purchases** — CRUD for IAPs, localizations, price points, review screenshots
42-
- **Subscriptions** — subscription CRUD, groups, localizations, prices, offer codes, win-back offers
42+
- **Subscriptions** — subscription CRUD, groups, localizations, prices, availability, offer codes, win-back, intro, and promotional offers
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
@@ -363,7 +363,7 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
363363
}
364364
```
365365
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.
366+
> **Note:** Windsurf has a 100-tool limit. The server exposes 389 tools by default, so you must use `--workers` to select a subset. See [Worker Filtering](#worker-filtering) below.
367367
368368
</details>
369369
@@ -372,7 +372,7 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
372372
373373
### Worker Filtering
374374
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:
375+
The server exposes **389 tools** across 32 worker domains. Some MCP clients impose a tool limit (e.g., Windsurf caps at 100). Use `--workers` to enable only the workers you need:
376376
377377
```bash
378378
# Only load apps, builds, and version lifecycle tools
@@ -382,7 +382,7 @@ asc-mcp --workers apps,builds,versions
382382
asc-mcp --workers apps,accessibility,builds,versions,reviews,beta_groups,iap
383383
384384
# Monetization focus
385-
asc-mcp --workers apps,iap,subscriptions,offer_codes,winback,pricing,promoted
385+
asc-mcp --workers apps,iap,subscriptions,pricing,promoted
386386
```
387387
388388
`company` and `auth` workers are **always enabled** regardless of the filter (they provide core multi-account and authentication functionality).
@@ -436,12 +436,8 @@ The generated report records Apple spec metadata, path and operation counts, dom
436436
| `beta_groups` | `beta_groups_` | 9 | TestFlight groups |
437437
| `beta_feedback` | `beta_feedback_` | 8 | TestFlight feedback screenshots, crash submissions, crash logs |
438438
| `beta_testers` | `beta_testers_` | 12 | Tester management |
439-
| `iap` | `iap_` | 24 | In-app purchases, prices, review screenshots |
440-
| `subscriptions` | `subscriptions_` | 29 | Subscription CRUD, groups, localizations, prices |
441-
| `offer_codes` | `offer_codes_` | 10 | Subscription offer codes, one-time codes |
442-
| `winback` | `winback_` | 5 | Win-back offers for subscriptions |
443-
| `intro_offers` | `intro_offers_` | 4 | Subscription introductory offers |
444-
| `promo_offers` | `promo_offers_` | 6 | Subscription promotional offers |
439+
| `iap` | `iap_` | 46 | In-app purchases, pricing, availability, offer codes, review assets |
440+
| `subscriptions` | `subscriptions_` | 73 | Subscription lifecycle, pricing, availability, offers, assets |
445441
| `sandbox` | `sandbox_` | 3 | Sandbox testers |
446442
| `beta_app` | `beta_app_` | 10 | Beta app localizations and review |
447443
| `pre_release` | `pre_release_` | 3 | Pre-release versions |
@@ -465,20 +461,20 @@ When connected to an LLM client, tool definitions consume context tokens. Here's
465461
466462
| Configuration | Tools | ~Tokens |
467463
|---|---:|---:|
468-
| All workers (default) | 348 | **~39,400** |
464+
| All workers (default) | 389 | **~44,000** |
469465
| Release workflow: `apps,builds,versions,reviews` | ~57 | ~7,000 |
470-
| Monetization: `apps,iap,subscriptions,pricing` | ~78 | ~9,000 |
466+
| Monetization: `apps,iap,subscriptions,pricing` | ~137 | ~15,500 |
471467
| TestFlight: `apps,builds,beta_groups,beta_testers` | ~56 | ~6,000 |
472468
| Marketing: `apps,screenshots,custom_pages,ppo,promoted` | ~60 | ~6,800 |
473469
| `--workers apps` | 16 | ~2,000 |
474470
475-
**Heaviest workers:** Xcode Cloud (30 tools), Subscriptions (29 tools), InAppPurchases (24 tools), Provisioning (17 tools), Screenshots (16 tools).
471+
**Heaviest workers:** Subscriptions (73 tools), InAppPurchases (46 tools), Xcode Cloud (30 tools), Provisioning (17 tools), Screenshots (16 tools).
476472
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.
473+
For Claude (200K context) ~44K tokens is about 22% of the window. For clients with smaller context windows, use `--workers` to reduce the footprint.
478474
479475
## Available Tools
480476
481-
**348 tools** organized across 36 worker domains (use `--workers` to filter — see [Worker Filtering](#worker-filtering)):
477+
**389 tools** organized across 32 worker domains (use `--workers` to filter — see [Worker Filtering](#worker-filtering)):
482478
483479
<details>
484480
<summary><strong>Company Management</strong> — 3 tools</summary>
@@ -713,128 +709,63 @@ Includes tester list/search/get/create/delete, app relationships, invitations, b
713709
</details>
714710
715711
<details>
716-
<summary><strong>In-App Purchases</strong> — 24 tools</summary>
712+
<summary><strong>In-App Purchases</strong> — 46 tools</summary>
717713
718714
| Tool | Description |
719715
|------|-------------|
720716
| `iap_list` | List in-app purchases for an app |
721717
| `iap_get` | Get IAP details |
722-
| `iap_create` | Create a new IAP (consumable, non-consumable, subscription) |
718+
| `iap_create` | Create a new IAP |
723719
| `iap_update` | Update IAP attributes |
724-
| `iap_delete` | Delete an in-app purchase |
720+
| `iap_delete` | Delete an IAP |
725721
| `iap_list_localizations` | List IAP localizations |
726722
| `iap_create_localization` | Create IAP localization |
727723
| `iap_update_localization` | Update IAP localization |
728724
| `iap_delete_localization` | Delete IAP localization |
729725
| `iap_submit_for_review` | Submit IAP for review |
730726
| `iap_list_subscriptions` | List subscription groups |
731727
| `iap_get_subscription_group` | Get subscription group details |
732-
| `iap_list_price_points` | List available price points |
728+
| `iap_inventory` | AI-friendly IAP inventory for an app |
729+
| `iap_list_price_points` | List territory-aware price points |
730+
| `iap_list_price_point_equalizations` | List price point equalizations |
733731
| `iap_get_price_schedule` | Get price schedule |
734732
| `iap_set_price_schedule` | Set price schedule |
735-
| `iap_get_review_screenshot` | Get review screenshot |
733+
| `iap_pricing_summary` | Summarize current and scheduled prices |
734+
| `iap_prepare_offer_prices` | Find price point candidates for offers |
736735
| `iap_set_availability` | Set territory availability |
737-
| `iap_get_availability` | Get territory availability |
736+
| `iap_get_availability` | Get availability by IAP or availability ID |
737+
| `iap_list_available_territories` | List available territories |
738+
| `iap_get_promoted_purchase` | Get promoted purchase state |
739+
| `iap_list_offer_codes` | List IAP offer codes |
740+
| `iap_get_offer_code` | Get an IAP offer code |
741+
| `iap_create_offer_code` | Create an IAP offer code |
742+
| `iap_update_offer_code` | Update an IAP offer code |
743+
| `iap_deactivate_offer_code` | Deactivate an IAP offer code |
744+
| `iap_list_offer_code_prices` | List territory-aware offer prices |
745+
| `iap_generate_one_time_codes` | Generate one-time offer codes |
746+
| `iap_list_one_time_codes` | List one-time code batches |
747+
| `iap_get_one_time_code` | Get a one-time code batch |
748+
| `iap_update_one_time_code` | Update a one-time code batch |
749+
| `iap_deactivate_one_time_code` | Deactivate a one-time code batch |
750+
| `iap_get_one_time_code_values` | Get generated one-time code values |
751+
| `iap_create_custom_code` | Create a custom offer code |
752+
| `iap_get_custom_code` | Get custom code details |
753+
| `iap_update_custom_code` | Update a custom code |
754+
| `iap_deactivate_custom_code` | Deactivate a custom code |
755+
| `iap_get_review_screenshot` | Get review screenshot |
756+
| `iap_upload_review_screenshot` | Upload review screenshot |
757+
| `iap_delete_review_screenshot` | Delete review screenshot |
738758
| `iap_upload_image` | Upload promotional image |
739759
| `iap_get_image` | Get promotional image |
740760
| `iap_delete_image` | Delete promotional image |
741-
| `iap_upload_review_screenshot` | Upload review screenshot |
742-
| `iap_delete_review_screenshot` | Delete review screenshot |
743761
| `iap_list_images` | List promotional images |
744762
745763
</details>
746764
747765
<details>
748-
<summary><strong>Subscriptions</strong> — 29 tools</summary>
749-
750-
| Tool | Description |
751-
|------|-------------|
752-
| `subscriptions_list` | List subscriptions in a group |
753-
| `subscriptions_get` | Get subscription details |
754-
| `subscriptions_create` | Create a new subscription |
755-
| `subscriptions_update` | Update subscription |
756-
| `subscriptions_delete` | Delete subscription |
757-
| `subscriptions_list_localizations` | List subscription localizations |
758-
| `subscriptions_create_localization` | Create localization |
759-
| `subscriptions_update_localization` | Update localization |
760-
| `subscriptions_delete_localization` | Delete localization |
761-
| `subscriptions_list_prices` | List subscription prices |
762-
| `subscriptions_list_price_points` | List available price points |
763-
| `subscriptions_create_group` | Create subscription group |
764-
| `subscriptions_update_group` | Update subscription group |
765-
| `subscriptions_delete_group` | Delete subscription group |
766-
| `subscriptions_list_group_localizations` | List subscription group localizations |
767-
| `subscriptions_create_group_localization` | Create subscription group localization |
768-
| `subscriptions_get_group_localization` | Get subscription group localization |
769-
| `subscriptions_update_group_localization` | Update subscription group localization |
770-
| `subscriptions_delete_group_localization` | Delete subscription group localization |
771-
| `subscriptions_delete_price` | Delete subscription price |
772-
| `subscriptions_submit` | Submit subscription for review |
773-
| `subscriptions_upload_image` | Upload subscription image |
774-
| `subscriptions_get_image` | Get subscription image |
775-
| `subscriptions_delete_image` | Delete subscription image |
776-
| `subscriptions_upload_review_screenshot` | Upload review screenshot |
777-
| `subscriptions_get_review_screenshot` | Get review screenshot |
778-
| `subscriptions_delete_review_screenshot` | Delete review screenshot |
779-
| `subscriptions_list_images` | List subscription images |
780-
| `subscriptions_get_review_screenshot_for_subscription` | Get review screenshot for a subscription |
781-
782-
</details>
783-
784-
<details>
785-
<summary><strong>Offer Codes</strong> — 10 tools</summary>
786-
787-
| Tool | Description |
788-
|------|-------------|
789-
| `offer_codes_list` | List offer code configurations |
790-
| `offer_codes_create` | Create offer code configuration |
791-
| `offer_codes_update` | Update offer code (enable/disable) |
792-
| `offer_codes_deactivate` | Deactivate all codes |
793-
| `offer_codes_list_prices` | List prices for an offer code |
794-
| `offer_codes_generate_one_time` | Generate one-time use codes (up to 10K) |
795-
| `offer_codes_list_one_time` | List generated one-time codes |
796-
| `offer_codes_create_custom_code` | Create a custom offer code |
797-
| `offer_codes_get_custom_code` | Get custom offer code details |
798-
| `offer_codes_deactivate_custom_code` | Deactivate a custom offer code |
799-
800-
</details>
801-
802-
<details>
803-
<summary><strong>Win-Back Offers</strong> — 5 tools</summary>
804-
805-
| Tool | Description |
806-
|------|-------------|
807-
| `winback_list` | List win-back offers |
808-
| `winback_create` | Create a win-back offer |
809-
| `winback_update` | Update a win-back offer |
810-
| `winback_delete` | Delete a win-back offer |
811-
| `winback_list_prices` | List win-back offer prices |
812-
813-
</details>
814-
815-
<details>
816-
<summary><strong>Introductory Offers</strong> — 4 tools</summary>
766+
<summary><strong>Subscriptions</strong> — 73 tools</summary>
817767
818-
| Tool | Description |
819-
|------|-------------|
820-
| `intro_offers_list` | List introductory offers for a subscription |
821-
| `intro_offers_create` | Create an introductory offer |
822-
| `intro_offers_update` | Update an introductory offer (end date only) |
823-
| `intro_offers_delete` | Delete an introductory offer |
824-
825-
</details>
826-
827-
<details>
828-
<summary><strong>Promotional Offers</strong> — 6 tools</summary>
829-
830-
| Tool | Description |
831-
|------|-------------|
832-
| `promo_offers_list` | List promotional offers for a subscription |
833-
| `promo_offers_get` | Get a promotional offer |
834-
| `promo_offers_create` | Create a promotional offer |
835-
| `promo_offers_update` | Update promotional offer prices |
836-
| `promo_offers_delete` | Delete a promotional offer |
837-
| `promo_offers_list_prices` | List prices for a promotional offer |
768+
Includes subscription groups, group localizations, subscriptions, subscription localizations, territory-aware prices, price points, price point equalizations, availability, promoted purchase reads, inventory/pricing helpers, intro offers, promotional offers, offer codes, one-time/custom codes, win-back offers, images, and review screenshots. All former public `offer_codes_*`, `intro_offers_*`, `promo_offers_*`, and `winback_*` functionality is exposed through `subscriptions_*`.
838769
839770
</details>
840771
@@ -1120,7 +1051,7 @@ Sources/asc-mcp/
11201051
│ ├── HTTPClient.swift # Actor-based HTTP with retry logic
11211052
│ ├── JWTService.swift # ES256 JWT token generation
11221053
│ └── CompaniesManager.swift # Multi-account management
1123-
└── Workers/ # MCP tool implementations (36 worker domains + MainWorker router)
1054+
└── Workers/ # MCP tool implementations (32 public worker domains + MainWorker router)
11241055
├── MainWorker/WorkerManager # Central tool registry & routing
11251056
├── CompaniesWorker/ # company_* tools
11261057
├── AuthWorker/ # auth_* tools
@@ -1135,10 +1066,6 @@ Sources/asc-mcp/
11351066
├── BetaTestersWorker/ # beta_testers_* tools
11361067
├── InAppPurchasesWorker/ # iap_* tools
11371068
├── SubscriptionsWorker/ # subscriptions_* tools
1138-
├── OfferCodesWorker/ # offer_codes_* tools
1139-
├── WinBackOffersWorker/ # winback_* tools
1140-
├── IntroductoryOffersWorker/ # intro_offers_* tools
1141-
├── PromotionalOffersWorker/ # promo_offers_* tools
11421069
├── SandboxTestersWorker/ # sandbox_* tools
11431070
├── BetaAppWorker/ # beta_app_* tools
11441071
├── ProvisioningWorker/ # provisioning_* tools

Sources/asc-mcp/Core/ASCCoverageInventory.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,19 +158,20 @@ enum ASCCoverageInventory {
158158
appleDocumentationURL: "https://developer.apple.com/documentation/appstoreconnectapi/app-store",
159159
status: .covered,
160160
priority: .p2,
161-
workerKeys: ["iap", "subscriptions", "offer_codes", "winback", "intro_offers", "promo_offers"],
161+
workerKeys: ["iap", "subscriptions"],
162162
coveredCapabilities: [
163163
"IAP and subscription CRUD",
164164
"subscription groups and localizations",
165-
"prices and availability",
166-
"offer codes",
165+
"territory-aware prices, price points, equalizations, and availability",
166+
"IAP and subscription offer codes",
167167
"win-back offers",
168168
"introductory offers",
169169
"promotional offers",
170+
"AI-friendly product inventory and pricing summaries",
170171
"review screenshot and image uploads"
171172
],
172173
missingCapabilities: [],
173-
notes: "Coverage is broad enough for production workflows; future work is mostly schema tightening and OpenAPI drift checks."
174+
notes: "v3 consolidates subscription offers under subscriptions_* and keeps one-time IAP product management under iap_*."
174175
),
175176
ASCCoverageArea(
176177
name: "Provisioning and identifiers",

Sources/asc-mcp/Core/Application.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,7 @@ public func runApplication(options: AppRuntimeOptions = AppRuntimeOptions()) asy
6060
- users_* — team members and roles
6161
- app_events_* — in-app events
6262
- analytics_* — sales and financial reports
63-
- subscriptions_* -- subscription management (CRUD, localizations, prices, groups)
64-
- offer_codes_* -- subscription offer codes
65-
- winback_* -- win-back offers for subscriptions
66-
- intro_offers_* -- subscription introductory offers (free trials, pay-as-you-go, pay-up-front)
67-
- promo_offers_* -- subscription promotional offers (discounts for current/former subscribers)
63+
- subscriptions_* -- subscription and offer management (groups, products, prices, availability, intro/promotional/offer-code/win-back offers)
6864
- sandbox_* -- sandbox testers management (list, update, clear purchase history)
6965
- beta_app_* -- beta app localizations, review submissions, review details
7066
- pre_release_* -- pre-release versions (list, get, builds)
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.5.0"
4+
static let current = "3.0.0"
55
}

Sources/asc-mcp/EntryPoint.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ struct ASCMCPApp {
7070
"company", "auth", "apps", "accessibility", "webhooks", "xcode_cloud", "builds", "build_processing", "build_beta",
7171
"versions", "reviews", "beta_groups", "beta_feedback", "beta_testers", "iap",
7272
"provisioning", "app_info", "pricing", "users", "app_events", "analytics",
73-
"subscriptions", "offer_codes", "winback", "intro_offers", "promo_offers",
73+
"subscriptions",
7474
"sandbox", "beta_app", "pre_release", "beta_license",
7575
"screenshots", "custom_pages",
7676
"ppo", "promoted", "metrics", "review_attachments"

Sources/asc-mcp/Helpers/ToolMetadataPolicy.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ enum ToolMetadataPolicy {
6161
"_search",
6262
"_find",
6363
"_stats",
64+
"_summary",
65+
"_inventory",
66+
"_prepare",
6467
"_status",
6568
"_check",
6669
"_current",
@@ -70,6 +73,12 @@ enum ToolMetadataPolicy {
7073
]
7174

7275
private static let destructiveMarkers = [
76+
"_create",
77+
"_update",
78+
"_set",
79+
"_upload",
80+
"_generate",
81+
"_deactivate",
7382
"_delete",
7483
"_remove",
7584
"_revoke",

0 commit comments

Comments
 (0)