Skip to content

Commit 23c3902

Browse files
committed
chore: prepare 3.0.2 release
1 parent 8e56479 commit 23c3902

12 files changed

Lines changed: 242 additions & 46 deletions

AGENTS.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,32 +49,32 @@ Each company needs: `keyID`, `issuerID`, `privateKeyPath` (path to `.p8` file).
4949

5050
**WorkerManager** (`Workers/MainWorker/WorkerManager.swift`) — central registry, routes tool calls by prefix.
5151

52-
**Workers** (33 workers, 293 tools):
52+
**Workers** (36 Swift worker classes; 32 `--workers` filter keys; 389 tools):
5353

5454
| Worker | Prefix | Tools | Domain |
5555
|--------|--------|-------|--------|
5656
| CompaniesWorker | `company_` | 3 | Multi-account management |
5757
| AuthWorker | `auth_` | 4 | JWT tokens |
5858
| AppsWorker | `apps_` | 9 | App listing, metadata, localizations |
59+
| AccessibilityWorker | `accessibility_` | 6 | App Store accessibility declarations |
60+
| WebhooksWorker | `webhooks_` | 11 | Webhook notifications, delivery diagnostics, receiver helpers |
61+
| XcodeCloudWorker | `xcode_cloud_` | 30 | Xcode Cloud products, workflows, builds, artifacts, issues, test results, SCM |
5962
| BuildsWorker | `builds_` | 4 | Build management |
6063
| BuildBetaDetailsWorker | `builds_*_beta_` | 11 | TestFlight localizations, notifications, beta groups, individual testers |
6164
| BuildProcessingWorker | `builds_*_processing_` | 4 | Build states, encryption |
6265
| AppLifecycleWorker | `app_versions_` | 14 | Versions, submit, release, phased rollout, delete |
6366
| ReviewsWorker | `reviews_` | 8 | Customer reviews, responses, AI summarizations |
6467
| BetaGroupsWorker | `beta_groups_` | 9 | TestFlight groups CRUD, testers, builds |
65-
| InAppPurchasesWorker | `iap_` | 24 | IAP, subscriptions, localizations, prices, screenshots, availability, images |
68+
| BetaFeedbackWorker | `beta_feedback_` | 8 | TestFlight feedback screenshots, crash submissions, crash logs |
69+
| InAppPurchasesWorker | `iap_` | 46 | IAP, pricing, availability, offer codes, review assets |
6670
| ProvisioningWorker | `provisioning_` | 17 | Bundle IDs, devices, certificates, profiles, capabilities |
6771
| BetaTestersWorker | `beta_testers_` | 12 | Tester management, search, invite, relationships, invitations |
6872
| AppInfoWorker | `app_info_` | 10 | App info, categories, localizations, EULA |
6973
| PricingWorker | `pricing_` | 9 | Territories, availability, price points/schedule, app availabilities v2 |
7074
| UsersWorker | `users_` | 10 | Team members, roles, invitations, visible apps |
7175
| AppEventsWorker | `app_events_` | 9 | In-app events CRUD, localizations |
7276
| AnalyticsWorker | `analytics_` | 11 | Sales/financial reports, app summary, analytics reports/instances/segments, snapshot status |
73-
| SubscriptionsWorker | `subscriptions_` | 29 | Subscription CRUD, groups, localizations, prices, submit, group localizations, images, review screenshots |
74-
| OfferCodesWorker | `offer_codes_` | 10 | Subscription offer codes, one-time codes, custom codes |
75-
| WinBackOffersWorker | `winback_` | 5 | Win-back offers for subscriptions |
76-
| IntroductoryOffersWorker | `intro_offers_` | 4 | Introductory offers (free trial, pay-as-you-go, pay-up-front) |
77-
| PromotionalOffersWorker | `promo_offers_` | 6 | Promotional offers for subscriptions |
77+
| SubscriptionsWorker | `subscriptions_` | 73 | Subscription lifecycle, pricing, availability, offers, assets; includes offer-code, intro, promotional, and win-back sub-worker behavior |
7878
| SandboxTestersWorker | `sandbox_` | 3 | Sandbox testers (list, update, clear purchase history) |
7979
| BetaAppWorker | `beta_app_` | 10 | Beta app localizations, review submissions, review details |
8080
| PreReleaseVersionsWorker | `pre_release_` | 3 | Pre-release versions (list, get, builds) |

CLAUDE.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,32 +49,32 @@ Each company needs: `keyID`, `issuerID`, `privateKeyPath` (path to `.p8` file).
4949

5050
**WorkerManager** (`Workers/MainWorker/WorkerManager.swift`) — central registry, routes tool calls by prefix.
5151

52-
**Workers** (33 workers, 293 tools):
52+
**Workers** (36 Swift worker classes; 32 `--workers` filter keys; 389 tools):
5353

5454
| Worker | Prefix | Tools | Domain |
5555
|--------|--------|-------|--------|
5656
| CompaniesWorker | `company_` | 3 | Multi-account management |
5757
| AuthWorker | `auth_` | 4 | JWT tokens |
5858
| AppsWorker | `apps_` | 9 | App listing, metadata, localizations |
59+
| AccessibilityWorker | `accessibility_` | 6 | App Store accessibility declarations |
60+
| WebhooksWorker | `webhooks_` | 11 | Webhook notifications, delivery diagnostics, receiver helpers |
61+
| XcodeCloudWorker | `xcode_cloud_` | 30 | Xcode Cloud products, workflows, builds, artifacts, issues, test results, SCM |
5962
| BuildsWorker | `builds_` | 4 | Build management |
6063
| BuildBetaDetailsWorker | `builds_*_beta_` | 11 | TestFlight localizations, notifications, beta groups, individual testers |
6164
| BuildProcessingWorker | `builds_*_processing_` | 4 | Build states, encryption |
6265
| AppLifecycleWorker | `app_versions_` | 14 | Versions, submit, release, phased rollout, delete |
6366
| ReviewsWorker | `reviews_` | 8 | Customer reviews, responses, AI summarizations |
6467
| BetaGroupsWorker | `beta_groups_` | 9 | TestFlight groups CRUD, testers, builds |
65-
| InAppPurchasesWorker | `iap_` | 24 | IAP, subscriptions, localizations, prices, screenshots, availability, images |
68+
| BetaFeedbackWorker | `beta_feedback_` | 8 | TestFlight feedback screenshots, crash submissions, crash logs |
69+
| InAppPurchasesWorker | `iap_` | 46 | IAP, pricing, availability, offer codes, review assets |
6670
| ProvisioningWorker | `provisioning_` | 17 | Bundle IDs, devices, certificates, profiles, capabilities |
6771
| BetaTestersWorker | `beta_testers_` | 12 | Tester management, search, invite, relationships, invitations |
6872
| AppInfoWorker | `app_info_` | 10 | App info, categories, localizations, EULA |
6973
| PricingWorker | `pricing_` | 9 | Territories, availability, price points/schedule, app availabilities v2 |
7074
| UsersWorker | `users_` | 10 | Team members, roles, invitations, visible apps |
7175
| AppEventsWorker | `app_events_` | 9 | In-app events CRUD, localizations |
7276
| AnalyticsWorker | `analytics_` | 11 | Sales/financial reports, app summary, analytics reports/instances/segments, snapshot status |
73-
| SubscriptionsWorker | `subscriptions_` | 29 | Subscription CRUD, groups, localizations, prices, submit, group localizations, images, review screenshots |
74-
| OfferCodesWorker | `offer_codes_` | 10 | Subscription offer codes, one-time codes, custom codes |
75-
| WinBackOffersWorker | `winback_` | 5 | Win-back offers for subscriptions |
76-
| IntroductoryOffersWorker | `intro_offers_` | 4 | Introductory offers (free trial, pay-as-you-go, pay-up-front) |
77-
| PromotionalOffersWorker | `promo_offers_` | 6 | Promotional offers for subscriptions |
77+
| SubscriptionsWorker | `subscriptions_` | 73 | Subscription lifecycle, pricing, availability, offers, assets; includes offer-code, intro, promotional, and win-back sub-worker behavior |
7878
| SandboxTestersWorker | `sandbox_` | 3 | Sandbox testers (list, update, clear purchase history) |
7979
| BetaAppWorker | `beta_app_` | 10 | Beta app localizations, review submissions, review details |
8080
| PreReleaseVersionsWorker | `pre_release_` | 3 | Pre-release versions (list, get, builds) |

README.md

Lines changed: 22 additions & 12 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 **389 tools** across 32 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 30 App Store tool domains + 2 core domains, enabling you to automate your entire iOS/macOS release workflow through natural language.
3333

3434
### Key capabilities
3535

@@ -54,7 +54,7 @@
5454
```bash
5555
# 1. Install via Mint
5656
brew install mint
57-
mint install zelentsov-dev/asc-mcp@v2.4.0
57+
mint install zelentsov-dev/asc-mcp@v3.0.2
5858

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

8888
# Install asc-mcp from GitHub
89-
mint install zelentsov-dev/asc-mcp@v2.4.0
89+
mint install zelentsov-dev/asc-mcp@v3.0.2
9090

9191
# Register in Claude Code
9292
claude mcp add asc-mcp -- ~/.mint/bin/asc-mcp
@@ -97,13 +97,13 @@ To install a specific branch or tag:
9797
```bash
9898
mint install zelentsov-dev/asc-mcp@main # main branch
9999
mint install zelentsov-dev/asc-mcp@develop # develop branch
100-
mint install zelentsov-dev/asc-mcp@v2.4.0 # specific tag
100+
mint install zelentsov-dev/asc-mcp@v3.0.2 # specific tag
101101
```
102102

103103
To update to the latest version:
104104

105105
```bash
106-
mint install zelentsov-dev/asc-mcp@v2.4.0 --force
106+
mint install zelentsov-dev/asc-mcp@v3.0.2 --force
107107
```
108108

109109
### Option B: Build from Source
@@ -372,7 +372,7 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
372372
373373
### Worker Filtering
374374
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:
375+
The server exposes **389 tools** across 30 App Store tool domains + 2 core domains. Some MCP clients impose a tool limit (e.g., Windsurf caps at 100). Use the 32 `--workers` filter keys to enable only the workers you need:
376376
377377
```bash
378378
# Only load apps, builds, and version lifecycle tools
@@ -470,11 +470,11 @@ When connected to an LLM client, tool definitions consume context tokens. Here's
470470
471471
**Heaviest workers:** Subscriptions (73 tools), InAppPurchases (46 tools), Xcode Cloud (30 tools), Provisioning (17 tools), Screenshots (16 tools).
472472
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.
473+
For 200K-context clients, ~44K tokens is about 22% of the window. For clients with smaller context windows, use `--workers` to reduce the footprint.
474474
475475
## Available Tools
476476
477-
**389 tools** organized across 32 worker domains (use `--workers` to filter — see [Worker Filtering](#worker-filtering)):
477+
**389 tools** organized across 30 App Store tool domains + 2 core domains (use the 32 `--workers` filter keys — see [Worker Filtering](#worker-filtering)):
478478
479479
<details>
480480
<summary><strong>Company Management</strong> — 3 tools</summary>
@@ -1051,23 +1051,32 @@ Sources/asc-mcp/
10511051
│ ├── HTTPClient.swift # Actor-based HTTP with retry logic
10521052
│ ├── JWTService.swift # ES256 JWT token generation
10531053
│ └── CompaniesManager.swift # Multi-account management
1054-
└── Workers/ # MCP tool implementations (32 public worker domains + MainWorker router)
1054+
└── Workers/ # MCP tool implementations (36 Swift worker classes + MainWorker router)
10551055
├── MainWorker/WorkerManager # Central tool registry & routing
10561056
├── CompaniesWorker/ # company_* tools
10571057
├── AuthWorker/ # auth_* tools
10581058
├── AppsWorker/ # apps_* tools
10591059
├── AccessibilityWorker/ # accessibility_* tools
1060+
├── WebhooksWorker/ # webhooks_* tools
1061+
├── XcodeCloudWorker/ # xcode_cloud_* tools
10601062
├── BuildsWorker/ # builds_* tools
10611063
├── BuildProcessingWorker/ # builds_*_processing tools
10621064
├── BuildBetaDetailsWorker/ # builds_*_beta_* tools
10631065
├── AppLifecycleWorker/ # app_versions_* tools
10641066
├── ReviewsWorker/ # reviews_* tools
10651067
├── BetaGroupsWorker/ # beta_groups_* tools
1068+
├── BetaFeedbackWorker/ # beta_feedback_* tools
10661069
├── BetaTestersWorker/ # beta_testers_* tools
10671070
├── InAppPurchasesWorker/ # iap_* tools
10681071
├── SubscriptionsWorker/ # subscriptions_* tools
1069-
├── SandboxTestersWorker/ # sandbox_* tools
1070-
├── BetaAppWorker/ # beta_app_* tools
1072+
├── OfferCodesWorker/ # subscriptions offer-code tools
1073+
├── IntroductoryOffersWorker/ # subscriptions intro-offer tools
1074+
├── PromotionalOffersWorker/ # subscriptions promotional-offer tools
1075+
├── WinBackOffersWorker/ # subscriptions win-back tools
1076+
├── SandboxTestersWorker/ # sandbox_* tools
1077+
├── BetaAppWorker/ # beta_app_* tools
1078+
├── PreReleaseVersionsWorker/ # pre_release_* tools
1079+
├── BetaLicenseAgreementsWorker/ # beta_license_* tools
10711080
├── ProvisioningWorker/ # provisioning_* tools
10721081
├── AppInfoWorker/ # app_info_* tools
10731082
├── PricingWorker/ # pricing_* tools
@@ -1078,6 +1087,7 @@ Sources/asc-mcp/
10781087
├── CustomProductPagesWorker/ # custom_pages_* tools
10791088
├── ProductPageOptimizationWorker/ # ppo_* tools
10801089
├── PromotedPurchasesWorker/ # promoted_* tools
1090+
├── ReviewAttachmentsWorker/ # review_attachments_* tools
10811091
└── MetricsWorker/ # metrics_* tools
10821092
```
10831093
@@ -1120,7 +1130,7 @@ Sources/asc-mcp/
11201130
<details>
11211131
<summary><strong>Build processing takes too long</strong></summary>
11221132
1123-
Use `builds_wait_for_processing` with a reasonable timeout (default 1800s). Apple's build processing typically takes 530 minutes but can be longer during peak times.
1133+
Use `builds_get_processing_status` to inspect the current processing state and `builds_check_readiness` to verify App Store/TestFlight readiness. Apple's build processing typically takes 5-30 minutes but can be longer during peak times.
11241134
11251135
</details>
11261136
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 = "3.0.0"
4+
static let current = "3.0.2"
55
}

Sources/asc-mcp/Workers/AppLifecycleWorker/AppLifecycleWorker+Handlers.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,7 @@ extension AppLifecycleWorker {
891891
}
892892
}
893893

894-
/// Deletes an app store version (only PREPARE_FOR_SUBMISSION state)
894+
/// Deletes an app store version when Apple marks it deletable
895895
/// - Returns: JSON with success confirmation
896896
/// - Throws: CallTool.Result with error if version_id missing or API call fails
897897
func deleteVersion(_ params: CallTool.Parameters) async throws -> CallTool.Result {

Sources/asc-mcp/Workers/AppLifecycleWorker/AppLifecycleWorker+ToolDefinitions.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ extension AppLifecycleWorker {
5555
"items": .object([
5656
"type": .string("string"),
5757
"enum": .array([
58+
.string("ACCEPTED"),
5859
.string("DEVELOPER_REMOVED_FROM_SALE"),
5960
.string("DEVELOPER_REJECTED"),
6061
.string("IN_REVIEW"),
@@ -72,7 +73,8 @@ extension AppLifecycleWorker {
7273
.string("REMOVED_FROM_SALE"),
7374
.string("WAITING_FOR_EXPORT_COMPLIANCE"),
7475
.string("WAITING_FOR_REVIEW"),
75-
.string("REPLACED_WITH_NEW_VERSION")
76+
.string("REPLACED_WITH_NEW_VERSION"),
77+
.string("NOT_APPLICABLE")
7678
])
7779
]),
7880
"description": .string("Filter by version states")
@@ -486,7 +488,7 @@ extension AppLifecycleWorker {
486488
func deleteVersionTool() -> Tool {
487489
Tool(
488490
name: "app_versions_delete",
489-
description: "Delete an app store version. Only versions in PREPARE_FOR_SUBMISSION state can be deleted.",
491+
description: "Delete an app store version. App Store Connect validates whether the version is currently deletable.",
490492
inputSchema: .object([
491493
"type": .string("object"),
492494
"properties": .object([

Sources/asc-mcp/Workers/AppsWorker/AppsWorker+Handlers.swift

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ extension AppsWorker {
400400
}
401401
selected = match
402402
} else {
403-
// Priority: PREPARE_FOR_SUBMISSION > READY_FOR_SALE > first available
403+
// Priority: editable and review-issue states > published > first available
404404
// Within each state, prefer platform: IOS > MAC_OS > TV_OS > VISION_OS
405405
let platformPriority = ["IOS", "MAC_OS", "TV_OS", "WATCH_OS", "VISION_OS"]
406406

@@ -413,16 +413,13 @@ extension AppsWorker {
413413
return candidates.first
414414
}
415415

416-
let editableCandidates = versions.filter { $0.attributes?.appStoreState == "PREPARE_FOR_SUBMISSION" }
417-
let publishedCandidates = versions.filter { $0.attributes?.appStoreState == "READY_FOR_SALE" }
418-
419-
if let editable = preferredByPlatform(editableCandidates) {
420-
selected = editable
421-
} else if let published = preferredByPlatform(publishedCandidates) {
422-
selected = published
423-
} else {
424-
selected = versions[0]
425-
}
416+
let statePriority = ["PREPARE_FOR_SUBMISSION", "REJECTED", "METADATA_REJECTED", "READY_FOR_SALE"]
417+
selected = statePriority
418+
.lazy
419+
.compactMap { state in
420+
preferredByPlatform(versions.filter { $0.attributes?.appStoreState == state })
421+
}
422+
.first ?? versions[0]
426423
}
427424

428425
resolvedVersion = (

Sources/asc-mcp/Workers/AppsWorker/AppsWorker+ToolDefinitions.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ extension AppsWorker {
104104
105105
Behavior:
106106
- Without locale: returns ALL locales in one request
107-
- Without version_id: auto-selects version (priority: PREPARE_FOR_SUBMISSION > READY_FOR_SALE)
107+
- Without version_id: auto-selects version (priority: PREPARE_FOR_SUBMISSION > REJECTED > METADATA_REJECTED > READY_FOR_SALE)
108108
- include_media: false by default, media loaded only on request
109109
""",
110110
inputSchema: .object([
@@ -124,7 +124,7 @@ extension AppsWorker {
124124
]),
125125
"version_state": .object([
126126
"type": .string("string"),
127-
"description": .string("Version state filter: PREPARE_FOR_SUBMISSION (editable) or READY_FOR_SALE (published)")
127+
"description": .string("Version state filter (for example PREPARE_FOR_SUBMISSION, REJECTED, METADATA_REJECTED, READY_FOR_SALE)")
128128
]),
129129
"include_media": .object([
130130
"type": .string("boolean"),

Sources/asc-mcp/Workers/BuildBetaDetailsWorker/BuildBetaDetailsWorker+ToolDefinitions.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ extension BuildBetaDetailsWorker {
4444
"external_build_state": .object([
4545
"type": .string("string"),
4646
"description": .string("External build state"),
47-
"enum": .array([.string("PROCESSING"), .string("PROCESSING_EXCEPTION"), .string("MISSING_EXPORT_COMPLIANCE"), .string("READY_FOR_BETA_SUBMISSION"), .string("IN_BETA_REVIEW"), .string("BETA_APPROVED"), .string("BETA_REJECTED"), .string("IN_BETA_TESTING"), .string("EXPIRED"), .string("READY_FOR_BETA_TESTING"), .string("IN_EXPORT_COMPLIANCE_REVIEW")])
47+
"enum": .array([.string("PROCESSING"), .string("PROCESSING_EXCEPTION"), .string("MISSING_EXPORT_COMPLIANCE"), .string("READY_FOR_BETA_TESTING"), .string("IN_BETA_TESTING"), .string("EXPIRED"), .string("READY_FOR_BETA_SUBMISSION"), .string("IN_EXPORT_COMPLIANCE_REVIEW"), .string("WAITING_FOR_BETA_REVIEW"), .string("IN_BETA_REVIEW"), .string("BETA_REJECTED"), .string("BETA_APPROVED"), .string("NOT_APPLICABLE")])
4848
])
4949
]),
5050
"required": .array([.string("beta_detail_id")])
@@ -281,4 +281,4 @@ extension BuildBetaDetailsWorker {
281281
])
282282
)
283283
}
284-
}
284+
}

0 commit comments

Comments
 (0)