App Store Connect MCP Server
# 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.
[](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
Scored across 36 tools
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.
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.
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.
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.