关于 appstoreconnect-mcp
appstoreconnect-mcp 是用于从兼容客户端管理 App Store Connect 应用和产品的 MCP 服务。其工具涵盖订阅与应用定价、订阅及 App 内购买,并提供连接设置和诊断功能。
主要功能
- 01列出和获取应用
- 02创建和管理订阅
- 03读取及安排订阅价格
- 04管理应用价格计划
- 05管理 App 内购买
适用场景
- 01按地区查看订阅价格
- 02安排订阅价格变更
- 03创建和更新订阅产品
- 04检查应用及 App 内购买定价
MCP 相关
它将 App Store Connect API 操作作为工具提供给 MCP 客户端,涵盖应用、订阅、定价和 App 内购买工作流。设置向导可将服务注册到所选 MCP 客户端。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @akoskomuves/appstoreconnect-mcpASC_ISSUER_IDApp Store Connect API issuer UUID (Users and Access > Integrations > Keys).ASC_KEY_ID密钥10-character App Store Connect API key ID.ASC_PRIVATE_KEY_PATH密钥Path to the downloaded .p8 private key file (~ is expanded).ASC_VENDOR_NUMBEROptional. Account-level vendor number for the sales/finance report tools.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
appstoreconnect-mcp
一个用于 Apple App Store Connect API 的 Model Context Protocol 服务,可通过任何兼容 MCP 的客户端(Claude Code、Claude Desktop、Cursor、Windsurf)管理 App、订阅、定价等内容。
首个发布的功能是订阅定价,包括一个购买力平价(Purchasing Power Parity)重新平衡流程;该流程已在一款真实的 iOS App 上用于安排 65 个地区的 120 次生产环境价格调整。新的 ASC 领域(TestFlight、销售、屏幕截图、IAP)设计为每次通过一个文件接入;请参阅路线图。
安装(零配置)
npx @akoskomuves/appstoreconnect-mcp init
向导会:
- 打开 App Store Connect → Keys,以便你下载
.p8(如果已有密钥,则跳过)。 - 将密钥复制到
~/.appstore/并设置chmod 600。 - 提示你输入 Issuer ID 和(自动检测到的)Key ID。
- 在写入任何内容前,通过真实 API 调用验证身份验证。
- 检测已安装的 MCP 客户端——Claude Code、Claude Desktop、Cursor、Windsurf——并在你选择的客户端中注册自身。
之后如果发现异常,可以运行只读诊断:
npx @akoskomuves/appstoreconnect-mcp doctor
手动安装
如果你更愿意手动配置,请将以下内容添加到 ~/.claude.json(Claude Code)、claude_desktop_config.json(Claude Desktop)或对应客户端的配置文件中:
{
"mcpServers": {
"appstoreconnect": {
"command": "npx",
"args": ["-y", "@akoskomuves/appstoreconnect-mcp"],
"env": {
"ASC_ISSUER_ID": "...",
"ASC_KEY_ID": "...",
"ASC_PRIVATE_KEY_PATH": "~/.appstore/AuthKey_XXXXXXXXXX.p8"
}
}
}
}
也可以通过 Claude Code 的 CLI 操作:
claude mcp add appstoreconnect \
-e ASC_ISSUER_ID=... \
-e ASC_KEY_ID=... \
-e ASC_PRIVATE_KEY_PATH=~/.appstore/AuthKey_XXXXXXXXXX.p8 \
-- npx -y @akoskomuves/appstoreconnect-mcp
配置
在 App Store Connect → Users and Access → Integrations → Keys 生成 App Store Connect API 密钥。写入价格需要 Admin 角色;只读操作可使用 App Manager。
| 变量 | 说明 |
|---|---|
ASC_ISSUER_ID | Keys 页面上的 Issuer UUID |
ASC_KEY_ID | 10 位字符的 Key ID |
ASC_PRIVATE_KEY_PATH | 下载的 AuthKey_XXXXXXXXXX.p8 文件的路径(会展开 ~) |
.p8 文件是私钥,切勿提交。建议将其存放在任何代码仓库之外的 ~/.appstore/AuthKey_XXXXXXXXXX.p8。
可选:应用内购买签名密钥
仅 asc_sign_* 工具(订阅优惠兑换签名)需要此密钥。在 App Store Connect → Users and Access → Integrations → In-App Purchase 中创建第二个密钥——它与上面的 ASC API 密钥不同,在同一页面的另一个标签页中生成。
| 变量 | 说明 |
|---|---|
ASC_IAP_ISSUER_ID | In-App Purchase 密钥标签页中的 Issuer UUID(与 ASC_ISSUER_ID 不同) |
ASC_IAP_KEY_ID | IAP 密钥的 10 位字符 Key ID |
ASC_IAP_PRIVATE_KEY_PATH | IAP 签名 .p8 文件的路径(会展开 ~) |
没有这些密钥,服务也能正常启动;只有缺少密钥时,asc_sign_* 工具才会提示设置相关配置。如果只设置了三项中的一项或两项,服务会给出明确错误并拒绝启动。运行 appstoreconnect-mcp doctor,验证密钥是否能作为有效的 ES256 PKCS#8 密钥加载。
可选:销售和财务报告的供应商编号
仅供 asc_get_sales_report / asc_get_finance_report 使用。供应商编号属于账户级别,可在 App Store Connect → Payments and Financial Reports 中团队名称旁查看(一个类似 85123456 的数字字符串)。
| 变量 | 说明 |
|---|---|
ASC_VENDOR_NUMBER | 下载销售和财务报告时使用的默认供应商编号 |
没有此变量时,两个报告工具仍可使用,只需在每次调用时传入 vendorNumber(错误消息会告诉你在哪里查找)。注意:下载销售和财务报告需要使用具有 Admin、Finance 或 Sales 角色的 API 密钥。
工具
应用
asc_list_apps— 列出应用(按bundleId筛选)asc_get_app— 按 ID 获取一个应用
订阅
asc_list_subscription_groups— 获取某个应用的订阅组asc_get_subscription_group— 按 ID 获取一个订阅组asc_list_subscriptions— 获取某个组中的自动续订订阅asc_get_subscription— 按 ID 获取一个订阅asc_list_subscription_prices— 获取每个订阅当前的价格安排。每个地区一行(未筛选时约 175 行)——传入territoryId可缩小到一个市场asc_list_subscription_price_points— 获取某个地区内订阅的有效价格点。传入nearAmount可将响应缩小到目标价格附近的档位。
订阅产品(写入)
创建订阅层级本身——这一步过去需要你前往 App Store Connect 网页界面。共有四个名称,客户实际能看到的只有两个:
| 资源 | 属性 | 谁能看到 |
|---|---|---|
SubscriptionGroup | referenceName | 仅内部 |
SubscriptionGroupLocalization | name | 客户 — 套餐选项上方的标题 |
Subscription | name | 仅内部 |
SubscriptionLocalization | name | 客户 — 单个套餐 |
asc_post_subscription_group— 创建每个订阅都必须归属的容器。客户在每个组中只能持有 一个有效订阅,因此互斥套餐(月付和年付)必须属于同一个组asc_patch_subscription_group— 重命名(referenceName是唯一可修改的属性;组无法在应用之间移动)asc_delete_subscription_group— 先列出该组的订阅,并拒绝删除;错误会在客户端指出阻止删除的具体产品,而不是只返回 Apple 的 409 错误asc_post_subscription— 创建自动续订订阅。productId是永久的:无法更改,而且 Apple 永远不会允许在该账户中重新使用它——即使订阅已被删除也不行。创建时subscriptionPeriod为可选项,但提交前必须设置;新产品会以MISSING_METADATA状态启动,成功消息会列出剩余步骤asc_patch_subscription— 可修改name、subscriptionPeriod、familySharable、reviewNote、groupLevel。此处从设计上就不存在处理productId的代码路径。嵌套的优惠和价格数组特意不受支持——它们在传输协议中的语义是替换,因此调用方若传入一个优惠,会悄无声息地删除其余优惠;请使用专用的优惠和价格工具asc_delete_subscription— 预先检查状态;如果产品正在审核或曾经获批,则拒绝删除,并指出可使用asc_post_subscription_availability停止销售已上线的产品
订阅组本地化
面向客户的组标题——App Store 在方案选项上方显示的标题,以及“设置”→“订阅”中显示的标题。未添加本地化的组无法提交。
asc_list_subscription_group_localizations/asc_get_subscription_group_localizationasc_post_subscription_group_localization—name+locale,以及可选的customAppName(用于覆盖订阅面板中显示的 app 名称;通常省略)。已处理线协议中的注意事项:父级关系键为subscriptionGroup,而Subscription将同一父级称为groupasc_patch_subscription_group_localization—name/customAppName;locale 是不可变的查找键asc_delete_subscription_group_localization
订阅定价(写入)
asc_post_subscription_price— 为一个地区设置价格,可以是初始价格,也可以是计划变更。**顺序很重要,而且这两个步骤均已在实际环境中确认:**地区可售性 → 未注明日期的基准价格 → 已注明日期的变更。- 订阅在某地区的首次定价不要填写
startDate。 初始价格行是未注明日期的基准价格;带日期的首次价格属于价格变更,但此时没有可供变更的现有价格。Apple 已明确说明——"Invalid startDate. Create a starting price before creating future prices."——即使日期设得更远也无济于事(设为 1、8 和 29 天后均返回 409)。 - 必须先设置可售性。 如果未设置,即使未注明日期的 POST 格式正确,也会失败,并返回将问题归咎于价格点的 409(
ENTITY_ERROR.RELATIONSHIP.INVALID→/data/relationships/subscriptionPricePoint/id)。价格点没有问题;Apple 只是无法为尚未销售该产品的地区定价。该工具会翻译这两种错误,而不是直接传递原始 409。 - 已注明日期的价格变更中,
preserveCurrentPrice默认为 true;基准价格中则会省略此字段,因为没有现有用户群体需要保留原价。创建的行会显示preserved: false,直到更新的价格取代它;这是预期行为,并不表示保留原价失败
- 订阅在某地区的首次定价不要填写
asc_delete_subscription_price— 取消待处理的计划变更
App 定价(付费的非订阅 App)
asc_list_app_prices— 查看 App 当前的价格计划,区分手动覆盖的价格和自动推导的价格,并显示基准地区asc_list_app_price_points— 查看指定地区适用于 App 的 Apple 有效价格档位(每个地区约 600 多个档位)。传入nearAmount(目标价格)和可选的nearCount(默认值为 10),可筛选出最接近的档位。Apple 不支持在服务端按接近金额筛选,因此完整列表仍会分页,但只会显示最接近的档位。asc_post_app_price_schedule— 替换整个价格计划(替换整个计划,而非合并——与 Apple 的 API 一致)。预检要求至少有一条条目针对基准地区且未设置startDate,并要求明确设置acknowledgeReplacesAll: true,否则会拒绝操作。更改基准地区时,还必须单独确认acknowledgeDeletesScheduledIfBaseChanges(Apple 更改基准地区时会清除待处理的计划变更)。App 没有保留原价机制——新价格计划会在每条目对应的startDate生效,并以原子方式激活。
App 内购买项目(消耗型、非消耗型、非自动续期订阅)
asc_list_iaps— 列出应用的 App 内购买项目(仅限 v2 接口;自动续期订阅由上方的订阅工具处理)。可按inAppPurchaseType和state筛选。如果你确定某个应用有 App 内购买项目,但此处返回零条记录,这些项目可能仅存在于旧版系统中,需先在 App Store Connect 网页界面中迁移,才会显示在此处。asc_get_iap— 按 ID 获取单个 App 内购买项目。asc_list_iap_prices— 获取 App 内购买项目当前的价格计划(结构与应用价格相同:手动覆盖项、自动派生价格和基础地区)。asc_list_iap_price_points— 获取某个地区适用于 App 内购买项目的有效 Apple 价格档位。缩小范围的nearAmount/nearCount参数与应用和订阅价格点工具相同。asc_post_iap_price_schedule— 替换整个 App 内购买项目价格计划(替换整个计划的语义与asc_post_app_price_schedule相同:acknowledgeReplacesAll: true、基础地区条目不带startDate,且必须确认基础价格变更)。没有保留旧价格的机制,与应用相同。asc_post_iap— 创建消耗型、非消耗型或非自动续期订阅 App 内购买项目。productId是永久的,即使删除后也无法在该账户中重复使用。新建的 App 内购买项目状态为MISSING_METADATA;成功消息会列出剩余步骤asc_patch_iap— 修改name(内部名称)、reviewNote、familySharable;传入null可清除。productId和inAppPurchaseType不可变,且不会发送asc_delete_iap— 预先检查状态;对于正在审核或曾经获批的 App 内购买项目,会拒绝删除,并提示使用asc_post_iap_availability停止销售已上线项目;force: true可跳过检查
与版本关联的 App 内购买项目和订阅内容(/v2)
API 4.x 为 App 内购买项目、订阅和订阅组本地化接口以及两个推广图片接口添加了 /v2 版本。资源和属性与 /v1 相同,但它们关联的是产品的某个版本(关系 version),而非产品本身。/v1 并未弃用,因此现有本地化和图片工具仍使用该接口;这些是新增功能。可从产品的版本列表中获取版本 ID。
- 本地化:
asc_{post,get,patch,delete}_{iap,subscription,subscription_group}_version_localization - 图片:
asc_{upload,post,patch,get,delete}_{iap,subscription}_version_image— v2 提交仅接受uploaded(不接受sourceFileChecksum)
应用内产品版本(IAP、订阅、订阅群组)
从 API 4.4.1 起,每个应用内产品都分为两层。产品(inAppPurchases、subscriptions、subscriptionGroups)保存身份信息和商业信息:产品 ID、类型、价格、可用性、优惠。上方的工具用于操作产品。其版本(inAppPurchaseVersions、subscriptionVersions、subscriptionGroupVersions)保存面向客户的元数据,这些内容需经 App Review 批准:本地化内容,以及 IAP 和订阅的图片。每个版本都有一个编号和状态(PREPARE_FOR_SUBMISSION … APPROVED,之后在更新版本获批时变为 REPLACED_WITH_NEW_VERSION)。如需更改已批准的元数据,需创建一个版本、编辑该版本,然后通过审核提交来提交该版本。Apple 已弃用产品级的 v1 本地化内容/图片端点和独立的 IAP/订阅提交接口,改为采用此模型。
asc_list_{iap,subscription,subscription_group}_versions— 列出一个产品的版本,按最新优先排序,并显示状态和本地化内容数量;可按state筛选asc_get_*_version— 获取单个版本,包含其产品、本地化内容和图片asc_post_*_version— 创建新版本(仅含关系的请求体)。版本不支持 PATCH 或 DELETE,因此如果产品已有PREPARE_FOR_SUBMISSION草稿,该操作会拒绝执行并指出草稿名称。dryRun会打印请求体和现有版本asc_list_*_version_localizations— 列出该版本的本地化内容(与 v1 本地化内容不同,这些内容不带state)asc_list_{iap,subscription}_version_images/asc_get_{iap,subscription}_version_primary_image— 列出版本的图片(一对多)并获取其单张image
应用内购买优惠码
适用于消耗型、非消耗型和非自动续期订阅的优惠码(API 4.2)。其运作方式与订阅优惠码类似,采用活动 → 一次性使用批次/自定义码的层级结构,活动设置也更简单:仅需名称、客户资格(NON_SPENDER、ACTIVE_SPENDER、CHURNED_SPENDER)以及各地区的价格(IAP 价格点)。无法删除任何内容;PATCH 仅切换 active。
asc_list_iap_offer_codes·asc_get_iap_offer_code·asc_list_iap_offer_code_pricesasc_post_iap_offer_code— 一次 POST 内联包含各地区的所有价格。预先检查最多 10 个活动的限制和名称唯一性(两者沿用订阅相关的假设)·asc_patch_iap_offer_code(active)- 一次性使用批次:
asc_list_*/asc_get_*/asc_post_*/asc_patch_iap_offer_code_one_time_use_codes,以及asc_export_iap_offer_code_one_time_use_values(可兑换字符串的 CSV) - 自定义码:
asc_list_iap_offer_code_custom_codes·asc_get_*·asc_post_iap_offer_code_custom_code(如果该活动已有此字符串,则拒绝操作)·asc_patch_*
订阅入门优惠
入门优惠面向新订阅者——在恢复常规价格前的折扣“首个时段”。
asc_list_subscription_introductory_offers— 列出为某个订阅配置的入门优惠(免费试用/按期付费/预先付费),涵盖各个地区。Apple 的“所有地区”通配项(不带territory的单个优惠)会在表格中显示为TERR=(all)。传入territoryId可缩小到单个市场——通配优惠始终会保留,因为它们在所有市场均有效。asc_get_subscription_introductory_offer— 按 ID 获取单个优惠。asc_post_subscription_introductory_offer— 创建优惠。共有三种offerMode:FREE_TRIAL(无价格;省略pricePointId)、PAY_AS_YOU_GO(在numberOfPeriods个时段内,每个时段按优惠价格收费)、PAY_UP_FRONT(一次性收取整个期限的费用;Apple 仍要求提供numberOfPeriods,省略时默认为 1)。传入territoryId可指定单个市场,或省略以使用 Apple 的“所有地区”通配项(在每个市场使用相同的价格点,不会自动换算货币)。服务端验证会拒绝缺少pricePointId的PAY_*、缺少numberOfPeriods的PAY_AS_YOU_GO,以及endDate ≤ startDate的情况——否则会直接显示 Apple 返回的错误。asc_patch_subscription_introductory_offer— 窄范围更新路径:创建后只能更改startDate、endDate和pricePointId。如需更改模式/期限/时段数,请删除后重新创建。asc_delete_subscription_introductory_offer— 删除待生效或有效的优惠。Apple 不允许删除当前仍可兑换的优惠;如需停止优惠,请将endDatePATCH 为今天。
订阅促销优惠
促销优惠面向现有或已过期的订阅者——与入门优惠的适用对象相反,资格由资源类型本身决定(每个优惠没有单独的标志)。Apple 将每个订阅的有效促销优惠数量上限设为 10 个。创建后,只能编辑各地区的价格——name、offerCode、offerMode、duration 和 numberOfPeriods 均不可更改。
asc_list_subscription_promotional_offers— 列出为某个订阅配置的促销优惠。asc_get_subscription_promotional_offer— 获取单个优惠,包括各地区的价格。asc_list_subscription_promotional_offer_prices— 列出附加到优惠的各地区价格行(地区+货币+金额+价格点 ID)。asc_post_subscription_promotional_offer— 通过一个原子 POST 创建优惠(name+offerCode+ 模式 + 期限 + 所有地区的价格)。预先检查 Apple 的 10 个优惠上限和offerCode冲突;如有问题,会拒绝请求并提供明确的解决方法,而不是让 Apple 返回 409。asc_patch_subscription_promotional_offer_prices— 更新优惠的各地区价格。Apple 的接口语义是替换(新价格数组将成为更新后的状态,未列出的地区会被移除);工具的mode: 'replace' | 'add' | 'remove'参数可避免误操作——'add'会读取当前价格并合并,'remove'会读取并筛选。asc_delete_subscription_promotional_offer— DELETE → 204。
订阅挽回优惠
挽回优惠面向已流失的订阅者——曾经订阅过、后来取消订阅的客户。Apple 会根据优惠的资格规则自动向符合条件的客户展示优惠(也可以通过你自己的 StoreKit 消息展示)。这是继入门优惠和促销优惠之后的第三种优惠类型。它比促销优惠更丰富:增加了资格定位、时间安排、优先级和自动资源意图。创建后,referenceName、offerId、duration、offerMode、periodCount、targetSubscriptionPlanType 和价格均不可更改。
asc_list_subscription_win_back_offers— 列出为某个订阅配置的挽回优惠。asc_get_subscription_win_back_offer— 获取单个优惠,包括其订阅和各地区价格。asc_list_subscription_win_back_offer_prices— 列出关联到某个优惠的各地区价格行(地区 + 货币 + 金额 + 价格点 ID)。asc_post_subscription_win_back_offer— 一次原子 POST 创建优惠(身份信息 + 资格规则 + 时间安排 + 优先级 + 所有地区价格)。资格通过customerEligibilityPaidSubscriptionDurationInMonths、customerEligibilityTimeSinceLastSubscribedInMonths({ minimum, maximum? }范围)以及可选的customerEligibilityWaitBetweenOffersInMonths表示。创建前会检查offerId是否冲突,并验证范围以及endDate > startDate。asc_patch_subscription_win_back_offer— 仅更新可变属性:资格、startDate/endDate、priority和promotionIntent。如需更改身份信息、模式、时长、周期或价格,请删除后重新创建。asc_delete_subscription_win_back_offer— DELETE → 204。
App Asset Library(应用素材库:屏幕截图、预览和活动素材)
App Store Connect API 4.5.1 将屏幕截图集、预览集以及 App 内活动屏幕截图/视频片段替换为每个 App 一个 App Asset Library。上传图像或视频一次,然后将其放置:一次放置会将一个素材放到一个本地化项(版本、Custom Product Page、实验分组或 App 内活动)中的一个 placementType + 设备 placementGroup 插槽中。同一个素材可以放置在多个本地化项中。素材库的 ID 就是 App ID。
- 参考数据:
asc_get_asset_library_ref_data— Apple 的设备组目录(IPHONE_DYNAMIC_ISLAND_LARGE_PROFILE、IPAD_13_PROFILE、IPHONE_DUO_PROFILE等)、每个组的素材数量上限(例如 10 张屏幕截图、3 个预览),以及各组支持的像素、格式和时长规格。可通过sections和筛选条件缩小范围;完整文档约为 130 KB。 - 素材库:
asc_get_app_asset_library·asc_list_asset_library_{images,videos}(按类别/状态/名称/规格筛选,显示每个素材的放置次数)·asc_get_asset_library_{image,video}·asc_list_asset_library_{image,video}_placements(查看素材的展示位置)。 - 上传:
asc_upload_asset_library_{image,video}(组合操作:预留 → PUT 分块 → 提交)· 原始asc_post_*/asc_patch_*(uploaded、archived、referenceName、视频previewFrameTimeCode)·asc_delete_*。只需设置uploaded: true即可提交 — 此 API 不接受校验和。 - 放置:
asc_list_localization_placements(查看某个本地化项展示的内容,按组分类并遵循商店中的顺序)·asc_get_asset_library_placement·asc_post_asset_library_placement(图像或视频 × 父级本地化项)·asc_delete_asset_library_placement(素材仍保留在素材库中)·asc_post_asset_library_placement_ordering_request(对一个组重新排序)。
产品页页眉(产品页顶部的宽幅图像或视频):使用 category: "CREATIVE_ASSETS" 上传,然后将其放置到版本、Custom Product Page 或实验分组本地化项中,设置 placementType: "PRODUCT_PAGE_HEADER_ASSET"、placementGroup: "DEFAULT_PROFILE"。每个本地化项只能放置一个。当前规格(2026-10-23):PNG,5244x2950(16:9)或 3840x1646(21:9),不含 Alpha 通道;或视频,3840x1646(21:9)、30/60 fps、最长 30 s,格式为 .mp4/.m4v/.mov。APP_STORE_SEARCH_RESULTS_ASSET 的工作方式相同。使用 placementTypes: ["PRODUCT_PAGE_HEADER_ASSET"] 调用 asc_get_asset_library_ref_data 可查看当前规格。
旧的基于素材集的工具(asc_*_app_screenshot*、asc_*_app_preview*、asc_*_app_event_screenshot*、asc_*_app_event_video_clip*、asc_upload_screenshot、asc_upload_app_preview)仍可通过 Apple 已弃用的端点使用,现在会在其描述中注明这一点。
IAP 和订阅审核素材
Apple 要求在提交应用内购买或订阅前提供的审核屏幕截图,以及可选的宣传图片;从 v1.5 开始,还可添加版本的App Review 附件(供审核人员查看的文件,例如演示视频)。共有五种资源,均采用与 App 屏幕截图相同的三步上传流程(预留 → PUT 分块 → 提交),另有一个组合式 asc_upload_* 工具,可从本地文件完成全部三步。已为你处理好关联关系上的易错点:IAP 图片通过 inAppPurchase 关联,而 IAP 审核屏幕截图使用 inAppPurchaseV2。
- 图片(每个 IAP / 订阅可有多个):
asc_list_{iap,subscription}_images·asc_get_*·asc_upload_*(组合式)·asc_post_*/asc_patch_*(原始预留 / 提交操作)·asc_delete_*。 - 审核屏幕截图(每个 IAP / 订阅仅有一个):
asc_get_{iap,subscription}_review_screenshot(返回唯一截图,或 null)·asc_upload_*·asc_post_*/asc_patch_*·asc_delete_*。由于每个对象仅有一个,若已存在截图,上传 / 预留工具会拒绝操作;请先将其删除。 - App Review 附件(每个版本的审核详情可有多个):
asc_list_review_attachments·asc_get_review_attachment·asc_upload_review_attachment(组合式)·asc_post_*/asc_patch_*·asc_delete_*。父级 ID 是asc_get_app_store_review_detail返回的appStoreReviewDetailID。
App Review 详情、提交与发布
从“元数据已准备就绪”到“构建版本上线”之间的最后几项手动操作:
asc_get_app_store_review_detail/asc_post_…/asc_patch_…— 版本的 App Review 说明卡片:联系人、演示账号(名称 / 密码 / 是否必需)和备注。每个版本仅有一个;Apple 会在 PATCH 时合并内容。asc_post_app_store_version_release_request— ⚠️ 立即将已批准(PENDING_DEVELOPER_RELEASE)的版本发布到公开的 App Store——自动执行“发布此版本”操作。仅适用于手动发布的版本;不可撤销。asc_post_iap_submission/asc_post_subscription_submission/asc_post_subscription_group_submission— 单独提交 IAP / 订阅 / 订阅组的待审核元数据更改,不必随版本一同发布。已处理好关联关系上的易错点:IAP 使用inAppPurchaseV2关联。asc_get_subscription_grace_period/asc_patch_…— 配置每个 App 的账单宽限期:optIn/sandboxOptIn、时长(3 / 16 / 28 天)、renewalType(所有续订或仅付费转付费续订)。Apple 重试扣款期间,仍可让订阅已过期的用户保留订阅权益。
App Clips
包含 App Clip 的构建上传后,才会出现 App Clip 记录;API 无法创建此记录。以下所有内容都依附于它。
- Clips:
asc_list_app_clips(按应用筛选,支持bundleId过滤)·asc_get_app_clip。 - 默认体验(用于 Safari 横幅、Messages 和默认链接的卡片;每个版本一个):
asc_list_app_clip_default_experiences·asc_get_…·asc_post_…(使用action、发布版本,或使用templateDefaultExperienceId复制上一版本的卡片)·asc_patch_…·asc_delete_…。 - 版本链接:
asc_get_app_store_version_app_clip_default_experience/asc_patch_…(从版本操作)·asc_get_app_clip_default_experience_release_version/asc_patch_…(从体验操作)。Apple 的 API 无法取消链接,只能重新链接。 - 本地化:
asc_list_app_clip_default_experience_localizations·asc_get_…·asc_post_…(语言区域 + 副标题)·asc_patch_…·asc_delete_…。 - 标题图片(每个本地化一个):
asc_upload_app_clip_header_image(复合操作:预留 → PUT 分块 → 使用 MD5 提交)·asc_get_app_clip_header_image(按图片或本地化查询)· 原始asc_post_*/asc_patch_*·asc_delete_*。 - App Review 详情:
asc_get_app_clip_app_store_review_detail(按详情或体验查询)·asc_post_…/asc_patch_…(调用 URL)。 - 高级体验(按 URL 提供的卡片:App Clip 码、NFC、QR、地图地点卡片):
asc_list_app_clip_advanced_experiences(状态 / 地点状态 / 操作过滤器)·asc_get_…· 先调用asc_upload_app_clip_advanced_experience_image,然后调用asc_post_app_clip_advanced_experience(链接、isPoweredBy、默认语言、标题图片、内联本地化内容、可选的place)·asc_patch_…(removed: true会将其下架;localizations会替换所有本地化内容)· 原始图片asc_get_*/asc_post_*/asc_patch_*。 - TestFlight 调用:
asc_get_beta_app_clip_invocation·asc_post_…(构建包 ID、URL、内联标题)·asc_patch_…·asc_delete_…·asc_{post,patch,delete}_beta_app_clip_invocation_localization。
后台资源(由 Apple 托管的资源包)
- 资源包:
asc_list_background_assets(按应用查询;支持归档状态 / 标识符 / 语言区域 / 平台过滤器;显示在内部测试版、外部测试版和 App Store 上发布的版本)·asc_get_background_asset·asc_post_background_asset(assetPackIdentifier,创建后固定)·asc_patch_background_asset(仅限archived)。 - 版本:
asc_list_background_asset_versions(状态 + 按发布渠道筛选发布状态)·asc_get_background_asset_version·asc_post_background_asset_version(由 Apple 分配版本号)·asc_get_background_asset_version_release(track:internalBeta / externalBeta / appStore)。 - 文件:
asc_upload_background_asset_file(复合操作:ASSET 归档文件或 MANIFEST → 预留 → PUT 分块 → 提交)·asc_list_background_asset_upload_files·asc_get_…· 原始asc_post_*/asc_patch_*。提交时会发送sourceFileChecksums.file(默认使用 MD5,也接受 SHA_256);此资源中的单数形式sourceFileChecksum已弃用。
可用性(订阅、IAP、套餐)
应用内产品按地区设置的可用性——与 App Availability 同类,但有一个关键区别:地区关联使用不带修饰的 3 位 ISO 代码(普通 territories),而非应用使用的不透明复合值。
- 订阅:
asc_get_subscription_availability·asc_list_subscription_available_territories·asc_post_subscription_availability(完整替换——发送完整的地区列表;⚠️ 移除的地区将停止销售)。由于 API 4.4 弃用了SubscriptionAvailability,这些读写操作现在改为处理订阅的UPFRONT套餐可用性——实时数据表明它包含相同的地区集合,而且每个订阅都有一个此类套餐。名称和输入参数与之前相同。 - IAP:
asc_get_iap_availability(通过 v2 父级路径读取)·asc_list_iap_available_territories·asc_post_iap_availability(替换语义相同)。 - 订阅套餐(按套餐类型:
UPFRONT= 标准套餐,每个周期预付;MONTHLY= 每月计费,承诺期限为 12 个月):asc_list_subscription_plan_availabilities·asc_list_subscription_plan_available_territories·asc_post_…·asc_patch_…(唯一支持 PATCH 的可用性资源)。
Marketplace Webhook(欧盟替代应用市场)
/v1/marketplaceWebhooks 已弃用。Marketplace 通知现在是 marketplace app 上的常规 Webhook,订阅三个 ALTERNATIVE_DISTRIBUTION_* 事件。asc_list_marketplace_webhooks / asc_post_… / asc_patch_… / asc_delete_… 保留原名称,并操作 /v1/webhooks(创建和列出时需传入 marketplaceAppId);对于在旧版团队级端点上创建的记录,列出、修改或删除时传入 legacy: true。如果应用不是 marketplace app,Apple 会以 409 拒绝这些事件类型——工具会说明这一点。
订阅优惠签名(应用内兑换)
用于生成加密签名,让促销优惠/首次订阅优惠可通过 StoreKit 在 iOS 应用中兑换。使用的签名密钥与 ASC API 密钥分开——可在 App Store Connect → Users and Access → Integrations → In-App Purchase 中获取。环境变量见可选配置部分。基于 Apple 官方 @apple/app-store-server-library 构建。
asc_sign_promotional_offer_legacy— 旧版 ECDSA 拼接签名,用于 StoreKit 1 的SKPaymentDiscount和原始 StoreKit 2Product.PurchaseOption.promotionalOffer(offerID:keyID:nonce:signature:timestamp:)API。返回 base64 签名以及调用方传给 StoreKit 的 nonce、时间戳和 keyId。自动生成 UUID nonce 和当前时间戳;两者均可覆盖,以便测试。asc_sign_promotional_offer— 在 WWDC 2025 引入的 JWS v2 格式(可回移植至 iOS 15)。与 StoreKit 2 较新的促销优惠购买选项搭配使用。直接返回 JWS 紧凑序列化结果。transactionId(客户的appTransactionId)为可选项,但强烈建议提供。asc_sign_introductory_offer_eligibility—aud="introductory-offer-eligibility"的 JWS v2。可覆盖 StoreKit 默认的首次订阅优惠资格检查(例如,允许回头客再次试用)。在 WWDC 2025 中新增。
所有签名自签署时起 24 小时内有效——每次兑换尝试都应重新签名,而不是预先签名后缓存。
年龄评级
问卷 App Review 会根据应用的情况评分——它决定应用能否提交,而此前无法在这里设置。
asc_get_age_rating_declaration— 读取答案。只显示非默认值(典型声明有 29 个属性,几乎全部为NONE/false),以及所有评级覆盖项,这样真正影响评级的少数项目就会格外醒目。asc_patch_age_rating_declaration— 回答问卷。内容问题需要选择频率(NONE/INFREQUENT_OR_MILD/FREQUENT_OR_INTENSE);其余问题为布尔值,此外还有评级覆盖项和 Kids 年龄段。
这项资源有两点容易出错,因此这些工具会替你处理。它隶属于 AppInfo,而非版本——年龄评级是与类别类似的应用级元数据,且 /v1/appStoreVersions/{id}/ageRatingDeclaration 会返回 404。它的 ID 就是 AppInfo ID,因此传入 appId 即可自动解析目标(如果某个应用在多个公证轨道上有多个 AppInfo,工具会报告候选项,而不是自行猜测)。
Apple 写入时会合并:省略的键会保留当前值,因此部分更新是安全的——但不能通过省略某个答案来清除它,必须显式发送 NONE/false。评级覆盖项只会提高评级,不会降低评级。
构建上传
通过 API 而非 Transporter 上传 .ipa / .pkg(API 4.1):创建构建上传(应用 + 版本 + 构建号 + 平台)→ 预留文件 → 将分块 PUT 到 Apple 存储空间 → 使用文件校验和提交。提交时需要 sourceFileChecksums: { file: { hash, algorithm } },这是一个嵌套对象,与截图使用的扁平校验和字符串不同。
asc_upload_build— 从本地文件完成整个流程(MD5 校验和,根据扩展名确定 UTI,dryRun会打印两段请求正文)。随后 Apple 会处理构建;接着使用asc_get_build_uploadasc_list_build_uploads— 按时间倒序列出某个应用的上传:版本、构建、平台、状态(AWAITING_UPLOAD/PROCESSING/COMPLETE/FAILED,附错误和警告数量)以及生成的构建。COMPLETE 上传的构建 ID 与其上传 ID 相同。上传中途放弃的槽位会保持AWAITING_UPLOADasc_get_build_upload(完整错误 / 警告详情)·asc_delete_build_upload(删除槽位;不会影响已处理的构建)- 原始步骤:
asc_post_build_upload·asc_post_build_upload_file·asc_upload_asset_chunk·asc_patch_build_upload_file·asc_list_build_upload_files·asc_get_build_upload_file - 构建包(已处理构建中的应用、App Clips 和扩展):
asc_list_build_bundles·asc_list_build_bundle_file_sizes(每台设备的下载 / 安装大小)·asc_get_build_bundle_app_clip_domain_status(cache或debug)·asc_list_build_bundle_beta_app_clip_invocations
Xcode Cloud(CI/CD)
构建是发布循环中的一环:查看运行记录、读取故障、启动构建。层级:产品 → 工作流 → 构建运行 → 操作(构建/测试/归档/分析)→ 问题/测试结果/制品。运行结束后会关联其生成的 TestFlight 构建,交由 TestFlight 工具处理。
- 读取:
asc_list_ci_products·asc_list_ci_workflows/asc_get_ci_workflow(简明配置摘要:标志、启动条件模式、操作、解析出的 Xcode/macOS — 使用raw:true获取 Apple 完整的约 9 万字符文档) ·asc_list_ci_build_runs(按工作流或产品筛选) /asc_get_ci_build_run·asc_list_ci_build_actions·asc_list_ci_issues·asc_list_ci_test_results·asc_list_ci_artifacts/asc_get_ci_artifact(预签名、有时效的downloadUrl— 无需携带 ASC bearer 即可获取) ·asc_list_ci_build_run_builds(交接给 TestFlight) ·asc_list_ci_environment_versions(Xcode/macOS 目录)。 - SCM 读取:
asc_list_scm_providers·asc_list_scm_repositories·asc_list_scm_git_references(分支/标签引用 ID — 启动构建时需要) ·asc_list_scm_pull_requests。 - 触发:
asc_post_ci_build_run(启动构建 — 可选覆盖分支/标签并设置clean;会消耗团队的计算时长) ·asc_patch_ci_workflow(通过isEnabled暂停/恢复,也可修改clean、名称和描述 — 按设计,启动条件和操作仍由 Xcode 管理)。
推荐提名
向 Apple 编辑团队推荐版本,以争取在 App Store 中获得推荐(Today 标签页、精选合集)。草稿为私密内容;提交后不可撤回。
asc_list_nominations(按 App / 状态 / 类型筛选) ·asc_get_nomination·asc_post_nomination(默认创建可供审核的 DRAFT —submitted:false) ·asc_patch_nomination(编辑草稿;submitted:true会将其发送给 Apple — 无法撤回提交,只能设置archived:true) ·asc_delete_nomination。- 推荐内容写入
description+notes;publishStartDate/publishEndDate用于设定相关时间范围;supplementalMaterialsUris用于提供新闻资料包/TestFlight 链接;接口使用的键名是launchInSelectMarketsFirst(Markets,而非界面中的「店面」用语)。
Game Center:详情、群组、成就、排行榜
Apple v2 路径上的核心 Game Center 模型(所有 /v1 成就/排行榜/集合 CRUD 路径均已弃用)。一个 App 只有一个 Game Center 详情;成就、排行榜和排行榜集合属于该详情,或者在多个 App 共享 Game Center 数据时属于一个 Game Center 群组。每个项目都有需要经过 App Review 的版本,每个版本都有带图片的本地化内容。
- 详情和群组:
asc_get_app_game_center_detail(没有 Game Center 的 App 返回空结果,而非错误)·asc_get_*/asc_post_*/asc_patch_game_center_detail· 群组asc_{list,get,post,patch,delete}_game_center_group(s)·asc_list_game_center_group_details·asc_get_game_center_detail_group。 - 成就、排行榜、排行榜集合:每类都支持 list / get / post / patch / delete。创建时会内联发送第一个版本。所有者必须且只能指定
gameCenterDetailId或gameCenterGroupId之一。 - 版本 → 本地化内容 → 图片:每类都支持 list / get / post,本地化内容支持 get / post / patch / delete;还支持组合式图片上传(预留 → PUT 分块 →
uploaded: true),以及原始预留/提交/删除操作。 - 排序会按你指定的顺序替换所有者的整个列表,因此这些工具会拒绝添加或删除项目的列表。集合成员资格:在集合中添加、替换(重新排序)或移除排行榜;成员本地化内容支持 list / post / patch / delete。
- 审核和提交:
asc_list_game_center_leaderboard_score_moderations·asc_patch_game_center_score_moderation(屏蔽分数)·asc_list_game_center_blocked_players·asc_patch_game_center_detail_player(屏蔽或解除屏蔽玩家)·asc_post_game_center_leaderboard_entry_submission/asc_post_game_center_player_achievement_submission(服务器端分数和成就报告)。截至 2026-10-24,尽管规范中包含相关内容,Apple 对屏蔽玩家和分数审核读取请求仍返回 404。 - 删除操作会预先检查版本状态;使用
force: true可跳过检查。
Game Center:活动、挑战、匹配
面向玩家的 Game Center 界面。活动和挑战属于某个 App 的 Game Center 详情(传入 appId,工具会解析对应内容),也可以属于多个 App 共享的 Game Center 群组。它们的内容保存在随 App Review 提交的版本中:请编辑 PREPARE_FOR_SUBMISSION 版本,而不是线上版本。
- 活动:
asc_list_game_center_activities·asc_get_*/asc_post_*/asc_patch_*(archived: true可让线上活动退役)/asc_delete_game_center_activity·asc_{add,remove}_game_center_activity_{achievements,leaderboards}(v2 ID)。 - 挑战:
asc_list_game_center_challenges(按 referenceName / archived 筛选)·asc_get_*/asc_post_*/asc_patch_*/asc_delete_game_center_challenge·asc_set_game_center_challenge_leaderboard(v2 排行榜)。 - 版本 → 本地化内容 → 图片(两者使用相同工具,名称中包含
activity或challenge):asc_list_*_versions·asc_get_*_version·asc_post_*_version(活动版本还可使用asc_patch_game_center_activity_version设置fallbackUrl)·asc_list_*_localizations+ get / post / patch / delete ·asc_get_*_image(按 ID、本地化内容或版本的默认图片获取)·asc_upload_*_image(组合操作:预留 → PUT 分块 →uploaded: true,无需校验和)+ 原始 post / patch / delete。 - App 版本:
asc_list_game_center_app_versions(每个 App Store 版本对应一个;可按enabled筛选;compatibilityVersionsOf列出兼容版本)·asc_get_*·asc_post_*·asc_patch_game_center_app_version(⚠️enabled: false会为该版本关闭 Game Center)·asc_{add,remove}_game_center_app_version_compatibility。 - 匹配(团队范围,不针对单个 App):规则集
asc_{list,get,post,patch,delete}_game_center_matchmaking_rule_set(s)· 规则和队伍asc_{list,post,patch,delete}_game_center_matchmaking_{rules,teams}(通过其规则集列出)· 队列asc_{list,get,post,patch,delete}_game_center_matchmaking_queue(s)(⚠️ 删除已发布游戏所引用的队列会导致其匹配功能失效)·asc_test_game_center_matchmaking_rule_set(通过规则集对虚构请求进行试运行并返回匹配结果)·asc_get_game_center_matchmaking_{queue,rule}_metrics(以时间序列形式提供请求、队列大小、会话、规则结果和错误数据)。 - 规则表达式基于 JMESPath:字面值需放在反引号中(
requests[0].secondsInQueue >= `5`)。裸数字会导致 409 编译错误。
配置与代码签名
Developer 门户相关功能(fastlane 的 match/sigh/cert 范畴)。**角色门槛:**需要 Admin(或 Account Holder)API 密钥;App Manager/Developer 密钥在此处会收到 403(工具会说明原因)。
- Bundle ID:
asc_list_bundle_ids(按标识符筛选)·asc_get_bundle_id(包含功能和描述文件)·asc_post_bundle_id(标识符不可变——请检查反向 DNS 字符串)·asc_patch_bundle_id(仅重命名)·asc_delete_bundle_id(关联了 App 时会拒绝删除)。 - 功能:
asc_post_bundle_id_capability·asc_patch_bundle_id_capability·asc_delete_bundle_id_capability——更改功能会使现有描述文件失效;之后请重新生成。 - 证书:
asc_list_certificates·asc_get_certificate(base64 DER 内容)·asc_post_certificate(根据 PEM CSR 创建——私钥绝不会发送给 Apple)·asc_delete_certificate(⚠️ DELETE = 吊销;使用该证书进行 CI 签名会立即失效)。 - 描述文件:
asc_list_profiles·asc_get_profile(profileContent= 实际的 base64.mobileprovision)·asc_post_profile·asc_delete_profile。不支持 PATCH——描述文件不可变;轮换时请先删除再重新创建。 - 设备:
asc_list_devices·asc_post_device(⚠️ 实际上是永久操作——设备只能停用,不能删除,并且会计入每年每个类别 100 台的限额)·asc_patch_device(重命名、设为 ENABLED/DISABLED)。 - Pass Type ID(Apple Wallet):
asc_list_pass_type_ids·asc_get_pass_type_id·asc_list_pass_type_id_certificates·asc_post_pass_type_id(标识符不可变)·asc_patch_pass_type_id(仅重命名)·asc_delete_pass_type_id(⚠️ 会吊销其证书;钱包中已有的通行证将停止更新)。 - Merchant ID(Apple Pay):
asc_list_merchant_ids·asc_get_merchant_id·asc_list_merchant_id_certificates·asc_post_merchant_id(标识符不可变)·asc_patch_merchant_id(仅重命名)·asc_delete_merchant_id(⚠️ 所有使用该 ID 的 App 和网站上的 Apple Pay 都会失效)。
用户与访问权限
账号所属团队。**读取免费;所有会更改团队的写入操作都需要确认。**需要 Admin API 密钥。
🔒
confirm: true确认门槛。asc_patch_user、asc_delete_user、asc_add_user_visible_apps、asc_set_user_visible_apps、asc_remove_user_visible_apps、asc_post_user_invitation和asc_delete_user_invitation只有在调用中通过confirm: true时才会向 Apple 发送任何内容。否则,它们会查找该用户并返回拒绝信息,其中会指出用户身份(姓名、登录名、ID、当前角色),并明确说明具体变更:失去和获得的角色、按名称列出的失去访问权限的 App,以及 Account Holder 和 ADMIN 警告。移除用户或更改角色会导致真实用户失去访问权限,因此没有默认选项,也没有force——只有在账号所有者批准了这项具体变更后,才能显式使用confirm: true。
- 用户:
asc_list_users(按用户名 / 角色 / 可见 App 筛选)·asc_get_user·asc_list_user_visible_apps· 🔒asc_patch_user(roles和visibleAppIds会替换当前列表)· 🔒asc_delete_user。 - 可见 App:🔒
asc_add_user_visible_apps· 🔒asc_set_user_visible_apps(替换)· 🔒asc_remove_user_visible_apps。用户设置了allAppsVisible或拥有可访问所有 App 的角色时,此操作不会产生影响。 - 邀请:
asc_list_user_invitations·asc_get_user_invitation·asc_list_user_invitation_visible_apps· 🔒asc_post_user_invitation(发送邮件)· 🔒asc_delete_user_invitation(取消)。不支持 PATCH——请取消邀请后重新邀请。 - 操作者:
asc_list_actors(Apple 要求提供 ID,例如从审核提交的submittedByActor中获取;ID 格式如USER:<uuid>/API_KEY:<key id>)·asc_get_actor。
法律协议
- EULA(产品页面上对客户可见):
asc_get_app_end_user_license_agreement(当应用没有自定义协议时,会返回“标准 EULA”) ·asc_get_end_user_license_agreement·asc_list_end_user_license_agreement_territories·asc_post_end_user_license_agreement·asc_patch_end_user_license_agreement(修改文本和/或替换适用地区) ·asc_delete_end_user_license_agreement(恢复为 Apple 的标准 EULA)。 - TestFlight 测试版许可协议:
asc_list_beta_license_agreements·asc_get_beta_license_agreement·asc_get_app_beta_license_agreement·asc_get_beta_license_agreement_app·asc_patch_beta_license_agreement。每个应用只有一个,由 Apple 创建——无法创建或删除。
沙盒测试员
StoreKit 测试账户,用于端到端测试变现功能。测试员在 ASC 界面中创建;API 用于管理其设置。
asc_list_sandbox_testers·asc_patch_sandbox_tester(地区、interruptPurchases、加速的subscriptionRenewalRate——订阅每隔 3–60 分钟续订一个月) ·asc_post_sandbox_testers_clear_purchase_history(仅清除沙盒环境中的购买记录,以便重新测试购买流程;也会重置新手优惠资格)。
相关读取、关联关系和应用设置
API 4.5.1 中其余与相关资源有关的读取、关联关系写入,以及其他工具已涵盖资源的单项 PATCH/DELETE 操作。
asc_get_related— 一个工具涵盖 48 种相关资源 GET 操作,按"<parent>.<relationship>"键值指定:构建的 app / preReleaseVersion / buildBetaDetail / icons / individualTesters,Beta 测试员的 apps / groups / builds,配置文件的 devices / certificates,Bundle ID 的 capabilities / profiles,应用的ciProduct,CI 产品的 repositories,审核提交的 items,优惠码价格等(工具说明中列出了所有键值)。对于 to-one 读取,如果 Apple 返回data: null,则显示“未关联”。- 与现有列表工具配套的按 ID 读取:
asc_get_analytics_report/_instance/_segment·asc_get_alternative_distribution_package_{delta,variant,version}·asc_get_ci_product·asc_get_ci_build_action·asc_get_ci_issue·asc_get_ci_test_result·asc_get_scm_provider·asc_get_scm_pull_request·asc_get_iap_content·asc_get_app_price_point_v3。 - 应用信息:
asc_get_app_info_category(六个类别槽位之一) ·asc_list_app_info_territory_age_ratings。 - 定价:
asc_list_app_price_schedule_prices/asc_list_iap_price_schedule_prices(按区域手动或自动定价) ·asc_list_price_point_equalizations(应用、IAP 或订阅;adjusted用于读取按月套餐调整后的等价价格——Apple 在此仅接受planType: MONTHLY)。 - TestFlight 指标:
asc_get_beta_tester_usages(应用、Beta 群组,或单个测试员 + 应用;应用/群组结果始终按测试员分组,因为 Apple 要求提供groupBy或筛选条件) ·asc_get_beta_group_public_link_usages·asc_get_build_beta_usages。 asc_get_app_performance_overview—GET /v1/apps/{id}/performanceOverviews(API 4.5,application/vnd.apple.xcode-overview+json)。- 关联关系(
POST添加,DELETE仅移除列出的 ID,PATCH按顺序替换):asc_add/remove_build_beta_groups·asc_add/remove_build_individual_testers·asc_add/remove_beta_tester_beta_groups·asc_add/remove_beta_tester_builds·asc_remove_beta_tester_apps·asc_remove_app_beta_testers·asc_add/remove_app_store_version_localization_search_keywords·asc_add/remove_app_custom_product_page_localization_search_keywords·asc_set_app_screenshot_set_order·asc_set_app_preview_set_order·asc_remove_subscription_prices·asc_remove_subscription_introductory_offers。 asc_post_app_store_version_promotion— 将效果最佳的产品页面优化方案应用于某个版本。- Android → iOS 应用映射:
asc_list_android_to_ios_app_mappings·asc_get_…·asc_post_…(Play 软件包名称 + 应用签名 SHA-256 指纹) ·asc_patch_…·asc_delete_…。 - 导航应用的路由覆盖范围(导航应用的
.geojson文件,每个版本对应一个 to-one 资源):asc_get_routing_app_coverage·asc_upload_routing_app_coverage(组合操作) ·asc_post_…/asc_patch_…·asc_delete_…。 - 设置:
asc_patch_app(App Store Server 通知 URL + 版本、内容权利、主要区域设置、简化购买) ·asc_patch_app_custom_product_page_version(深层链接) ·asc_patch_certificate(activated) ·asc_patch_review_submission_item(resolved/removed) ·asc_delete_ci_workflow·asc_delete_ci_product。
区域
asc_list_territories— 全部 175 个 App Store 区域
PPP 重新平衡
ppp_load_index— 返回随附的 Apple Music 个人计划价格快照,用作 PPP 信号ppp_compute_proposal— 计算各区域的拟议价格表(只读试运行;使用 Apple Music 比率作为隐含 PPP-FX,将价格映射到有效的 Apple 价格档位,应用可配置的舍入策略和下限)。传入resourceType: "subscription"(默认值)和subscriptionId;付费 App 传入resourceType: "app"和appId;IAP 传入resourceType: "iap"和iapId;入门优惠传入resourceType: "introductoryOffer"、subscriptionId,以及offerMode/duration(PAY_AS_YOU_GO还需传入numberOfPeriods;PAY_UP_FRONT默认设为 1);促销优惠传入resourceType: "promotionalOffer"、subscriptionId,以及offerMode/duration/promoOfferName/promoOfferCode(PAY_AS_YOU_GO还需传入numberOfPeriods;PAY_UP_FRONT默认设为 1)。ppp_apply_proposal— 重新计算提案,并在通过 MCP 征询确认后应用到 ASC(无人值守时可使用confirm: true)。如果任何一行的降幅超过maxDropPct(默认 90%),则拒绝执行;跳过 ASC 计费货币与 Apple Music 货币不一致的区域。- 对于订阅:按区域逐个 POST
subscriptionPrices,并以maxConcurrency(默认 2)控制请求间隔;遇到 429 时自动重试;当preserveCurrentPrice: true(默认值)时,为现有订阅者保留原价格。 - 对于 App 和 IAP:通过单个 POST 整体替换价格表(一次 HTTP 调用,原子操作)。App/IAP 没有保留原价机制——新价格会在各条目的
startDate生效。更改基础区域时,必须设置acknowledgeDeletesScheduledIfBaseChanges: true(更改基础区域时,Apple 会清除待生效的定时更改)。 - 对于入门优惠:按区域逐个 POST
subscriptionIntroductoryOffers,并以maxConcurrency控制请求间隔。Δ 列将映射后的优惠价格与该区域当前的常规订阅价格进行比较,因此-50%表示优惠价格为订阅价格的一半。拒绝FREE_TRIAL(没有可计算的价格——若要创建单个全局免费试用,请使用asc_post_subscription_introductory_offer并省略territoryId)。入门优惠是新增而非替换——如果某个(sub, territory)单元格中已有有效优惠,Apple 会返回 409,结果表中的对应行会显示为failed。 - 对于促销优惠:向
/v1/subscriptionPromotionalOffers发出一次原子 POST,在单个请求中创建优惠并设置所有按 PPP 映射价格档位的区域价格。仅支持创建——若offerCode与现有优惠冲突,或该订阅已达到 Apple 的 10 个优惠上限,则拒绝执行。拒绝FREE_TRIAL(没有可计算的价格)。Δ 的报告方式与入门优惠相同,均以当前订阅价格为比较基准。
- 对于订阅:按区域逐个 POST
响应格式
默认情况下,每个列表/获取工具都会返回紧凑的文本表格,便于大模型读取且不占用过多上下文。每个工具也接受以下参数:
raw: true— 返回完整的 JSON:API 负载(data、included、links、meta),用于调试或高级用途。maxItems: number— 限制自动分页的条目数(默认值因工具而异,为 500–1000)。MCP 会跟随links.next,并合并和去重各页中的included资源。
每个工具都会应用稀疏字段集(fields[type]=...),以避免获取未使用的属性。包含 175 个区域的完整价格表会通过一次分页调用(每页 200 条)返回,大小约为未过滤负载的 1/10。
协议支持
同一构建支持 MCP 2026-07-28 修订版和 2025 年版协议,由客户端自行选择。两种方式都无需配置。
在 2026-07-28 版中,服务是无状态的(无需 initialize 握手;能力通过 server/discover 获取),写入确认提示词使用多轮请求:ppp_apply_proposal 会返回 input_required 结果,客户端显示确认信息,然后使用你的回答重新发起同一个工具调用。不支持 elicitation 的客户端会收到提示,要求像以前一样使用 confirm: true 重新运行。
重新进入时会重新计算提案,而不是在往返过程中保留提案,因此在写入任何内容之前,会立即从 App Store Connect 重新读取价格,不会重复使用你暂停考虑之前读取的价格。代价是交互式应用会计算两次:对于 64 个地区的订阅,大约需要 95 秒,而不是 48 秒。使用 confirm: true 的无人值守运行不会询问,因此只计算一次,不受影响。
生产环境行为
在实时 App Store Connect 账户上运行 ppp_apply_proposal 前,有几点值得了解:
- 速率限制处理。 Apple 会将 POST 端点的请求限制在每分钟约 50 次。
client.request会遵循Retry-After标头,并在没有该标头时采用指数退避(2s → 60s,设有上限,最多重试 6 次)。对 60 个地区进行重新平衡时,即使需要退避重试,也能在约 2 分钟内完成,全程无需人工干预。 - 币种不匹配时跳过。 如果随附的 Apple Music 索引将某个地区列为一种币种(例如 BHD),但 ASC 对你的订阅采用另一种币种(USD)计费,PPP-FX 比率在量纲上就不成立。提案会将这些行标记为
currency-mismatch (asc=USD, am=BHD),并从应用集合中排除。在以 USD 计费的海湾市场(BHR、KWT、OMN)很常见。你可以根据需要手动设置这些地区。 - 合理性下限。
floorFactor(默认值为 0.15)是各地区降价幅度相对于当前价格的硬性下限,可防止过时的索引条目将价格压至接近零。若要进行更保守的重新平衡,请传入 0.30 或 0.50。 - 降价合理性上限。
maxDropPct(默认值为 90%)会拒绝应用任何单行降幅超过该值的运行。如果你见过 Apple Music 大幅压低某个市场价格,此设置会在写入 ASC 前拦截由此产生的异常值。 - 在意数据时刷新快照。
data/apple-music-prices.json是人工整理的快照。每个条目都标有日期;提案输出会显示快照日期。Apple Music 价格变动时,请提交拉取请求以更新快照,项目会将其纳入。
匿名错误报告(可选择启用,默认关闭)
此服务会持有你的 App Store Connect 凭据,因此任何离开你设备的数据都必须严格把关。遥测功能默认关闭,只有你明确启用后才会开启,不存在“默认启用、之后再选择退出”的步骤。
appstoreconnect-mcp init 会询问一次。你可以随时更改:
appstoreconnect-mcp telemetry status
appstoreconnect-mcp telemetry on
appstoreconnect-mcp telemetry off
发送的内容
| 发送 | 工具名称(asc_patch_subscription_localization)、HTTP 状态(409)、Apple 的错误 code(ENTITY_ERROR.ATTRIBUTE.INVALID.UNMODIFIABLE)、Apple 的通用 title、JSON 指针(/data/attributes/state)、软件包版本、Node 版本、OS + arch,以及随机生成的安装 UUID。另有每天一次的存活检测 ping。 |
| 绝不发送 | Apple 错误的 detail 文本、请求 URL 或路径、App ID、Bundle ID、App 名称、价格、订阅名称、任何请求或响应正文、你的 issuer ID、key ID,或任何凭据。地理定位已明确禁用($geoip_disable),因此也不会记录基于 IP 推断出的城市、邮政编码或坐标。 |
清理器采用的是允许列表,而不是拒绝列表:Apple 明天新增的字段会从设计上自动排除,而非依赖人工审核。tests/telemetry-scrubbing.test.ts 中的测试会强制验证这一点,对缺失内容的断言与对已包含内容的断言同样严格。
原因
这样一来,像 “Apple 开始对每个 asc_patch_subscription_localization 请求都返回 409” 这样的 Bug,就会作为信号出现,而不是等着有人提交 Issue。这是真实案例——它是人工发现的,而这就是它的自动化版本。
在所有地方关闭它
- 系统会遵循
DO_NOT_TRACK=1,且它的优先级高于显式启用。 ASC_MCP_TELEMETRY=0会彻底禁用;=1会在本次运行中启用,但不会在磁盘上记录同意状态。ASC_MCP_TELEMETRY_HOST/ASC_MCP_TELEMETRY_KEY可让分支指向自己的收集器。
传输采用带 3 秒超时的即发即弃方式:它绝不会阻塞工具调用、抛出异常,也不会写入 stdout(该流是 MCP 协议通道)。
PPP 再平衡技能
examples/ppp-rebalance/ 目录包含一个 Claude Code 技能,可将这些工具封装为购买力平价工作流(试运行 → 安排 → 回滚),并内置了各种注意事项。
mkdir -p ~/.claude/skills && \
ln -s "$PWD/examples/ppp-rebalance" ~/.claude/skills/ppp-rebalance
然后向 Claude 提问:“使用 ppp-rebalance 技能重新平衡我的订阅价格。”
路线图
v0.1–v1.0 涵盖变现 + Beta 分发 + 完整的 App Store 产品页面功能 + 实时促销活动 + 地区 / 发布范围 / 出口合规 + 推送通知 + 收入 / 分析报告 + 客户反馈 + 产品页面 A/B 测试 + 运行时健康状况 / 无障碍功能 + 预订 / 实时外汇汇率:完整的定价 / IAP / 优惠功能(订阅、付费应用、IAP、初始优惠、促销优惠、优惠码活动、签署者),TestFlight(构建版本、Beta 群组、Beta 测试人员、Beta 本地化、Beta 审核提交),按地区划分的产品页面文案(发行说明、描述、关键词、宣传文本),发布生命周期(App Store 版本写入 + V2 审核提交),App 信息 / 类别 / 标签 / 搜索关键词功能(v0.12),屏幕截图 + 预览资源上传 + 自定产品页面(v0.13),App 内活动 + 推广购买(v0.14),App 可用性 + 分阶段发布 + 加密声明(v0.15),TestFlight 反馈闭环——Beta 反馈截图 / 崩溃、构建通知、公开链接招募条件(v0.16),Webhook——按应用推送事件,并提供投递历史、重新投递和测试 ping(v0.17),销售 / 财务报告下载 + 分析报告链路(v0.18),客户评论——读取、回复、摘要(v0.19),App Store 版本实验——包含处理组 + 变体资源的产品页面 A/B 测试(v0.20),诊断 / 性能 / 功耗 / 无障碍功能(v0.21),按地区设置预订 + 基于实时外汇汇率的 PPP(v0.22),以及 EU DMA / 替代分发(v1.0)。计划中的路线图已全部完成。剩下的工作为大模型驱动的运维提供了广阔空间,因为 App Store 的许多工作都依赖判断,涉及文本——例如审核回复、定价定位——模型可以起草,再由人工批准。
| 阶段 | 领域 | 解锁的功能 |
|---|---|---|
| v0.1 ✓ | App · 订阅 · 订阅定价 · PPP 再平衡 | 按购买力安排各地区的价格变更。 |
| v0.2.0 ✓ | App 定价(非订阅):列表 / 价格点列表 / 替换计划 · PPP 计算扩展至 App | 对付费 App 进行 PPP 试运行;通过 asc_post_app_price_schedule 手动应用。 |
| v0.3.0 ✓ | App 内购买项目(v2):列表 / 获取 / 价格计划读写 | 为 IAP(消耗型、非消耗型、非续期订阅)提供相同的变现功能。自动续期订阅仍使用 Subscriptions 工具。 |
| v0.4.0 ✓ | App 和 IAP 的 ppp_apply_proposal 自动应用 · IAP 的 PPP · 价格点列表中的 nearAmount 筛选器 | 一键为所有付费项目进行 PPP 再平衡,而不仅是订阅。 |
| v0.5.0 ✓ | 订阅促销优惠(免费试用 / 按使用付费 / 预付):列表 / 获取 / 发布 / 修改 / 删除 · PPP 扩展至促销优惠 | 根据当地购买力调整的 PPP 感知型“首月”/“前三个月”促销,而不是到处都采用固定的 0.99 美元。 |
| v0.6.0 ✓ | 订阅促销优惠(现有 / 已流失订阅者):列表 / 获取 / 发布 / 修改价格 / 删除 · PPP 扩展至促销优惠(仅创建,单次 POST 原子操作) | 具备 PPP 感知型分地区定价的挽回活动。 |
| v0.7.0 ✓ | 订阅优惠签名:三种签名器(旧版 ECDSA、JWS v2 促销优惠、JWS v2 促销资格),涵盖 Apple 当前支持的所有格式 | 完整的 StoreKit 兑换流程——v0.6 中的促销优惠现在可在 iOS App 中使用,不再只是能在 ASC 中配置。 |
| v0.8.0 ✓ | 订阅优惠代码(活动 CRUD,删除除外 · 各地区价格 · 一次性使用代码批次 · 通过 /values 导出 text/csv)· PPP 扩展至优惠代码活动 | 促销码兑换活动(App Store Connect →“优惠代码”)——生成、停用、导出 CSV。 |
| v0.8.1 ✓ | 订阅优惠代码后续功能:自定义(多次使用)代码(列表/发布/修改)· 批次创建时支持 environment: SANDBOX|PRODUCTION · 活动创建时支持 autoRenewEnabled · 活动摘要现在会显示 autoRenew + prod/sbx 代码数量 · PPP 应用会转发 autoRenewEnabled | 面向公众的可兑换字符串(一个字符串,多次兑换)+ 沙盒与生产批次标记 + 非续期一次性优惠代码。 |
| v0.9.0 ✓ | 覆盖 5 个子域的 TestFlight 功能:构建版本(列表/获取/过期/构建 Beta 详情)· Beta 群组(CRUD + 测试人员关联 + 构建版本关联)· Beta 测试人员(CRUD + 发送/重新发送邀请)· Beta 构建版本本地化(每个构建版本 × 语言区域的 CRUD)· Beta App 本地化(每个 App × 语言区域的 CRUD)· Beta App 审核提交及详情 · 预发布版本(只读)。新增 32 个工具。 | “用这条英文/西班牙文/日文测试说明,邀请这 30 位测试人员体验新构建版本。” |
| v0.10.0 ✓ | 覆盖 4 个界面的 App Store 产品页本地化:App Store 版本(只读列表/获取)· App Store 版本本地化(CRUD — 发行说明 / 描述 / 关键词 / 宣传文本 / 营销和支持 URL)· 订阅本地化(CRUD — 各语言区域的名称 + 描述)· IAP 本地化(CRUD — v2 IAP 界面采用相同结构)。新增 17 个工具。 | 对 LLM 价值最大。使用现有本地化内容作为风格参考,将发行说明翻译成 35 种语言区域,展示差异,并在获批后推送。 |
| v0.10.1 ✓ | 修复:asc_patch_app_store_version_localization 增加状态感知的前置检查——在客户端拒绝不兼容的字段批次,并在 Apple 返回通用 409 STATE_ERROR 之前提供 {state, allowed, blocked, reason, nextEditablePath}。重写 MarketingUrlSchema 描述,以区分 App Store 产品页和 TestFlight 界面。 | 避免针对 READY_FOR_SALE 版本进行无效的 PATCH 往返请求。 |
| v0.11.0 ✓ | App Store 版本写入功能(创建 / 修改 / 带状态门控的删除)+ V2 审核提交流程(创建草稿 → 添加项目 → 提交/取消 + 状态读取)。打通发布流程——无需打开 ASC,即可通过 MCP 端到端发布新版本。 | “将发行说明翻译成 35 种语言区域,并提交 2.5 版进行审核。” |
| v0.12.0 ✓ | App 信息(列表/获取 + 带状态门控的类别关联 PATCH)· AppInfoLocalization CRUD(各语言区域的名称 + 副标题 + 隐私 URL + 隐私文本)· AppCategory 目录(只读,包含子类别)· AppTag(按 App 列表 + PATCH visibleInAppStore 可见性开关)· SearchKeywords 聚合读取界面(按平台 + 语言区域筛选)。新增 12 个工具。 | “将 App 的次要类别从旅行改为体育,然后更新全部 13 种语言区域的副标题。” |
| v0.13.0 ✓ | 资源上传:屏幕快照 + App 预览(分三步:预留 / 分块 PUT / 提交,提供复合快捷工具(asc_upload_screenshot、asc_upload_app_preview)以及供手动控制的原始三步变体)。自定产品页面:页面 + 版本 + 本地化 CRUD,版本带状态门控。记录了线上的键名注意事项(isUploaded→uploaded、isVisible→visible、videoURL→videoUrl),以及创建 CPP 版本时省略无属性块的处理。新增约 25 个工具。 | “根据这些源文件,为 12 种语言区域生成 App Store 屏幕快照,并将其上传到名为 paid-ads-summer 的自定产品页面变体。” |
| v0.14.0 ✓ | App 内活动:AppEvent + AppEventLocalization CRUD,带 10 种状态门控(拒绝 WAITING_FOR_REVIEW / IN_REVIEW),支持 TerritorySchedule 数组(ISO 8601),以及活动屏幕快照 + 视频片段上传(复合工具 + 原始三步流程,复用 v0.13 资源上传助手)。推广购买项目:CRUD + 按 App 排序的关联(裸数组 PATCH;数组顺序即店面顺序)。记录了线上的键名注意事项:isUploaded→uploaded、isVisibleForAllUsers→visibleForAllUsers、isEnabled→enabled。新增约 28 个工具。 | “为你的 App 创建名为‘鲑鱼季开启’的 App 内活动,运行时间为 2026-06-15 至 2026-07-15。” |
| v0.15.0 ✓ | App 可用性 v2(仅 POST 完整替换;3 个字母的 ISO 代码就是 ID;提供预订结束工具)+ 分阶段发布(AppStoreVersion 上的 4 状态生命周期 PATCH)+ 加密声明(仅追加声明 + 构建版本关联 + 复用 v0.13 资源上传的支持文档上传)。记录了线上的键名注意事项:isAvailableInNewTerritories→availableInNewTerritories、isAvailableOnFrenchStore→availableOnFrenchStore、isUploaded→uploaded、downloadURL→downloadUrl。新增约 19 个工具。 | “在 3 个新地区启用你的 App,并开始分阶段发布 2.5 版。” |
| v0.16 ✓ | TestFlight 后续功能:Beta 反馈提交(屏幕快照 + 崩溃反馈列表,支持构建版本/测试人员/设备筛选、崩溃日志文本获取、删除)+ 构建版本 Beta 通知(手动发送“有新构建版本可用”通知;仅关联 POST,完全没有属性块)+ Beta 招募条件(每个 Beta 群组仅对应一个条件;创建/修改/删除 + 有效选项目录 + 兼容构建版本检查)。记录的线上键名注意事项:buildBundleID→buildBundleId(去除末尾的 ID)。Apple 文档有说明反馈和条件的 DELETE 操作,但 Swift SDK 中缺失——已通过 Apple 文档 JSON 验证。点分隔筛选器 filter[build.preReleaseVersion]。新增 14 个工具。 | “按频率和严重程度汇总构建版本 132 的 Beta 反馈,并拟定分类处理清单。” |
| v0.17 ✓ | Webhook:按 App 执行 CRUD(创建时有 5 个必需属性,包括仅写入的 HMAC secret;通过 enabled 暂停/恢复;通过 PATCH 轮换密钥)+ 投递历史(状态/日期筛选,使用详细的 filter[createdDateGreaterThanOrEqualTo] 键;每次尝试均包含响应状态 + 错误)+ 重新投递(带自引用 template 的仅关联 POST)+ 测试 ping。包含 12 种事件类型的目录——BETA_FEEDBACK_*_CREATED 与 v0.16 反馈读取器配套。记录了线上的键名注意事项:isEnabled→enabled、isRedelivery→redelivery、isPing→ping。新增 8 个工具。 | “设置一个 Webhook,让 Slack 频道收到每个新 Beta 构建版本上线的通知;列出自昨天以来 FAILED 的投递并重试。” |
| v0.18 ✓ | 销售和财务报告(非 JSON:API——通过新的 requestBinary 客户端路径下载 gzip 压缩的 TSV;10 种 sales reportTypes × subType × frequency;vendorNumber 可回退使用 ASC_VENDOR_NUMBER 环境变量;TSV 预览摘要 + 使用 saveTo 导出完整文件)+ Analytics Reports 四级链路(请求 ONGOING/ONE_TIME_SNAPSHOT → 按类别获取报告 → 按粒度/processingDate 获取实例 → 获取分段及预签名限时 URL + gzip 解压 CSV 下载工具)。记录的注意事项:isStoppedDueToInactivity→stoppedDueToInactivity、gzip 魔数检测、获取分段 URL 时不携带 ASC bearer。新增 9 个工具。 | “上周巴西的 MRR 为什么下降?与再平衡生效日期进行对比。” |
| v0.19 ✓ | 客户评价:全 App + 按版本筛选的列表(评分/地区筛选、exists[publishedResponse] 未回复队列筛选、评分/日期排序)、评价 + 回复读取、⚠️ 面向公众的回复(每条评价只能有一个回复,重新发布时会替换)+ 删除回复,以及客户评价摘要(Apple 的 AI 聚合产品页摘要;必须提供 filter[platform])。记录的注意事项:isExistsPublishedResponse→exists[publishedResponse](exists 参数去除变体)、filter[rating] 接受字符串。新增 6 个工具。 | “为最新版本中提到导出错误的每条 1 星评价拟一条回复。发布前先给我查看。” |
| v0.20 ✓ | App Store 版本实验 V2(产品页 A/B 测试,关联 App——跳过已弃用的 v1 界面):实验 CRUD,带启动标志生命周期门控(⚠️ 启动后会面向客户;先通过 v0.11 审核提交流程提交),处理组(+ 替代图标测试),处理组本地化;变体屏幕快照/预览使用现有 v0.13 资源工具(parentType 为 appStoreVersionExperimentTreatmentLocalizations)。记录的注意事项:isStarted→started、列表路径 /v1/apps/{id}/appStoreVersionExperimentsV2 与 CRUD /v2/appStoreVersionExperiments。新增 12 个工具。 | “针对蓝色图标与当前图标设置 A/B 测试,流量占比为 30%,提供英文和德文屏幕快照。” |
| v0.21 ✓ | 运行时健康状况 + 无障碍功能:按构建版本提供诊断特征(DISK_WRITES/HANGS/LAUNCHES 热点,按影响加权)+ 匿名化调用栈日志(application/vnd.apple.diagnostic-logs+json)+ App 和构建版本级别的 Xcode 性能/功耗指标(application/vnd.apple.xcode-metrics+json,8 种指标类型)+ 无障碍声明 CRUD(“无障碍营养标签”:DRAFT → 发布门控 ⚠️ 面向客户 → REPLACED)。记录的注意事项:迄今最大的 is 去除系列(9 个 isSupports*→supports* + isPublish→publish),通过 Accept 覆盖支持两种非 JSON:API 内容类型。新增 8 个工具。 | “哪些调用栈会导致 2.5.0 构建版本挂起?将其启动时间百分位数与 App 基线进行比较。” |
| v0.22 ✓ | 按地区设置预订(PATCH territoryAvailabilities:available ⚠️ / releaseDate / preOrderEnabled——补全 v0.15 可用性功能)+ 为货币不匹配的地区提供真实汇率(ppp_compute_proposal 和 ppp_apply_proposal 均支持 fxRates:用户提供的每单位美元汇率可解决 Apple Music 以本地货币定价、而店面以美元结算的问题;经汇率调整的行会标记 *;此服务绝不从第三方获取汇率——按设计仅允许连接 Apple)。新增 1 个工具 + PPP 引擎升级。 | “在日本开放 9 月 1 日的预订;使用今天的 BHD/KWD/OMR 汇率重新平衡海湾地区的价格。” |
| v1.0 ✓ | 欧盟 DMA / 替代分发(受权限限制——如果账户尚未加入计划,工具会说明 403 错误):网络分发域名(注册/列表/删除 ⚠️)、公开签名密钥(私钥部分绝不会发送给 Apple)、按版本提供带预签名下载 URL 的签名包 + 变体 + 增量包、市场搜索详情(catalogURL→catalogUrl 去除变体)、市场 Webhook(endpointURL→endpointUrl 去除变体,仅写入的密钥)。新增 19 个工具。 | “为网络分发打包 3.0 版,并将签名 URL 交给 CDN。” |
| v1.1.0 ✓ | 订阅挽回优惠——第三种优惠类型,面向已流失的订阅者(Apple 会自动向符合条件的已流失客户展示):列表 / 获取 / 价格列表 / 发布 / 修改 / 删除。比促销优惠更丰富:资格定位(付费时长 + 距上次订阅时间的 {min,max} 范围 + 等待间隔)、计划(开始/结束)、优先级,以及自动资源 promotionIntent;PATCH 仅修改属性(标识和价格不可变,需删除后重新创建才能更改)。新增 6 个工具。 | “使用 PPP 定价的三个月优惠挽回 1–6 个月前流失的订阅者,并由 Apple 自动展示优惠。” |
| v1.2.0 ✓ | IAP + 订阅审核素材——Apple 要求在提交 IAP / 订阅前提供的 App Store 审核截图,以及推广图片。四种资源(IAP / 订阅 × 图片 / 审核截图),采用 v0.13 的三步上传流程,通过一个配置表驱动:组合式 asc_upload_* + 原始 reserve / commit / delete + 读取操作。图片支持多个,审核截图仅支持一个(重复上传会被拒绝)。已处理一个容易踩坑的接口细节:IAP 图片通过 inAppPurchase 关联,IAP 审核截图通过 inAppPurchaseV2 关联。新增 22 个工具。 | “为我的新订阅附上审核截图,这样我就可以提交了。” |
| v1.4.0 ✓ | 年龄分级声明——读取并 PATCH App Review 对应用进行评分时使用的问卷(13 个频率枚举、11 个布尔值、分级覆盖项、儿童年龄段)。此资源隶属于 AppInfo,而非版本;声明 ID == appInfo ID(根据 appId 解析)。Apple 会在 PATCH 时合并数据。新增 2 个工具。 | “填写年龄分级问卷,以便提交 3.0 版本。” |
| v1.5.0 ✓ | 完整的发布闭环:可用性(按地区设置订阅 / IAP / 计划类型的可用性——使用纯 ISO 代码关联地区,仅支持 POST 全量替换)+ App Review 详情(每个版本的联系人 / 演示账户 / 备注),并将审核附件作为第 5 种上传工厂资源 + 发布请求(立即发布已批准的版本)+ 独立项目提交(无需发布版本即可提交 IAP / 订阅 / 群组审核)+ 账单宽限期。新增约 25 个工具。 | “填写审核卡片,附上演示视频,提交新订阅,并发布已批准的构建版本。” |
v0.1→v1.0 路线图已完成——所有最初规划的功能均已交付。1.0 之后的工作将跟进 Apple API 的变化(新增资源、契约变更——参见 scripts/audit-fieldsets.py + scripts/audit-required-attributes.py):v1.1.0 新增挽回优惠,v1.2.0 新增 IAP / 订阅审核素材(填补“没有审核截图就无法提交”的缺口),v1.4.0 新增年龄分级声明,v1.5.0 完善准备→提交→发布闭环(可用性、审核详情 / 附件、独立提交、发布请求、宽限期);App Asset Library(API 4.5.1)则取代了基于集合的截图 / 预览 / 活动素材工具。
不在范围内(Fastlane / Xcode 已能很好地处理):配置描述文件、证书、设备、功能、Game Center 配置。
可以把它看作 App Store Connect 运维的 LLM 助手。Fastlane 用于构建 / 发布流水线;本项目则用于发布后的知识工作——发布生命周期、翻译、定价、ASO、客户反馈、商店内推广和分析。
每个新领域都由 src/domains/<name>.ts 下的一个文件,以及 src/index.ts 中的一个 register* 调用组成。欢迎贡献——参见 CONTRIBUTING.md。
开发
git clone https://github.com/akoskomuves/appstoreconnect-mcp.git
cd appstoreconnect-mcp
npm install
npm run dev # tsx watch mode
npm test
npm run build
贡献流程(changesets、PR 模板、分支命名)请参见 CONTRIBUTING.md。
许可证
MIT © 2026 Akos Komuves
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。