mcpField
A
appstore-connect

appstore-connect

本地服务
github.com/SardorbekR开发工具221 周前更新

关于 appstore-connect

appstore-connect 是面向 Apple 平台开发者的 MCP 服务,可通过 MCP 客户端管理 App Store Connect 中的应用、版本、TestFlight 和商业信息。它既提供常用管理工具,也可按 Apple OpenAPI 规范访问 API 操作,并支持只读模式和工具组筛选。

主要功能

  1. 01访问 App Store Connect API 操作
  2. 02管理应用版本与提交发布
  3. 03管理 TestFlight 测试与测试者
  4. 04编辑本地化、截图和应用内购买
  5. 05查看分析、销售与诊断报告
  6. 06按工具组筛选并启用只读模式

适用场景

  1. 01准备并提交应用版本审核
  2. 02管理 TestFlight 测试组和测试者
  3. 03更新应用商店描述、关键词和截图
  4. 04查看应用分析及销售报告

MCP 相关

作为 MCP 服务,它向 Claude、Cursor 等兼容客户端提供 App Store Connect 管理工具。可筛选公开的工具组,也可开启只读模式以阻止写入请求。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"sardorbekr-appstore-connect": {
"command": "npx",
"args": [
"-y",
"asc-mcp"
]
}
}
}
启动命令npx -y asc-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmasc-mcp2.0.4

工具

还没有获取到工具列表

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

详细介绍

App Store Connect MCP 服务

npm version License: MIT Node.js Version

这是一款用于 Apple App Store Connect API 的模型上下文协议(MCP)服务。可直接通过 Claude、Cursor 或任何兼容 MCP 的客户端管理你的 iOS、macOS、tvOS 和 visionOS 应用。

功能

  • 任意 API 操作 - 通过 asc_api_request 调用 1,303 项 App Store Connect API 操作,并根据 Apple 的 OpenAPI 规范进行验证;使用 asc_api_search 和 asc_api_describe 查找和检查这些操作
  • 提交与发布 - 编辑版本元数据(版权、版本字符串、发布类型)、附加构建版本、管理 App Review 详情和审核提交、分阶段发布与手动发布,以及出口合规信息
  • App 信息 - 类别、年龄分级声明、App 信息本地化、自定义 EULA
  • App Store 本地化 - 对版本描述、关键词和更新内容执行完整的 CRUD 操作
  • App 管理 - 列出并检查所有平台上的应用
  • 版本控制 - 创建和管理 App Store 版本
  • TestFlight - 群组、构建版本访问权限、测试人员和邀请、测试说明、Beta App 本地化、Beta 审核提交
  • 屏幕截图与预览 - 上传、重新排序和删除屏幕截图及 App 预览;查看订阅和 App 内购买项目的审核屏幕截图
  • 客户评价 - 阅读评价并发布或删除回复
  • Bundle ID 管理 - 对 Bundle ID 执行完整的 CRUD 操作
  • 设备管理 - 列出并检查已注册设备
  • 用户管理 - 列出并检查团队用户
  • 构建版本管理 - 列出并检查 App 构建版本
  • 类别与定价 - 浏览类别,查看价格和可用性
  • 定价与 PPP - 设置各地区价格,支持购买力平价
  • 订阅 - 群组、订阅、本地化、定价与 PPP、可用性、促销优惠、入门优惠和挽回优惠、优惠代码
  • App 内购买项目 - 创建和管理一次性购买项目(终身/非消耗型、消耗型、非自动续期):元数据、本地化、定价与 PPP、可用性、优惠代码、审核屏幕截图和审核提交
  • 自定义产品页面 - 页面、版本以及各语言环境的宣传文本
  • 分析报告 - 请求并下载 App 分析报告(参与度、商业、使用情况、性能)
  • 销售与财务 - 下载销售、趋势和财务报告
  • 性能与诊断 - App/构建版本的功耗与性能指标,以及诊断日志
  • 工具集与只读模式 - 仅开放所需的工具组,或使用 ASC_READ_ONLY=1 禁止所有写入操作
  • 默认安全 - 使用 ES256 JWT 身份验证并自动刷新令牌,在日志中隐藏凭证

目录

快速开始

  1. 获取 App Store Connect API 密钥(请参阅前置条件)。
  2. 使用 npx -y asc-mcp@latest 和你的凭证,将服务添加到 MCP 客户端(请参阅 MCP 客户端配置)。
  3. 重启客户端。每次重启时都会获取最新版本。

安装

npx(推荐)
npx -y asc-mcp@latest

MCP 客户端会自行运行此命令(请参阅 MCP 客户端配置)。npx 会在客户端每次启动时获取最新版本,确保你始终使用最新版本。

全局安装
npm install -g asc-mcp

然后在客户端配置中使用 "command": "asc-mcp"。全局安装不会自动更新:运行 npm install -g asc-mcp@latest 进行更新。

更新
  • npx: 重启 MCP 客户端。正在运行的客户端会继续使用启动时的版本。
  • 全局安装: 执行 npm install -g asc-mcp@latest,然后重启客户端。
  • 固定版本以保持稳定:使用 [email protected](或任意版本),而不是 asc-mcp@latest。

服务每天会在后台向 npm 查询一次最新版本,不会延迟启动。如果你使用的版本较旧,那么下次服务启动时,它会告知你的助手,助手会提醒你一次。它只会发送该请求,不会安装任何内容。设置 ASC_DISABLE_UPDATE_CHECK=1 可关闭此功能。

从源代码构建
git clone https://github.com/SardorbekR/appstore-connect-mcp.git
cd appstore-connect-mcp
npm install
npm run build

配置

前置条件:获取 Apple API 凭据
  1. 登录 App Store Connect
  2. 前往 Users and Access → Integrations → App Store Connect API
  3. 点击 Generate API Key(或使用现有密钥)
  4. 选择合适的角色(建议使用 Admin 或 App Manager)
  5. 下载 .p8 文件——该文件只能下载一次!
  6. 记下你的 Key ID(显示在密钥列表中)
  7. 记下你的 Issuer ID(显示在页面顶部)
环境变量
变量必需描述
APP_STORE_CONNECT_KEY_ID是你的 API Key ID(例如:ABC123DEFG)
APP_STORE_CONNECT_ISSUER_ID是你的 Issuer ID(UUID 格式)
APP_STORE_CONNECT_P8_PATH是*.p8 私钥文件的路径
APP_STORE_CONNECT_P8_CONTENT是*.p8 密钥的原始内容(可替代路径)

*必须设置 P8_PATH 或 P8_CONTENT 其中之一。

可选设置:

变量默认值描述
ASC_TOOLSETSall要公开的工具组,以逗号分隔:apps、versions、media、testflight、pricing、subscriptions、iap、reviews、product-pages、provisioning、users、analytics、api。工具越少,工具预算较小的客户端所需的上下文就越少。api 组可以访问所有操作,包括其他组未涵盖的操作。
ASC_READ_ONLYoff设置为 1 时仅公开读取工具,并使客户端拒绝所有非 GET 请求
ASC_MAX_RESPONSE_CHARS80000asc_api_request 结果的大小上限;较大的结果会在页面边界处截断,并提供用于继续获取的 cursor
ASC_DISABLE_UPDATE_CHECKoff设置为 1 时,跳过每天一次的 asc-mcp 新版本检查
MCP 客户端配置
Claude Desktop

将以下内容添加到 Claude Desktop 配置文件:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "app-store-connect": {
      "command": "npx",
      "args": ["-y", "asc-mcp@latest"],
      "env": {
        "APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
        "APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
        "APP_STORE_CONNECT_P8_PATH": "/absolute/path/to/AuthKey.p8"
      }
    }
  }
}
Cursor

将以下内容添加到 Cursor MCP 设置中(Settings → MCP Servers):

{
  "mcpServers": {
    "app-store-connect": {
      "command": "npx",
      "args": ["-y", "asc-mcp@latest"],
      "env": {
        "APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
        "APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
        "APP_STORE_CONNECT_P8_PATH": "/absolute/path/to/AuthKey.p8"
      }
    }
  }
}
VS Code with Continue

将以下内容添加到 Continue 配置中:

{
  "mcpServers": {
    "app-store-connect": {
      "command": "npx",
      "args": ["-y", "asc-mcp@latest"],
      "env": {
        "APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
        "APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
        "APP_STORE_CONNECT_P8_PATH": "/absolute/path/to/AuthKey.p8"
      }
    }
  }
}
使用 P8 内容而非路径

对于 CI/CD 或容器化环境,可以直接传入密钥内容:

{
  "mcpServers": {
    "app-store-connect": {
      "command": "npx",
      "args": ["-y", "asc-mcp@latest"],
      "env": {
        "APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
        "APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
        "APP_STORE_CONNECT_P8_CONTENT": "-----BEGIN PRIVATE KEY-----\nMIGT...your key here...AB12\n-----END PRIVATE KEY-----"
      }
    }
  }
}

可用工具

应用
工具描述参数
list_apps列出账户中的所有应用limit?(数字,1-200)
get_app获取指定应用的详细信息appId(字符串,必需)
版本
工具描述参数
list_app_versions列出应用的所有版本appId、platform?、versionState?、limit?
get_app_version获取版本详细信息versionId
create_app_version创建新的应用版本appId、platform、versionString、releaseType?
版本本地化
工具描述参数
list_version_localizations列出某个版本的本地化内容versionId, limit?
get_version_localization获取本地化详情localizationId
create_version_localization添加新的地区语言versionId, locale, description?, keywords?, whatsNew?
update_version_localization更新本地化内容localizationId, description?, keywords?, whatsNew?, promotionalText?
delete_version_localization移除地区语言localizationId
App 信息本地化
工具描述参数
list_app_infos列出 App 信息记录appId, limit?
list_app_info_localizations列出名称/副标题本地化内容appInfoId, limit?
update_app_info_localization更新 App 名称和副标题localizationId, name?, subtitle?, privacyPolicyUrl?
Beta 测试(TestFlight)
工具描述参数
list_beta_groups列出某个 App 的 Beta 测试组appId, limit?
list_beta_testers列出某个测试组中的测试者betaGroupId, limit?
add_beta_tester将测试者添加到测试组betaGroupId, email, firstName?, lastName?
remove_beta_tester从测试组中移除测试者betaGroupId, betaTesterId
屏幕截图
工具描述参数
list_screenshot_sets列出屏幕截图集localizationId, limit?
list_screenshots列出截图集中的屏幕截图screenshotSetId, limit?
upload_screenshot上传新的屏幕截图screenshotSetId, fileName, fileSize, filePath
Bundle ID
工具描述参数
list_bundle_ids列出所有 Bundle IDlimit?, platform?
get_bundle_id获取 Bundle ID 详情bundleIdId
create_bundle_id注册新的 Bundle IDidentifier, name, platform
update_bundle_id更新 Bundle ID 名称bundleIdId, name
delete_bundle_id删除 Bundle IDbundleIdId
设备
工具描述参数
list_devices列出已注册的设备limit?, platform?, status?
get_device获取设备详情deviceId
用户
工具描述参数
list_users列出团队用户limit?, roles?
get_user获取用户详情userId
构建版本
工具描述参数
list_builds列出某个 App 的构建版本appId, limit?
get_build获取构建版本详情buildId
类别与定价
工具描述参数
list_app_categories列出 App 类别limit?, platform?
get_app_price_schedule获取 App 定价信息appId
get_app_availability获取 App 在各地区的上架情况appId
定价(PPP)
工具描述参数
list_territories列出所有地区及其货币limit?
list_app_price_points列出某个 App 可用的价格等级appId, territory?, limit?
get_price_point_equalizations获取各国的 PPP 等值价格pricePointId, territories?, limit?
set_app_prices设置各地区的手动定价(替换整个价格计划)appId, baseTerritory, manualPrices
App 内购买项目(终身/非消耗型)

通过 Apple 的 App 内购买项目 v2 API 进行一次性购买。create_in_app_purchase 默认使用 NON_CONSUMABLE,即“终身”解锁。要发布一项购买:创建 → 添加本地化内容 → 设置价格 → 设置可用性 → 提交审核。

注意: App Review 通常要求为 App 内购买项目提供审核截图。这些工具目前尚不支持上传 App 内购买项目审核截图——如果因缺少截图而被 submit_in_app_purchase_for_review 拒绝,请在 App Store Connect 中添加截图。

工具描述参数
list_in_app_purchases列出 App 的 App 内购买项目,可按类型筛选appId、inAppPurchaseType?、limit?
get_in_app_purchase获取单个 App 内购买项目的详细信息和状态inAppPurchaseId
create_in_app_purchase创建一项 IAP(默认为 NON_CONSUMABLE/终身)appId、name、productId、inAppPurchaseType?、familySharable?、reviewNote?
update_in_app_purchase更新名称、家人共享或审核备注(productId/type 不可更改)inAppPurchaseId、name?、familySharable?、reviewNote?
delete_in_app_purchase删除一项 App 内购买项目inAppPurchaseId
list_in_app_purchase_localizations列出本地化名称/描述inAppPurchaseId、limit?
create_in_app_purchase_localization添加本地化显示名称(及描述)inAppPurchaseId、locale、name、description?
update_in_app_purchase_localization更新本地化内容localizationId、name?、description?
delete_in_app_purchase_localization删除本地化内容localizationId
list_in_app_purchase_price_points列出价格点(客户价格和收益)inAppPurchaseId、territory?、limit?、offset?
get_in_app_purchase_price_point_equalizations获取 Apple 提供的、与基础价格点等值的 PPP 价格点pricePointId、territories?、limit?
set_in_app_purchase_price设置价格(替换价格计划;指定一个基础地区以自动换算,或提供完整的 PPP 列表)inAppPurchaseId、baseTerritory、manualPrices
list_in_app_purchase_prices查看当前各地区价格(手动价格;可选包含自动价格)inAppPurchaseId、territory?、includeAutomatic?、limit?
get_in_app_purchase_availability获取地区可用性inAppPurchaseId
set_in_app_purchase_availability设置地区可用性inAppPurchaseId、availableInNewTerritories、territories?
submit_in_app_purchase_for_review将 IAP 提交给 App Review(独立于 App 版本)inAppPurchaseId
Analytics 报告
工具描述参数
create_analytics_report_request请求 Analytics 报告(持续报告或一次性快照)appId、accessType
list_analytics_report_requests列出某个 App 的 Analytics 报告请求appId
get_analytics_report_request获取 Analytics 报告请求requestId
delete_analytics_report_request删除 Analytics 报告请求requestId
list_analytics_reports列出请求中可用的报告requestId
list_analytics_report_instances按日期列出报告实例reportId
list_analytics_report_segments列出报告实例中可下载的分段instanceId
download_analytics_report_segment下载报告分段url
销售与财务
工具描述参数
get_sales_report下载销售/趋势报告vendorNumber、reportType、reportSubType、frequency、reportDate
get_finance_report下载财务报告vendorNumber、regionCode、reportDate、reportType
性能与诊断
工具描述参数
get_app_perf_metrics获取应用的功耗与性能指标appId、metricType
get_build_perf_metrics获取构建的性能指标buildId、metricType
list_diagnostic_signatures列出构建的诊断特征buildId
list_diagnostic_logs列出某个特征的诊断日志signatureId
任意 API 操作(通用)
工具描述参数
asc_api_request调用任意 App Store Connect API 操作(来自 Apple OpenAPI 4.5.1 的 1303 项操作)。method?、path?、query?、body?、paginate?、maxItems?、cursor?、allowUnknown?
asc_api_search按关键词搜索 App Store Connect API 操作索引(匹配路径、操作 ID、资源类型),例如“分阶段发布”、“客户评价”、“优惠码”。query、method?、limit?
asc_api_describe描述一项 App Store Connect API 操作:查询参数及其允许值、请求体属性(类型、枚举、必填项)、关联关系,以及最简请求体模板。method、path
订阅
工具描述参数
list_subscription_groups列出应用的所有订阅组。appId、limit?
get_subscription_group根据订阅组 ID 获取特定订阅组的详细信息。subscriptionGroupId
create_subscription_group为应用创建新的订阅组。appId、referenceName
update_subscription_group更新订阅组的参考名称。subscriptionGroupId、referenceName
list_subscription_group_localizations列出订阅组的所有本地化信息。subscriptionGroupId、limit?
get_subscription_group_localization根据 ID 获取单个订阅组本地化信息。localizationId
create_subscription_group_localization为订阅组创建本地化信息。subscriptionGroupId、name、locale、customAppName?、customAppDescription?
update_subscription_group_localization更新现有的订阅组本地化信息。localizationId、name?、customAppName?、customAppDescription?
list_subscriptions列出订阅组中的所有自动续期订阅。subscriptionGroupId、limit?
get_subscription根据 ID 获取特定自动续期订阅的详细信息。subscriptionId
create_subscription在订阅组中创建新的自动续期订阅。subscriptionGroupId、name、productId、subscriptionPeriod、familySharable?、reviewNote?、groupLevel?
update_subscription更新现有自动续期订阅的元数据。subscriptionId、name?、familySharable?、subscriptionPeriod?、reviewNote?、groupLevel?
delete_subscription删除自动续期订阅。subscriptionId
list_subscription_localizations列出订阅的所有本地化信息(翻译后的名称和描述)。subscriptionId、limit?
create_subscription_localization为订阅创建特定语言区域的本地化名称和描述。subscriptionId、name、locale、description?
update_subscription_localization更新订阅本地化信息中的本地化名称或描述。localizationId、name?、description?
delete_subscription_localization删除订阅的本地化信息。localizationId
list_subscription_price_points列出订阅的可用价格点,并显示客户价格和开发者所得。subscriptionId、territory?、limit?、offset?
list_subscription_prices列出订阅当前设置的价格,包括价格等级和地区详情。subscriptionId、territory?、limit?
get_subscription_availability获取订阅的地区可用性配置,显示该订阅在哪些地区可用,以及是否会自动在新地区提供。subscriptionId
set_subscription_availability设置订阅的地区可用性。subscriptionId、availableInNewTerritories、territories?
create_subscription_price设置订阅在特定地区的价格。subscriptionId、subscriptionPricePointId、startDate?、preserveCurrentPrice?
list_promotional_offers列出为订阅配置的所有促销优惠。subscriptionId、limit?
create_promotional_offer为订阅创建促销优惠。subscriptionId、name、offerCode、duration、offerMode、periodCount、prices?
update_promotional_offer替换促销优惠的各地区价格列表。promotionalOfferId、prices
delete_promotional_offer从订阅中删除促销优惠。promotionalOfferId
list_promotional_offer_prices列出为促销优惠设置的价格,以及解析后的价格等级和地区详情。promotionalOfferId、limit?
版本管理与 App 审核详情
工具描述参数
update_app_version更新 App Store 版本的版本字符串、版权信息、发布类型或计划发布日期。versionId、versionString?、copyright?、releaseType?、earliestReleaseDate?
delete_app_version删除 App Store 版本。versionId
get_app_version_build获取关联到 App Store 版本的构建版本(未关联时为 null)。versionId
set_app_version_build将构建版本关联到 App Store 版本。versionId、buildId
get_review_detail获取版本的 App 审核详情:联系人、演示账户和审核备注。versionId
create_review_detail为尚无详情的版本创建 App 审核详情。contactFirstName 和 contactPhone 为必填项。versionId、contactFirstName、contactPhone、contactLastName?、contactEmail?、demoAccountName?、demoAccountPassword?、demoAccountRequired?、notes?
update_review_detail更新 App 审核详情(联系人、演示账户、备注)。reviewDetailId、contactFirstName?、contactLastName?、contactPhone?、contactEmail?、demoAccountName?、demoAccountPassword?、demoAccountRequired?、notes?
发布与出口合规
工具描述参数
get_phased_release获取 App Store 版本的分阶段发布(逐步推出)状态。versionId
create_phased_release为 App Store 版本创建分阶段发布。versionId、phasedReleaseState?
update_phased_release将分阶段发布状态更改为 ACTIVE、PAUSED 或 COMPLETE。phasedReleaseId、phasedReleaseState、confirmReleaseToAll?
delete_phased_release删除 App Store 版本的分阶段发布。phasedReleaseId
release_app_version发布已获批准且正在等待开发者发布的 App Store 版本(PENDING_DEVELOPER_RELEASE)。versionId
list_encryption_declarations列出 App 的出口合规(加密)声明。appId、limit?
get_encryption_declaration根据 ID 获取一项出口合规(加密)声明。declarationId
create_encryption_declaration为 App 创建出口合规(加密)声明。appId、appDescription、containsProprietaryCryptography、containsThirdPartyCryptography、availableOnFrenchStore
assign_builds_to_encryption_declaration将构建版本关联到加密声明。declarationId、buildIds
update_build更新构建版本的 usesNonExemptEncryption 标志、加密声明,或将其设为过期。buildId、expired?、confirmExpire?、usesNonExemptEncryption?、appEncryptionDeclarationId?
App 审核提交
工具描述参数
list_review_submissions列出 App 的审核提交,可按状态或平台筛选。appId、state?、platform?、limit?
get_review_submission获取审核提交及其包含的项目。submissionId
create_review_submission为 App 的一个平台创建审核提交。appId、platform
add_review_submission_item向审核提交添加一个项目。submissionId、itemType、itemId
remove_review_submission_item从审核提交中移除一个项目。itemId
submit_review_submission将审核提交送交 App 审核。submissionId、expectedItemIds
cancel_review_submission取消正在进行的审核提交。submissionId
App 信息:类别、年龄分级、EULA
工具描述参数
get_app_info_categories获取 App 信息记录的主要和次要 App Store 类别及子类别。appInfoId
set_app_categories设置或清除 App 信息记录中的 App Store 类别及子类别。appInfoId、primaryCategoryId?、primarySubcategoryOneId?、primarySubcategoryTwoId?、secondaryCategoryId?、secondarySubcategoryOneId?、secondarySubcategoryTwoId?
list_app_subcategories列出某个 App Store 类别的子类别,例如 GAMES 的子类别。categoryId、limit?
get_age_rating_declaration获取 App 信息记录的年龄分级问卷答案。appInfoId
update_age_rating_declaration更新年龄分级问卷答案。declarationId、attributes
create_app_info_localization为某个语言区域创建 App 信息本地化内容(名称、副标题、隐私链接)。appInfoId、locale、name、subtitle?、privacyPolicyUrl?、privacyChoicesUrl?、privacyPolicyText?
delete_app_info_localization删除 App 信息本地化内容。localizationId
get_eula获取 App 的自定义最终用户许可协议。appId
create_eula为 App 创建自定义最终用户许可协议,并应用于指定地区(例如appId、agreementText、territories
update_eula更新 App 的自定义 EULA 文本和/或适用地区。eulaId、agreementText?、territories?
delete_eula删除 App 的自定义最终用户许可协议。eulaId
媒体:屏幕截图集、App 预览、审核屏幕截图
工具描述参数
create_screenshot_set为 App Store 版本本地化内容中的一种设备显示尺寸创建屏幕截图集。localizationId、screenshotDisplayType
delete_screenshot_set删除一个屏幕截图集及其中的所有屏幕截图。screenshotSetId
delete_screenshot从屏幕截图集中删除一张屏幕截图。screenshotId
reorder_screenshots设置某个屏幕截图集中的屏幕截图显示顺序。screenshotIds 必须按新顺序列出该集合中当前的每张屏幕截图,且每张恰好列出一次;使用 list_screenshots 获取 ID。screenshotSetId、screenshotIds
list_preview_sets列出 App Store 版本本地化内容中的 App 预览集(每种设备类型一个)。localizationId、limit?
create_preview_set为 App Store 版本本地化内容中的一种设备类型创建 App 预览集。localizationId、previewType
delete_preview_set删除一个 App 预览集及其中的所有 App 预览。previewSetId
list_previews列出 App 预览集中的 App 预览(视频)。previewSetId、limit?
upload_app_preview上传 .mov、.m4v 或 .mp4 视频作为 App 预览。previewSetId、filePath、fileName?、previewFrameTimeCode?、waitForProcessing?
delete_app_preview从预览集中删除一个 App 预览。previewId
reorder_previews设置某个预览集中的 App 预览显示顺序。previewIds 必须按新顺序列出该集合中当前的每个预览,且每个恰好列出一次;使用 list_previews 获取 ID。previewSetId、previewIds
upload_subscription_review_screenshot从本地文件上传订阅项目的 App 审核屏幕截图。subscriptionId、filePath、fileName?
upload_iap_review_screenshot从本地文件上传 App 内购买项目的 App 审核屏幕截图。inAppPurchaseId、filePath、fileName?
TestFlight 群组
工具说明参数
get_beta_group获取 Beta 群组设置,包括其公开 TestFlight 链接。betaGroupId
create_beta_group为应用创建 Beta 群组。appId、name、isInternalGroup?、hasAccessToAllBuilds?、publicLinkEnabled?、publicLinkLimitEnabled?、publicLinkLimit?、feedbackEnabled?
update_beta_group更新 Beta 群组设置。betaGroupId、name?、publicLinkEnabled?、publicLinkLimitEnabled?、publicLinkLimit?、feedbackEnabled?、iosBuildsAvailableForAppleSiliconMac?、iosBuildsAvailableForAppleVision?
delete_beta_group删除 Beta 群组。betaGroupId
list_beta_group_builds列出 Beta 群组可用的构建版本。betaGroupId、limit?
add_builds_to_beta_group将一个或多个构建版本设为 Beta 群组可用。betaGroupId、buildIds
remove_builds_from_beta_group从 Beta 群组移除一个或多个构建版本。betaGroupId、buildIds
add_testers_to_beta_group根据测试人员 ID,将现有 Beta 测试人员添加到 Beta 群组。betaGroupId、betaTesterIds
delete_beta_tester从帐户中删除 Beta 测试人员。betaTesterId
invite_beta_tester向现有 Beta 测试人员发送应用测试邀请。appId、betaTesterId
TestFlight 构建版本与 Beta 审核
工具说明参数
list_beta_build_localizations列出某个构建版本的 TestFlight“测试内容”备注,每种语言区域一条。buildId、limit?
create_beta_build_localization为某个构建版本添加一种语言区域的“测试内容”备注。buildId、locale、whatsNew?
update_beta_build_localization替换某个构建版本某种语言区域的“测试内容”备注。localizationId、whatsNew
delete_beta_build_localization删除某个构建版本一种语言区域的“测试内容”备注。localizationId
list_beta_app_localizations列出应用的 TestFlight 详细信息(描述、反馈邮箱、URL),每种语言区域一条。appId、limit?
create_beta_app_localization为应用添加一种语言区域的 TestFlight 详细信息。appId、locale、description?、feedbackEmail?、marketingUrl?、privacyPolicyUrl?、tvOsPrivacyPolicy?
update_beta_app_localization更新一种语言区域的 TestFlight 应用详细信息。localizationId、description?、feedbackEmail?、marketingUrl?、privacyPolicyUrl?、tvOsPrivacyPolicy?
delete_beta_app_localization删除一种语言区域的 TestFlight 应用详细信息。localizationId
get_beta_app_review_detail获取应用的 TestFlight Beta App Review 详细信息:联系人、演示帐户和备注。appId
update_beta_app_review_detail更新 TestFlight Beta App Review 详细信息(联系人、演示帐户和备注)。reviewDetailId、contactFirstName?、contactLastName?、contactPhone?、contactEmail?、demoAccountName?、demoAccountPassword?、demoAccountRequired?、notes?
submit_build_for_beta_review将构建版本提交至 TestFlight Beta App Review,以便与外部测试人员共享。buildId
list_beta_review_submissions列出某个构建版本的 TestFlight Beta App Review 提交记录,可按审核状态筛选。buildId、betaReviewState?、limit?
get_build_beta_detail获取某个构建版本的 TestFlight 设置和处理状态(自动通知、内部和外部状态)。buildId
update_build_beta_detail为某个构建版本开启或关闭自动测试人员通知。buildBetaDetailId、autoNotifyEnabled
list_pre_release_versions列出应用的 TestFlight 预发布版本(版本字符串和平台)。appId、limit?
客户评价
工具描述参数
list_customer_reviews列出应用的客户评价,以及每条评价对应的开发者回复(如有)。appId、rating?、territory?、sort?、hasResponse?、limit?
get_customer_review按 ID 获取一条客户评价,以及对应的开发者回复(如有)。reviewId
get_review_response获取针对客户评价的开发者回复(没有回复时为 null)。reviewId
create_review_response发布针对客户评价的开发者回复。reviewId、responseBody
delete_review_response删除针对客户评价的开发者回复。responseId
订阅优惠(首购优惠与挽回优惠)
工具描述参数
list_introductory_offers列出订阅的首购优惠,包含地区和价格点 ID。subscriptionId、territoryId?、limit?
create_introductory_offer为一个地区的订阅创建首购优惠。subscriptionId、duration、offerMode、numberOfPeriods、startDate?、endDate?、targetSubscriptionPlanType?、territoryId?、pricePointId?
update_introductory_offer更改首购优惠的结束日期。introductoryOfferId、endDate
delete_introductory_offer按 ID 删除首购优惠。introductoryOfferId
list_win_back_offers列出订阅的挽回优惠。subscriptionId、limit?
create_win_back_offer为已流失的订阅者创建挽回优惠,每个地区对应一个价格条目。subscriptionId、referenceName、offerId、duration、offerMode、periodCount、customerEligibilityPaidSubscriptionDurationInMonths、customerEligibilityTimeSinceLastSubscribedInMonths、startDate、priority、prices、customerEligibilityWaitBetweenOffersInMonths?、endDate?、promotionIntent?、targetSubscriptionPlanType?
update_win_back_offer更新挽回优惠的资格条件、日期、优先级或推广意图。winBackOfferId、customerEligibilityPaidSubscriptionDurationInMonths?、customerEligibilityTimeSinceLastSubscribedInMonths?、customerEligibilityWaitBetweenOffersInMonths?、startDate?、endDate?、priority?、promotionIntent?
delete_win_back_offer按 ID 删除挽回优惠。winBackOfferId
list_win_back_offer_prices列出挽回优惠按地区划分的价格,包含地区和价格点 ID。winBackOfferId、territoryId?、limit?
订阅优惠码
工具描述参数
list_subscription_offer_codes列出订阅的优惠码,可按美国等地区代码筛选。subscriptionId、territories?、limit?
get_subscription_offer_code按 ID 获取一个订阅优惠码,包括其代码数量和状态。offerCodeId
create_subscription_offer_code创建订阅优惠码。subscriptionId、name、customerEligibilities、offerEligibility、duration、offerMode、numberOfPeriods、autoRenewEnabled?、targetSubscriptionPlanType?、prices?
update_subscription_offer_code启用或停用订阅优惠码。offerCodeId、active
create_subscription_one_time_codes为订阅优惠码批量生成一次性兑换码。offerCodeId、numberOfCodes、expirationDate、environment?
list_subscription_one_time_code_batches列出为订阅优惠码生成的一次性代码批次。offerCodeId、limit?
get_subscription_one_time_code_values将一次性代码批次中的兑换码下载为 CSV,可内联返回;对于较大的批次,则通过 savePath 保存到新文件。oneTimeUseCodeBatchId、savePath?
create_subscription_custom_code为订阅优惠码创建自定义(专属)兑换码,可选设置过期日期。offerCodeId、customCode、numberOfCodes、expirationDate?
list_subscription_custom_codes列出为订阅优惠码创建的自定义代码。offerCodeId、limit?
App 内购买优惠码
工具描述参数
list_iap_offer_codes列出为 App 内购买配置的优惠码。inAppPurchaseId、limit?
get_iap_offer_code按 ID 获取一个 App 内购买优惠码。offerCodeId
create_iap_offer_code创建 App 内购买优惠码,并为每个地区设置价格。inAppPurchaseId、name、customerEligibilities、prices
update_iap_offer_code启用或停用 App 内购买优惠码。offerCodeId、active
create_iap_one_time_codes为优惠码批量生成一次性兑换码。offerCodeId、numberOfCodes、expirationDate、environment?
list_iap_one_time_code_batches列出为优惠码生成的一次性代码批次,并显示数量和过期日期。offerCodeId、limit?
get_iap_one_time_code_values获取一次性代码批次中的兑换码值,格式为 CSV,可内联返回;对于较大的批次,则通过 savePath 保存到新文件,并显示非空行数。oneTimeUseCodeBatchId、savePath?
create_iap_custom_code为优惠码创建自定义兑换码。offerCodeId、customCode、numberOfCodes、expirationDate?
list_iap_custom_codes列出优惠码的自定义兑换码,并显示兑换次数和过期日期。offerCodeId、limit?
自定产品页面
工具描述参数
list_custom_product_pages列出应用的自定产品页面,可按可见性筛选。appId、visible?、limit?
get_custom_product_page按 ID 获取一个自定产品页面。customProductPageId
create_custom_product_page为应用创建自定产品页面,包含其首个版本和一种本地化(除非指定 locale,否则使用应用的主要语言区域)。appId、name、locale?、promotionalText?、deepLink?
update_custom_product_page更新自定产品页面的名称或可见性。customProductPageId、name?、visible?
delete_custom_product_page按 ID 删除自定产品页面。customProductPageId
list_cpp_versions列出自定产品页面的版本,可按审核状态筛选。customProductPageId、states?、limit?
create_cpp_version创建自定产品页面的新版本,可选择添加深层链接。customProductPageId、deepLink?
list_cpp_localizations列出自定产品页面版本按语言区域划分的本地化内容,可按语言区域筛选。versionId、locales?、limit?
create_cpp_localization为自定产品页面版本添加语言区域及推广文本。versionId、locale、promotionalText?
update_cpp_localization设置自定产品页面本地化内容的推广文本。localizationId、promotionalText
delete_cpp_localization按 ID 删除自定产品页面本地化内容。localizationId

使用示例

列出你的应用

“显示我在 App Store Connect 中的所有应用”

Claude 将使用 list_apps 检索并显示你的应用。

更新应用描述

“将 MyApp 2.0 版本的英文描述更新为:‘一款简化日常任务的革新应用。’”

Claude 将:

  1. 使用 list_apps 查找应用
  2. 使用 list_app_versions 获取版本
  3. 使用 list_version_localizations 查找英文本地化内容
  4. 使用 update_version_localization 更新内容
添加日文本地化

“为 MyApp 2.0 版本添加日文本地化,描述为‘素晴らしいアプリです’,关键词为‘アプリ,便利,簡単’”

Claude 将使用 create_version_localization,并指定 locale ja。

添加 Beta 测试人员

“将 [email protected] 添加为 MyApp 的 Internal Testing 组中的 Beta 测试人员”

Claude 将:

  1. 使用 list_beta_groups 查找应用和 Beta 组
  2. 使用 add_beta_tester 添加测试人员
设置 PPP 定价

“显示我的 $9.99 价位在印度、巴西和土耳其的等值价格”

Claude 将:

  1. 使用 list_app_price_points 查找 $9.99 价位
  2. 使用 get_price_point_equalizations 获取等值价格
  3. 显示各地区经过 PPP 调整的价格

“将我的应用在美国的价格设为 $9.99,并在印度和巴西采用 PPP 定价”

Claude 将使用 set_app_prices,并为各地区指定适当的价位 ID。

创建终身购买项目

“为 MyApp 添加 $99.99 的终身解锁项目,并为印度和巴西采用 PPP 定价”

Claude 将:

  1. 使用 create_in_app_purchase 创建一个非消耗型 App 内购买项目
  2. 使用 create_in_app_purchase_localization 添加显示名称
  3. 使用 list_in_app_purchase_price_points 查找 $99.99 价位,然后使用 get_in_app_purchase_price_point_equalizations 查找 PPP 等值价格
  4. 使用 set_in_app_purchase_price 设置各地区价格,并使用 set_in_app_purchase_availability 开放购买
  5. 使用 list_in_app_purchase_prices 确认结果
检查版本状态

“MyApp 所有版本的状态是什么?”

Claude 将使用 list_app_versions 显示版本状态(PREPARE_FOR_SUBMISSION、IN_REVIEW、READY_FOR_SALE 等)。

准备并提交一个版本

“将 MyApp 2.1 的版权设为 ‘2026 Example Inc.’,附加构建版本 42,添加审核备注,并提交审核”

Claude 将使用 update_app_version、set_app_version_build(仅可附加 VALID 构建版本)、update_review_detail,然后使用 create_review_submission、add_review_submission_item 和 submit_review_submission;如果提交内容包含了预期项目之外的任何项目,最后一个工具会拒绝提交。

没有专用工具的操作

“为 MyApp 的下一个版本启用 Game Center”

Claude 将使用 asc_api_search 查找该操作,使用 asc_api_describe 查看其请求体,然后使用 asc_api_request 调用它。

安全性

凭据处理
  • 私钥永远不会被记录,也不会出现在错误消息中
  • JWT 令牌会从所有错误输出中自动脱敏
  • Issuer ID 会从错误消息和详情中脱敏;演示账户密码绝不会返回,并且会从错误中脱敏
  • 只读模式(ASC_READ_ONLY=1)会在 HTTP 客户端本身阻止写入,而不仅仅是在工具列表中阻止
  • 通用请求只能访问 App Store Connect 主机上的相对 /v1 至 /v3 路径;含有 .. 的路径、编码路径和绝对路径会被拒绝;除非设置了 allowUnknown,否则请求必须符合 Apple 的规范。响应中的演示账户密码和 webhook 密钥会被屏蔽
  • 优惠码 CSV 文件只会写入新文件(savePath,仅所有者可访问的权限),绝不会覆盖现有文件
  • 令牌缓存可减少密钥使用次数(令牌有效期为 15 分钟,在第 10 分钟刷新)
路径验证
  • P8 文件路径会经过验证,以防止目录遍历攻击(不允许使用 ..)
  • 只解析绝对路径
最佳实践
  1. 切勿提交凭据——使用环境变量或密钥管理器
  2. 限制 API 密钥权限——使用所需的最低角色(大多数操作使用 App Manager)
  3. 定期轮换密钥——生成新的 API 密钥并撤销旧密钥
  4. 保护好 .p8 文件——将文件权限设为 600(仅所有者可读写)
chmod 600 /path/to/AuthKey.p8

故障排除

“配置错误:必须设置 APP_STORE_CONNECT_KEY_ID 环境变量”

确保已设置所有必需的环境变量:

  • APP_STORE_CONNECT_KEY_ID
  • APP_STORE_CONNECT_ISSUER_ID
  • APP_STORE_CONNECT_P8_PATH 或 APP_STORE_CONNECT_P8_CONTENT
“读取私钥失败”
  1. 确认 APP_STORE_CONNECT_P8_PATH 中的路径正确且为绝对路径
  2. 检查文件权限:ls -la /path/to/AuthKey.p8
  3. 确认该文件是来自 Apple 的有效 .p8 文件(以 -----BEGIN PRIVATE KEY----- 开头)
“身份验证失败”

通常是因为:

  1. API 密钥已在 App Store Connect 中撤销
  2. Key ID 或 Issuer ID 与 .p8 文件不匹配
  3. .p8 文件已损坏或不完整
“超出速率限制”

服务内置了速率限制(每分钟 50 个请求)。如果触发了 Apple 的限制:

  1. 等待指定的重试时间
  2. 尽可能批量执行操作
  3. 服务会自动以指数退避方式重试
Claude 中未显示工具
  1. 确认服务正在运行:检查 Claude Desktop 日志
  2. 确保配置文件路径适用于你的操作系统
  3. 更改配置后重启 Claude Desktop

开发

先决条件
  • Node.js 20+
  • npm 或 pnpm
设置
# Clone the repository
git clone https://github.com/SardorbekR/appstore-connect-mcp.git
cd appstore-connect-mcp

# Install dependencies
npm install

# Build
npm run build

# Run tests
npm test

# Lint
npm run lint

# Type check
npm run typecheck
项目结构
src/
├── index.ts          # MCP server entry point
├── auth/
│   └── jwt.ts        # JWT token generation & caching
├── api/
│   ├── client.ts     # HTTP client with retry logic and read-only guard
│   ├── upload.ts     # Shared asset upload (reserve, upload chunks, commit, poll)
│   └── types.ts      # TypeScript interfaces
├── openapi/
│   ├── schema-index.json  # Operation index generated from spec/openapi.oas.json
│   └── index.ts           # Match, search, and describe operations
├── tools/
│   ├── index.ts      # Tool registry (toolsets, read-only filtering)
│   ├── api.tools.ts  # Generic asc_api_* tools
│   ├── apps.tools.ts
│   ├── versions.tools.ts
│   ├── localizations.tools.ts
│   ├── app-info.tools.ts
│   ├── beta.tools.ts
│   ├── screenshots.tools.ts
│   ├── bundle-ids.tools.ts
│   ├── devices.tools.ts
│   ├── users.tools.ts
│   ├── builds.tools.ts
│   ├── categories.tools.ts
│   └── ...           # One file per domain (subscriptions, release, media, ...)
└── utils/
    ├── errors.ts     # Error classes with redaction
    └── validation.ts # Zod schemas
OpenAPI 规范

spec/openapi.oas.json 是 Apple 的 App Store Connect OpenAPI 规范,已固定版本(参见 spec/README.md)。测试会根据该规范检查工具发送的每个请求。

npm run check-openapi   # fail if src/openapi/schema-index.json is stale
npm run update-openapi  # download Apple's latest spec and regenerate the index
npx tsx scripts/spec-sheet.ts "PATCH /v1/appInfos/{id}"  # print an operation's resolved shape
本地运行
# Development mode with auto-reload
npm run dev

# Or run the built version
npm start
发布

当推送版本标签时,GitHub Actions(.github/workflows/publish.yml)会发布版本。npm 使用可信发布(OIDC、无需令牌,并附带来源证明),MCP Registry 使用 GitHub OIDC。

  1. 在 package.json 和 package-lock.json 中设置新版本(npm version X.Y.Z --no-git-tag-version),设置 server.json 中的两个字段,并设置 src/index.ts 中的 SERVER_VERSION
  2. 合并到 main
  3. git tag vX.Y.Z && git push origin vX.Y.Z
  4. 批准工作流运行:发布作业会在 release 环境中等待,直到所需审核者打开工作流运行并点击 Review deployments → Approve

如果任何版本字段与标签不一致,或者类型检查、代码检查、测试或 OpenAPI 索引检查失败,工作流就会拒绝发布。

贡献
  1. Fork 此仓库
  2. 创建功能分支:git checkout -b feature/my-feature
  3. 进行修改并添加测试
  4. 运行 npm test 和 npm run lint
  5. 提交拉取请求

致谢

通用 API 工具、OpenAPI 索引格式以及若干工作流细节(审核提交、资源上传、报价定价)参考了 rorkai/App-Store-Connect-CLI(MIT)。

许可证

MIT 许可证——详情请参阅 LICENSE。

链接

评论

支持 Markdown

第一次接触 MCP?

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

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