mcpField
A
appstoreconnect-mcp

appstoreconnect-mcp

本地服务
github.com/akoskomuves开发工具53 天前更新

关于 appstoreconnect-mcp

appstoreconnect-mcp 是用于从兼容客户端管理 App Store Connect 应用和产品的 MCP 服务。其工具涵盖订阅与应用定价、订阅及 App 内购买,并提供连接设置和诊断功能。

主要功能

  1. 01列出和获取应用
  2. 02创建和管理订阅
  3. 03读取及安排订阅价格
  4. 04管理应用价格计划
  5. 05管理 App 内购买

适用场景

  1. 01按地区查看订阅价格
  2. 02安排订阅价格变更
  3. 03创建和更新订阅产品
  4. 04检查应用及 App 内购买定价

MCP 相关

它将 App Store Connect API 操作作为工具提供给 MCP 客户端,涵盖应用、订阅、定价和 App 内购买工作流。设置向导可将服务注册到所选 MCP 客户端。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"akoskomuves-appstoreconnect": {
"command": "npx",
"args": [
"-y",
"@akoskomuves/appstoreconnect-mcp"
],
"env": {
"ASC_ISSUER_ID": "<ASC_ISSUER_ID>",
"ASC_KEY_ID": "<ASC_KEY_ID>",
"ASC_PRIVATE_KEY_PATH": "<ASC_PRIVATE_KEY_PATH>",
"ASC_VENDOR_NUMBER": "<ASC_VENDOR_NUMBER>"
}
}
}
}
启动命令npx -y @akoskomuves/appstoreconnect-mcp
需要配置的环境变量
ASC_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@akoskomuves/appstoreconnect-mcp1.0.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

appstoreconnect-mcp

npm CI License: MIT

一个用于 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

向导会:

  1. 打开 App Store Connect → Keys,以便你下载 .p8(如果已有密钥,则跳过)。
  2. 将密钥复制到 ~/.appstore/ 并设置 chmod 600。
  3. 提示你输入 Issuer ID 和(自动检测到的)Key ID。
  4. 在写入任何内容前,通过真实 API 调用验证身份验证。
  5. 检测已安装的 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_IDKeys 页面上的 Issuer UUID
ASC_KEY_ID10 位字符的 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_IDIn-App Purchase 密钥标签页中的 Issuer UUID(与 ASC_ISSUER_ID 不同)
ASC_IAP_KEY_IDIAP 密钥的 10 位字符 Key ID
ASC_IAP_PRIVATE_KEY_PATHIAP 签名 .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 网页界面。共有四个名称,客户实际能看到的只有两个:

资源属性谁能看到
SubscriptionGroupreferenceName仅内部
SubscriptionGroupLocalizationname客户 — 套餐选项上方的标题
Subscriptionname仅内部
SubscriptionLocalizationname客户 — 单个套餐
  • 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_localization
  • asc_post_subscription_group_localization — name + locale,以及可选的 customAppName(用于覆盖订阅面板中显示的 app 名称;通常省略)。已处理线协议中的注意事项:父级关系键为 subscriptionGroup,而 Subscription 将同一父级称为 group
  • asc_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_prices
  • asc_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 不允许删除当前仍可兑换的优惠;如需停止优惠,请将 endDate PATCH 为今天。
订阅促销优惠

促销优惠面向现有或已过期的订阅者——与入门优惠的适用对象相反,资格由资源类型本身决定(每个优惠没有单独的标志)。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 返回的 appStoreReviewDetail ID。
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 2 Product.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_upload
  • asc_list_build_uploads — 按时间倒序列出某个应用的上传:版本、构建、平台、状态(AWAITING_UPLOAD / PROCESSING / COMPLETE / FAILED,附错误和警告数量)以及生成的构建。COMPLETE 上传的构建 ID 与其上传 ID 相同。上传中途放弃的槽位会保持 AWAITING_UPLOAD
  • asc_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(没有可计算的价格)。Δ 的报告方式与入门优惠相同,均以当前订阅价格为比较基准。
响应格式

默认情况下,每个列表/获取工具都会返回紧凑的文本表格,便于大模型读取且不占用过多上下文。每个工具也接受以下参数:

  • 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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。