关于 appstore-connect
appstore-connect 是面向 Apple 平台开发者的 MCP 服务,可通过 MCP 客户端管理 App Store Connect 中的应用、版本、TestFlight 和商业信息。它既提供常用管理工具,也可按 Apple OpenAPI 规范访问 API 操作,并支持只读模式和工具组筛选。
主要功能
- 01访问 App Store Connect API 操作
- 02管理应用版本与提交发布
- 03管理 TestFlight 测试与测试者
- 04编辑本地化、截图和应用内购买
- 05查看分析、销售与诊断报告
- 06按工具组筛选并启用只读模式
适用场景
- 01准备并提交应用版本审核
- 02管理 TestFlight 测试组和测试者
- 03更新应用商店描述、关键词和截图
- 04查看应用分析及销售报告
MCP 相关
作为 MCP 服务,它向 Claude、Cursor 等兼容客户端提供 App Store Connect 管理工具。可筛选公开的工具组,也可开启只读模式以阻止写入请求。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
App Store Connect MCP 服务
这是一款用于 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 身份验证并自动刷新令牌,在日志中隐藏凭证
目录
快速开始
- 获取 App Store Connect API 密钥(请参阅前置条件)。
- 使用
npx -y asc-mcp@latest和你的凭证,将服务添加到 MCP 客户端(请参阅 MCP 客户端配置)。 - 重启客户端。每次重启时都会获取最新版本。
安装
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 凭据
- 登录 App Store Connect
- 前往 Users and Access → Integrations → App Store Connect API
- 点击 Generate API Key(或使用现有密钥)
- 选择合适的角色(建议使用 Admin 或 App Manager)
- 下载 .p8 文件——该文件只能下载一次!
- 记下你的 Key ID(显示在密钥列表中)
- 记下你的 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_TOOLSETS | all | 要公开的工具组,以逗号分隔:apps、versions、media、testflight、pricing、subscriptions、iap、reviews、product-pages、provisioning、users、analytics、api。工具越少,工具预算较小的客户端所需的上下文就越少。api 组可以访问所有操作,包括其他组未涵盖的操作。 |
ASC_READ_ONLY | off | 设置为 1 时仅公开读取工具,并使客户端拒绝所有非 GET 请求 |
ASC_MAX_RESPONSE_CHARS | 80000 | asc_api_request 结果的大小上限;较大的结果会在页面边界处截断,并提供用于继续获取的 cursor |
ASC_DISABLE_UPDATE_CHECK | off | 设置为 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 ID | limit?, platform? |
get_bundle_id | 获取 Bundle ID 详情 | bundleIdId |
create_bundle_id | 注册新的 Bundle ID | identifier, name, platform |
update_bundle_id | 更新 Bundle ID 名称 | bundleIdId, name |
delete_bundle_id | 删除 Bundle ID | bundleIdId |
设备
| 工具 | 描述 | 参数 |
|---|---|---|
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 将:
- 使用
list_apps查找应用 - 使用
list_app_versions获取版本 - 使用
list_version_localizations查找英文本地化内容 - 使用
update_version_localization更新内容
添加日文本地化
“为 MyApp 2.0 版本添加日文本地化,描述为‘素晴らしいアプリです’,关键词为‘アプリ,便利,簡単’”
Claude 将使用 create_version_localization,并指定 locale ja。
添加 Beta 测试人员
“将 [email protected] 添加为 MyApp 的 Internal Testing 组中的 Beta 测试人员”
Claude 将:
- 使用
list_beta_groups查找应用和 Beta 组 - 使用
add_beta_tester添加测试人员
设置 PPP 定价
“显示我的 $9.99 价位在印度、巴西和土耳其的等值价格”
Claude 将:
- 使用
list_app_price_points查找 $9.99 价位 - 使用
get_price_point_equalizations获取等值价格 - 显示各地区经过 PPP 调整的价格
“将我的应用在美国的价格设为 $9.99,并在印度和巴西采用 PPP 定价”
Claude 将使用 set_app_prices,并为各地区指定适当的价位 ID。
创建终身购买项目
“为 MyApp 添加 $99.99 的终身解锁项目,并为印度和巴西采用 PPP 定价”
Claude 将:
- 使用
create_in_app_purchase创建一个非消耗型 App 内购买项目 - 使用
create_in_app_purchase_localization添加显示名称 - 使用
list_in_app_purchase_price_points查找 $99.99 价位,然后使用get_in_app_purchase_price_point_equalizations查找 PPP 等值价格 - 使用
set_in_app_purchase_price设置各地区价格,并使用set_in_app_purchase_availability开放购买 - 使用
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 文件路径会经过验证,以防止目录遍历攻击(不允许使用
..) - 只解析绝对路径
最佳实践
- 切勿提交凭据——使用环境变量或密钥管理器
- 限制 API 密钥权限——使用所需的最低角色(大多数操作使用 App Manager)
- 定期轮换密钥——生成新的 API 密钥并撤销旧密钥
- 保护好
.p8文件——将文件权限设为600(仅所有者可读写)
chmod 600 /path/to/AuthKey.p8
故障排除
“配置错误:必须设置 APP_STORE_CONNECT_KEY_ID 环境变量”
确保已设置所有必需的环境变量:
APP_STORE_CONNECT_KEY_IDAPP_STORE_CONNECT_ISSUER_IDAPP_STORE_CONNECT_P8_PATH或APP_STORE_CONNECT_P8_CONTENT
“读取私钥失败”
- 确认
APP_STORE_CONNECT_P8_PATH中的路径正确且为绝对路径 - 检查文件权限:
ls -la /path/to/AuthKey.p8 - 确认该文件是来自 Apple 的有效
.p8文件(以-----BEGIN PRIVATE KEY-----开头)
“身份验证失败”
通常是因为:
- API 密钥已在 App Store Connect 中撤销
- Key ID 或 Issuer ID 与
.p8文件不匹配 .p8文件已损坏或不完整
“超出速率限制”
服务内置了速率限制(每分钟 50 个请求)。如果触发了 Apple 的限制:
- 等待指定的重试时间
- 尽可能批量执行操作
- 服务会自动以指数退避方式重试
Claude 中未显示工具
- 确认服务正在运行:检查 Claude Desktop 日志
- 确保配置文件路径适用于你的操作系统
- 更改配置后重启 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。
- 在
package.json和package-lock.json中设置新版本(npm version X.Y.Z --no-git-tag-version),设置server.json中的两个字段,并设置src/index.ts中的SERVER_VERSION - 合并到
main git tag vX.Y.Z && git push origin vX.Y.Z- 批准工作流运行:发布作业会在
release环境中等待,直到所需审核者打开工作流运行并点击 Review deployments → Approve
如果任何版本字段与标签不一致,或者类型检查、代码检查、测试或 OpenAPI 索引检查失败,工作流就会拒绝发布。
贡献
- Fork 此仓库
- 创建功能分支:
git checkout -b feature/my-feature - 进行修改并添加测试
- 运行
npm test和npm run lint - 提交拉取请求
致谢
通用 API 工具、OpenAPI 索引格式以及若干工作流细节(审核提交、资源上传、报价定价)参考了 rorkai/App-Store-Connect-CLI(MIT)。
许可证
MIT 许可证——详情请参阅 LICENSE。
链接
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。