io.github.SardorbekR/appstore-connect

平台与服务

by sardorbekr

面向Apple App Store Connect API的MCP服务器,可管理应用、TestFlight等内容。

什么是 io.github.SardorbekR/appstore-connect

面向Apple App Store Connect API的MCP服务器,可管理应用、TestFlight等内容。

README

App Store Connect MCP Server

npm version License: MIT Node.js Version

A Model Context Protocol (MCP) server for Apple's App Store Connect API. Manage your iOS, macOS, tvOS, and visionOS apps directly from Claude, Cursor, or any MCP-compatible client.

Features

  • App Store Localizations - Full CRUD for version descriptions, keywords, and what's new
  • App Management - List and inspect apps across all platforms
  • Version Control - Create and manage app store versions
  • Beta Testing - Manage TestFlight groups and testers
  • Screenshot Management - Upload and organize app screenshots
  • Bundle ID Management - Full CRUD for bundle identifiers
  • Device Management - List and inspect registered devices
  • User Management - List and inspect team users
  • Build Management - List and inspect app builds
  • Category & Pricing - Browse categories, check pricing and availability
  • Pricing & PPP - Set per-territory pricing with Purchase Power Parity support
  • In-App Purchases - Create and manage one-time purchases (lifetime/non-consumable, consumable, non-renewing): metadata, localization, pricing & PPP, availability, and review submission (review-screenshot upload excluded)
  • Analytics Reports - Request and download app analytics reports (engagement, commerce, usage, performance)
  • Sales & Finance - Download sales, trends, and financial reports
  • Performance & Diagnostics - App/build power & performance metrics and diagnostic logs
  • Secure by Default - ES256 JWT auth with automatic token refresh, credential redaction in logs

Table of Contents

Quick Start

bash
# 1. Install
npm install -g asc-mcp

# 2. Set credentials (get from App Store Connect > Users and Access > Keys)
export APP_STORE_CONNECT_KEY_ID="YOUR_KEY_ID"
export APP_STORE_CONNECT_ISSUER_ID="YOUR_ISSUER_ID"
export APP_STORE_CONNECT_P8_PATH="/path/to/AuthKey.p8"

# 3. Add to your MCP client config and start using!

Installation

npm (recommended)

bash
npm install -g asc-mcp

Using npx

bash
npx asc-mcp

From Source

bash
git clone https://github.com/SardorbekR/appstore-connect-mcp.git
cd appstore-connect-mcp
npm install
npm run build

Configuration

Prerequisites: Get Your Apple API Credentials

  1. Sign in to App Store Connect
  2. Go to Users and AccessIntegrationsApp Store Connect API
  3. Click Generate API Key (or use existing)
  4. Select appropriate role (Admin or App Manager recommended)
  5. Download the .p8 file - you can only download it once!
  6. Note your Key ID (shown in the keys list)
  7. Note your Issuer ID (shown at the top of the page)

Environment Variables

VariableRequiredDescription
APP_STORE_CONNECT_KEY_IDYesYour API Key ID (e.g., ABC123DEFG)
APP_STORE_CONNECT_ISSUER_IDYesYour Issuer ID (UUID format)
APP_STORE_CONNECT_P8_PATHYes*Path to your .p8 private key file
APP_STORE_CONNECT_P8_CONTENTYes*Raw content of .p8 key (alternative to path)

*One of P8_PATH or P8_CONTENT is required.

MCP Client Configuration

<details> <summary><strong>Claude Desktop</strong></summary>

Add to your Claude Desktop config file:

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

json
{
  "mcpServers": {
    "app-store-connect": {
      "command": "asc-mcp",
      "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"
      }
    }
  }
}
</details> <details> <summary><strong>Cursor</strong></summary>

Add to your Cursor MCP settings (Settings → MCP Servers):

json
{
  "mcpServers": {
    "app-store-connect": {
      "command": "npx",
      "args": ["-y", "asc-mcp"],
      "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"
      }
    }
  }
}
</details> <details> <summary><strong>VS Code with Continue</strong></summary>

Add to your Continue configuration:

json
{
  "mcpServers": {
    "app-store-connect": {
      "command": "asc-mcp",
      "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"
      }
    }
  }
}
</details> <details> <summary><strong>Using P8 Content Instead of Path</strong></summary>

For CI/CD or containerized environments, you can pass the key content directly:

json
{
  "mcpServers": {
    "app-store-connect": {
      "command": "asc-mcp",
      "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-----"
      }
    }
  }
}
</details>

Available Tools

Apps

ToolDescriptionParameters
list_appsList all apps in your accountlimit? (number, 1-200)
get_appGet details of a specific appappId (string, required)

Versions

ToolDescriptionParameters
list_app_versionsList all versions for an appappId, platform?, versionState?, limit?
get_app_versionGet version detailsversionId
create_app_versionCreate a new app versionappId, platform, versionString, releaseType?

Version Localizations

ToolDescriptionParameters
list_version_localizationsList localizations for a versionversionId, limit?
get_version_localizationGet localization detailslocalizationId
create_version_localizationAdd a new localeversionId, locale, description?, keywords?, whatsNew?
update_version_localizationUpdate localizationlocalizationId, description?, keywords?, whatsNew?, promotionalText?
delete_version_localizationRemove a localelocalizationId

App Info Localizations

ToolDescriptionParameters
list_app_infosList app info recordsappId, limit?
list_app_info_localizationsList name/subtitle localizationsappInfoId, limit?
update_app_info_localizationUpdate app name, subtitlelocalizationId, name?, subtitle?, privacyPolicyUrl?

Beta Testing (TestFlight)

ToolDescriptionParameters
list_beta_groupsList beta groups for an appappId, limit?
list_beta_testersList testers in a groupbetaGroupId, limit?
add_beta_testerAdd a tester to a groupbetaGroupId, email, firstName?, lastName?
remove_beta_testerRemove a tester from a groupbetaGroupId, betaTesterId

Screenshots

ToolDescriptionParameters
list_screenshot_setsList screenshot setslocalizationId, limit?
list_screenshotsList screenshots in a setscreenshotSetId, limit?
upload_screenshotUpload a new screenshotscreenshotSetId, fileName, fileSize, filePath

Bundle IDs

ToolDescriptionParameters
list_bundle_idsList all bundle IDslimit?, platform?
get_bundle_idGet bundle ID detailsbundleIdId
create_bundle_idRegister a new bundle IDidentifier, name, platform
update_bundle_idUpdate bundle ID namebundleIdId, name
delete_bundle_idDelete a bundle IDbundleIdId

Devices

ToolDescriptionParameters
list_devicesList registered deviceslimit?, platform?, status?
get_deviceGet device detailsdeviceId

Users

ToolDescriptionParameters
list_usersList team userslimit?, roles?
get_userGet user detailsuserId

Builds

ToolDescriptionParameters
list_buildsList builds for an appappId, limit?
get_buildGet build detailsbuildId

Categories & Pricing

ToolDescriptionParameters
list_app_categoriesList app categorieslimit?, platform?
get_app_price_scheduleGet app pricing infoappId
get_app_availabilityGet app territory availabilityappId

Pricing (PPP)

ToolDescriptionParameters
list_territoriesList all territories with currencieslimit?
list_app_price_pointsList available price tiers for an appappId, territory?, limit?
get_price_point_equalizationsGet PPP equivalent prices across countriespricePointId, territories?, limit?
set_app_pricesSet per-territory manual pricing (replaces entire schedule)appId, baseTerritory, manualPrices

In-App Purchases (Lifetime / Non-Consumable)

One-time purchases via Apple's In-App Purchases v2 API. create_in_app_purchase defaults to NON_CONSUMABLE — a "lifetime" unlock. To ship one: create → add a localization → set a price → set availability → submit for review.

Note: App Review usually requires a review screenshot on the in-app purchase. Uploading IAP review screenshots is not yet covered by these tools — add one in App Store Connect if submit_in_app_purchase_for_review is rejected for a missing screenshot.

ToolDescriptionParameters
list_in_app_purchasesList an app's in-app purchases, optionally by typeappId, inAppPurchaseType?, limit?
get_in_app_purchaseGet a single in-app purchase's details and stateinAppPurchaseId
create_in_app_purchaseCreate an IAP (defaults to NON_CONSUMABLE / lifetime)appId, name, productId, inAppPurchaseType?, familySharable?, reviewNote?
update_in_app_purchaseUpdate name, Family Sharing, or review note (productId/type immutable)inAppPurchaseId, name?, familySharable?, reviewNote?
delete_in_app_purchaseDelete an in-app purchaseinAppPurchaseId
list_in_app_purchase_localizationsList localized names/descriptionsinAppPurchaseId, limit?
create_in_app_purchase_localizationAdd a localized display name (+ description)inAppPurchaseId, locale, name, description?
update_in_app_purchase_localizationUpdate a localizationlocalizationId, name?, description?
delete_in_app_purchase_localizationDelete a localizationlocalizationId
list_in_app_purchase_price_pointsList price points (customer price & proceeds)inAppPurchaseId, territory?, limit?, offset?
get_in_app_purchase_price_point_equalizationsApple's PPP-equivalent price points for a base price pointpricePointId, territories?, limit?
set_in_app_purchase_priceSet pricing (replaces schedule; one base territory to auto-equalize, or full PPP list)inAppPurchaseId, baseTerritory, manualPrices
list_in_app_purchase_pricesRead current per-territory prices (manual; optional automatic)inAppPurchaseId, territory?, includeAutomatic?, limit?
get_in_app_purchase_availabilityGet territory availabilityinAppPurchaseId
set_in_app_purchase_availabilitySet territory availabilityinAppPurchaseId, availableInNewTerritories, territories?
submit_in_app_purchase_for_reviewSubmit the IAP to App Review (independent of an app version)inAppPurchaseId

Analytics Reports

ToolDescriptionParameters
create_analytics_report_requestRequest an analytics report (ongoing or one-time snapshot)appId, accessType
list_analytics_report_requestsList analytics report requests for an appappId
get_analytics_report_requestGet an analytics report requestrequestId
delete_analytics_report_requestDelete an analytics report requestrequestId
list_analytics_reportsList reports available within a requestrequestId
list_analytics_report_instancesList instances (by date) of a reportreportId
list_analytics_report_segmentsList downloadable segments of a report instanceinstanceId
download_analytics_report_segmentDownload a report segmenturl

Sales & Finance

ToolDescriptionParameters
get_sales_reportDownload a sales/trends reportvendorNumber, reportType, reportSubType, frequency, reportDate
get_finance_reportDownload a financial reportvendorNumber, regionCode, reportDate, reportType

Performance & Diagnostics

ToolDescriptionParameters
get_app_perf_metricsGet an app's power & performance metricsappId, metricType
get_build_perf_metricsGet a build's performance metricsbuildId, metricType
list_diagnostic_signaturesList diagnostic signatures for a buildbuildId
list_diagnostic_logsList diagnostic logs for a signaturesignatureId

Usage Examples

List Your Apps

"Show me all my apps in App Store Connect"

Claude will use list_apps to retrieve and display your apps.

Update App Description

"Update the English description for version 2.0 of MyApp to: 'A revolutionary app that simplifies your daily tasks.'"

Claude will:

  1. Find the app using list_apps
  2. Get the version using list_app_versions
  3. Find the English localization using list_version_localizations
  4. Update it using update_version_localization

Add Japanese Localization

"Add Japanese localization to MyApp version 2.0 with description '素晴らしいアプリです' and keywords 'アプリ,便利,簡単'"

Claude will use create_version_localization with locale ja.

Add a Beta Tester

"Add john@example.com as a beta tester to the Internal Testing group for MyApp"

Claude will:

  1. Find the app and beta group using list_beta_groups
  2. Add the tester using add_beta_tester

Set PPP Pricing

"Show me the equivalent prices for my $9.99 tier in India, Brazil, and Turkey"

Claude will:

  1. Find the $9.99 price point using list_app_price_points
  2. Get equivalent prices using get_price_point_equalizations
  3. Show you the PPP-adjusted prices in each territory

"Set my app to $9.99 in the US and use PPP pricing for India and Brazil"

Claude will use set_app_prices with the appropriate price point IDs for each territory.

Create a Lifetime Purchase

"Add a $99.99 lifetime unlock to MyApp with PPP pricing for India and Brazil"

Claude will:

  1. Create a non-consumable IAP with create_in_app_purchase
  2. Add a display name with create_in_app_purchase_localization
  3. Find the $99.99 tier with list_in_app_purchase_price_points, then PPP equivalents with get_in_app_purchase_price_point_equalizations
  4. Apply per-territory pricing with set_in_app_purchase_price and open availability with set_in_app_purchase_availability
  5. Confirm the result with list_in_app_purchase_prices

Check Version Status

"What's the status of all versions of MyApp?"

Claude will use list_app_versions to show version states (PREPARE_FOR_SUBMISSION, IN_REVIEW, READY_FOR_SALE, etc.)

Security

Credential Handling

  • Private keys are never logged or exposed in error messages
  • JWT tokens are automatically redacted from any error output
  • Issuer IDs (UUIDs) are redacted from logs
  • Token caching minimizes key usage (15-min tokens, refreshed at 10 min)

Path Validation

  • P8 file paths are validated against directory traversal attacks (.. not allowed)
  • Only absolute paths are resolved

Best Practices

  1. Never commit credentials - Use environment variables or a secrets manager
  2. Restrict API key permissions - Use minimal required role (App Manager for most operations)
  3. Rotate keys periodically - Generate new API keys and revoke old ones
  4. Secure your .p8 file - Set file permissions to 600 (owner read/write only)
bash
chmod 600 /path/to/AuthKey.p8

Troubleshooting

"Configuration error: APP_STORE_CONNECT_KEY_ID environment variable is required"

Ensure all required environment variables are set:

  • APP_STORE_CONNECT_KEY_ID
  • APP_STORE_CONNECT_ISSUER_ID
  • APP_STORE_CONNECT_P8_PATH or APP_STORE_CONNECT_P8_CONTENT

"Failed to read private key"

  1. Verify the path in APP_STORE_CONNECT_P8_PATH is correct and absolute
  2. Check file permissions: ls -la /path/to/AuthKey.p8
  3. Ensure the file is a valid .p8 from Apple (starts with -----BEGIN PRIVATE KEY-----)

"Authentication failed"

This usually means:

  1. The API key was revoked in App Store Connect
  2. The Key ID or Issuer ID doesn't match the .p8 file
  3. The .p8 file is corrupted or incomplete

"Rate limit exceeded"

The server includes built-in rate limiting (50 requests/minute). If you hit Apple's limits:

  1. Wait for the indicated retry time
  2. Batch your operations when possible
  3. The server automatically retries with exponential backoff

Tools Not Appearing in Claude

  1. Verify the server is running: check Claude Desktop logs
  2. Ensure the config file path is correct for your OS
  3. Restart Claude Desktop after config changes

Development

Prerequisites

  • Node.js 20+
  • npm or pnpm

Setup

bash
# 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

Project Structure

code
src/
├── index.ts          # MCP server entry point
├── auth/
│   └── jwt.ts        # JWT token generation & caching
├── api/
│   ├── client.ts     # HTTP client with retry logic
│   └── types.ts      # TypeScript interfaces
├── tools/
│   ├── index.ts      # Tool registry
│   ├── 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
└── utils/
    ├── errors.ts     # Error classes with redaction
    └── validation.ts # Zod schemas

Running Locally

bash
# Development mode with auto-reload
npm run dev

# Or run the built version
npm start

Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/my-feature
  3. Make your changes and add tests
  4. Run npm test and npm run lint
  5. Submit a pull request

License

MIT License - see LICENSE for details.

Links

常见问题

io.github.SardorbekR/appstore-connect 是什么?

面向Apple App Store Connect API的MCP服务器,可管理应用、TestFlight等内容。

相关 Skills

Slack动图

by anthropics

Universal
热门

面向Slack的动图制作Skill,内置emoji/消息GIF的尺寸、帧率和色彩约束、校验与优化流程,适合把创意或上传图片快速做成可直接发送的Slack动画。

帮你快速做出适配 Slack 的动图,内置约束规则和校验工具,少踩上传与播放坑,做表情包和演示都更省心。

平台与服务
未扫描164.6k

MCP构建

by anthropics

Universal
热门

聚焦高质量 MCP Server 开发,覆盖协议研究、工具设计、错误处理与传输选型,适合用 FastMCP 或 MCP SDK 对接外部 API、封装服务能力。

想让 LLM 稳定调用外部 API,就用 MCP构建:从 Python 到 Node 都有成熟指引,帮你更快做出高质量 MCP 服务器。

平台与服务
未扫描164.6k

接口测试套件

by alirezarezvani

Universal
热门

扫描 Next.js、Express、FastAPI、Django REST 的 API 路由,自动生成覆盖鉴权、参数校验、错误码、分页、上传与限流场景的 Vitest 或 Pytest 测试套件。

帮你把API与集成测试自动化跑顺,减少回归漏测;能力全面,尤其适合复杂接口场景的QA团队。

平台与服务
未扫描23.3k

相关 MCP Server

Slack 消息

编辑精选

by Anthropic

热门

Slack 是让 AI 助手直接读写你的 Slack 频道和消息的 MCP 服务器。

这个服务器解决了团队协作中需要 AI 实时获取 Slack 信息的痛点,特别适合开发团队让 Claude 帮忙汇总频道讨论或发送通知。不过,它目前只是参考实现,文档有限,不建议在生产环境直接使用——更适合开发者学习 MCP 如何集成第三方服务。

平台与服务
89.0k

by netdata

热门

io.github.netdata/mcp-server 是让 AI 助手实时监控服务器指标和日志的 MCP 服务器。

这个工具解决了运维人员需要手动检查系统状态的痛点,最适合 DevOps 团队让 Claude 自动分析性能数据。不过,它依赖 NetData 的现有部署,如果你没用过这个监控平台,得先花时间配置。

平台与服务
79.5k

by d4vinci

热门

Scrapling MCP Server 是专为现代网页设计的智能爬虫工具,支持绕过 Cloudflare 等反爬机制。

这个工具解决了爬取动态网页和反爬网站时的头疼问题,特别适合需要批量采集电商价格或新闻数据的开发者。不过,它依赖外部浏览器引擎,资源消耗较大,不适合轻量级任务。

平台与服务
71.5k

评论