Skip to main content
Glama
yunyang088

App Store Connect MCP Server

by yunyang088
README.md
# App Store Connect MCP Server

A [Model Context Protocol](https://modelcontextprotocol.io) server for the [App Store Connect API](https://developer.apple.com/documentation/appstoreconnectapi). It lets AI assistants manage apps, versions, localizations, screenshots, creative assets, in-app purchases, pricing and availability, App Review details, TestFlight, bundle IDs, devices, users, and analytics reports.

[![npm](https://img.shields.io/npm/v/@yunyang088/app-store-connect-mcp-server)](https://www.npmjs.com/package/@yunyang088/app-store-connect-mcp-server)

> Forked from [JoshuaRileyDev/app-store-connect-mcp-server](https://github.com/JoshuaRileyDev/app-store-connect-mcp-server) (archived).

## Setup

Create an API key in [App Store Connect → Users and Access → Integrations](https://appstoreconnect.apple.com/access/integrations/api), download the `.p8` file, and note the Key ID and Issuer ID.

Add the server to your MCP client config (e.g. `claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "app-store-connect": {
      "command": "npx",
      "args": ["-y", "@yunyang088/app-store-connect-mcp-server"],
      "env": {
        "APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
        "APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
        "APP_STORE_CONNECT_P8_PATH": "/path/to/AuthKey_XXXXXXXXXX.p8",
        "APP_STORE_CONNECT_VENDOR_NUMBER": "OPTIONAL"
      }
    }
  }
}
```

For Claude Code:

```bash
claude mcp add app-store-connect \
  -e APP_STORE_CONNECT_KEY_ID=YOUR_KEY_ID \
  -e APP_STORE_CONNECT_ISSUER_ID=YOUR_ISSUER_ID \
  -e APP_STORE_CONNECT_P8_PATH=/path/to/AuthKey_XXXXXXXXXX.p8 \
  -- npx -y @yunyang088/app-store-connect-mcp-server
```

`APP_STORE_CONNECT_VENDOR_NUMBER` is optional. When set, the sales and finance report tools are enabled.

## Tools

| Area | Tools |
| --- | --- |
| Apps | `list_apps`, `get_app_info` |
| Versions | `create_app_store_version`, `list_app_store_versions`, `update_app_store_version`, `set_app_store_version_build` |
| Version localizations | `list_app_store_version_localizations`, `get_app_store_version_localization`, `create_app_store_version_localization`, `update_app_store_version_localization` |
| App info localizations (name / subtitle) | `list_app_info_localizations`, `create_app_info_localization`, `update_app_info_localization` |
| Screenshots | `list_app_screenshot_sets`, `create_app_screenshot_set`, `list_app_screenshots`, `upload_app_screenshot`, `delete_app_screenshot` |
| Asset Library (iOS 27 creative assets, iPhone Duo) | `get_asset_library_ref_data`, `list_asset_library_media`, `upload_asset_library_media`, `create_asset_placement`, `list_asset_placements`, `reorder_asset_placements`, `delete_asset_placement`, `delete_asset_library_media` |
| In-app purchases | `list_in_app_purchases`, `get_in_app_purchase`, `create_in_app_purchase`, `update_in_app_purchase`, `delete_in_app_purchase`, `list_in_app_purchase_versions`, `create_in_app_purchase_version` |
| In-app purchase localizations | `list_in_app_purchase_localizations`, `create_in_app_purchase_localization`, `update_in_app_purchase_localization`, `delete_in_app_purchase_localization` |
| In-app purchase price, availability & review | `list_in_app_purchase_price_points`, `set_in_app_purchase_price`, `get_in_app_purchase_price_schedule`, `get_in_app_purchase_availability`, `set_in_app_purchase_availability`, `upload_in_app_purchase_review_screenshot` |
| App Review information | `get_app_store_review_detail`, `create_app_store_review_detail`, `update_app_store_review_detail` |
| Age rating & categories | `get_age_rating_declaration`, `update_age_rating_declaration`, `list_app_categories`, `get_app_info_categories`, `update_app_info_categories` |
| App price & availability | `list_territories`, `list_app_price_points`, `get_app_price_schedule`, `set_app_price_schedule`, `get_app_availability`, `set_app_availability`, `update_territory_availability` |
| TestFlight | `list_beta_groups`, `list_group_testers`, `add_tester_to_group`, `remove_tester_from_group`, `list_beta_feedback_screenshots`, `get_beta_feedback_screenshot` |
| Bundle IDs | `list_bundle_ids`, `get_bundle_id_info`, `create_bundle_id`, `enable_bundle_capability`, `disable_bundle_capability` |
| Devices & users | `list_devices`, `list_users` |
| Analytics | `create_analytics_report_request`, `list_analytics_report_requests`, `list_analytics_reports`, `list_analytics_report_instances`, `list_analytics_report_segments`, `download_analytics_report_segment` |
| Sales & finance (vendor number required) | `download_sales_report`, `download_finance_report` |
| Xcode | `list_schemes` |

Notes:

- `upload_app_screenshot` handles the full reserve → upload → commit flow for a local PNG.
- `create_app_screenshot_set` expects display types with the `APP_` prefix, e.g. `APP_IPHONE_67`.
- Asset Library flow: `upload_asset_library_media` (reserve → upload → commit → wait for processing) → `create_asset_placement` on a version localization.
  - Product page header: `PRODUCT_PAGE_HEADER_ASSET`, 21:9 3840×1646 PNG. Search results: `APP_STORE_SEARCH_RESULTS_ASSET`, 3:2 up to 3840×2560. A 16:9 5244×2950 PNG universal asset fits both. Both use placement group `DEFAULT_PROFILE`, one per localization; upload with category `CREATIVE_ASSETS`.
  - iPhone Duo screenshots have no legacy `screenshotDisplayType`; upload with category `APP_SCREENSHOTS_AND_PREVIEWS` and place as `APP_SCREENSHOT` in group `IPHONE_DUO_PROFILE` (2853×2007 / 2034×1398, or portrait).
  - `get_asset_library_ref_data` returns the live specs and placement groups.
- When a new version is being prepared, the app has two app infos (live and editable). App info localization tools now resolve the editable one, so name/subtitle edits go to the version being prepared.
- In-app purchase flow: `create_in_app_purchase` → `create_in_app_purchase_localization` per locale → `list_in_app_purchase_price_points` (e.g. `territory: USA`, `customerPrice: "0.99"`) → `set_in_app_purchase_price` → `set_in_app_purchase_availability` → `upload_in_app_purchase_review_screenshot`.
  - Since API 4.4.1, localizations belong to an in-app purchase *version*. A new in-app purchase comes with version 1 in `PREPARE_FOR_SUBMISSION`; given only `inAppPurchaseId`, the localization tool posts to that draft version (v2) and falls back to the deprecated v1 endpoint if there is none. Update/delete try v2 first and fall back to v1 on 404.
  - Price and availability tools replace the whole schedule / territory list. `excludeTerritoryIds: ["CHN"]` selects every territory except mainland China. Territory IDs in both lists are checked, so a typo such as `CN` is rejected instead of being ignored.
  - The first in-app purchase of an app has to be submitted together with an app version on the App Store Connect website; there is no submission tool here.
- `set_app_availability` creates the app's availability once (`POST /v2/appAvailabilities`, every territory listed with `available` true/false). After it exists, use `update_territory_availability` with IDs from `get_app_availability`.
- `set_app_price_schedule` with `free: true` looks up the 0.00 price point in the base territory (default `USA`).
- Age rating and category tools resolve the app's editable app info when given `appId`.
- Analytics flow: request → reports → instances → segments → download. Only one `ONGOING` request is allowed per app.

## Development

```bash
git clone https://github.com/yunyang088/app-store-connect-mcp-server.git
cd app-store-connect-mcp-server
npm install
npm run build   # compile TypeScript to dist/
npm start       # run the server on stdio
```

## License

MIT

TDQS

B3.2/5.0

Scored across 36 tools

Disambiguation4/5

Most tools target distinct resources and actions, with clear descriptions separating similar-sounding tools like list_app_info_localizations and list_app_store_version_localizations. However, the presence of multiple localization and analytics tools with similar names could cause misselection without careful reading.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (e.g., list_apps, create_bundle_id, update_app_info_localization). Verbs are standard and used uniformly across resources.

Tool Count3/5

With 36 tools, the set is heavy for an MCP server, though the breadth of App Store Connect resources justifies some granularity. Many operations are resource-specific and could potentially be consolidated, making the count borderline excessive.

Completeness3/5

The server covers many resources but lacks full CRUD for several key areas: no app creation/update/delete, no beta group management (only tester add/remove), no device registration, and no user management. These notable gaps will limit agents in end-to-end workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues