# Heimdall

An MCP server that puts App Store Connect and StoreKit 2 inside your AI agent: releases, TestFlight, subscriptions, reviews, reports.

- MCP server · `type=mcp` · Claude Code, Codex, Cursor, GitHub Copilot, Windsurf (Devin Desktop), Cline, Zed, Gemini CLI · ★ 53
- Author: erayendes
- License: MIT · policy=link-only · description only; the file stays with the author
- Source: https://github.com/erayendes/app-store-connect-mcp
- Updated: 2026-10-24
- HTML: https://affpapa.org/en/nevibecode/mcp/heimdall

## What it does

Heimdall is generated from Apple's OpenAPI specification. It ships 13 profiles, 33 sub-profiles and 928 tools covering app metadata, versions, TestFlight, subscriptions and in-app purchases, pricing, reviews, Game Center, Xcode Cloud, provisioning, webhooks and finance reports. You enable only the profiles you want and change that set later. Unsure where a given endpoint lives? Ask the agent — the server points you to the right profile.

It runs on your machine. The App Store Connect key is read from the Keychain, a short-lived token is signed from it, and calls go straight to Apple. No middle layer holds your credentials. Actions that are hard to undo — repricing, granting Admin access, deletions, submitting a version for review — prompt for confirmation first, with a summary of what changes.

You need Node.js 20.19 or later and an App Store Connect API key. Give that key the narrowest role that still does the job. Heimdall sits next to Fastlane rather than replacing it: the pipeline stays in Fastlane, everything you would otherwise click through by hand goes to the agent.

## Requirements
- Needs: Node.js (commands run via npx)
- Environment variables: `ASC_KEY_ID`, `ASC_ISSUER_ID`, `ASC_PRIVATE_KEY`, `ASC_PRIVATE_KEY_PATH`, `ASC_BUNDLE_ID` — keys and tokens: ask the human for the values, never commit them or put them in shared files.

## Install

### Claude Code (native platform)

**Platform CLI**
```bash
claude mcp add --env ASC_KEY_ID=<ASC_KEY_ID> --env ASC_ISSUER_ID=<ASC_ISSUER_ID> --env ASC_PRIVATE_KEY=<ASC_PRIVATE_KEY> --env ASC_PRIVATE_KEY_PATH=<ASC_PRIVATE_KEY_PATH> --env ASC_BUNDLE_ID=<ASC_BUNDLE_ID> --transport stdio heimdall -- npx -y @erayendes/asc-mcp
```
Replace <…> with your own values

### Codex

**Platform CLI**
```bash
codex mcp add heimdall --env ASC_KEY_ID=<ASC_KEY_ID> --env ASC_ISSUER_ID=<ASC_ISSUER_ID> --env ASC_PRIVATE_KEY=<ASC_PRIVATE_KEY> --env ASC_PRIVATE_KEY_PATH=<ASC_PRIVATE_KEY_PATH> --env ASC_BUNDLE_ID=<ASC_BUNDLE_ID> -- npx -y @erayendes/asc-mcp
```
Replace <…> with your own values

### Cursor

**Config file**
File `.cursor/mcp.json`:
```json
{
    "mcpServers": {
        "heimdall": {
            "command": "npx",
            "args": [
                "-y",
                "@erayendes/asc-mcp"
            ],
            "env": {
                "ASC_KEY_ID": "<ASC_KEY_ID>",
                "ASC_ISSUER_ID": "<ASC_ISSUER_ID>",
                "ASC_PRIVATE_KEY": "<ASC_PRIVATE_KEY>",
                "ASC_PRIVATE_KEY_PATH": "<ASC_PRIVATE_KEY_PATH>",
                "ASC_BUNDLE_ID": "<ASC_BUNDLE_ID>"
            }
        }
    }
}
```
Replace <…> with your own values

### GitHub Copilot

**Config file**
File `.vscode/mcp.json`:
```json
{
    "servers": {
        "heimdall": {
            "type": "stdio",
            "command": "npx",
            "args": [
                "-y",
                "@erayendes/asc-mcp"
            ],
            "env": {
                "ASC_KEY_ID": "<ASC_KEY_ID>",
                "ASC_ISSUER_ID": "<ASC_ISSUER_ID>",
                "ASC_PRIVATE_KEY": "<ASC_PRIVATE_KEY>",
                "ASC_PRIVATE_KEY_PATH": "<ASC_PRIVATE_KEY_PATH>",
                "ASC_BUNDLE_ID": "<ASC_BUNDLE_ID>"
            }
        }
    }
}
```
Replace <…> with your own values

### Gemini CLI

**Platform CLI**
```bash
gemini mcp add -e ASC_KEY_ID=<ASC_KEY_ID> -e ASC_ISSUER_ID=<ASC_ISSUER_ID> -e ASC_PRIVATE_KEY=<ASC_PRIVATE_KEY> -e ASC_PRIVATE_KEY_PATH=<ASC_PRIVATE_KEY_PATH> -e ASC_BUNDLE_ID=<ASC_BUNDLE_ID> heimdall npx -y @erayendes/asc-mcp
```
Replace <…> with your own values

## When to use it
- see which builds are stuck in review
- raise a subscription price across every country
- gather a week of reviews and draft replies
- add a build to the internal and external tester groups
- find out why an Xcode Cloud build failed

## Example prompts
- Which builds are sitting in review right now?
- Raise the price of this subscription in every country
- Add build 42 to the internal and external TestFlight groups

## Similar
- [asc-id-resolver](https://affpapa.org/en/nevibecode/skills/asc-id-resolver.md) — skill · 7600 installs
- [asc-xcode-build](https://affpapa.org/en/nevibecode/skills/asc-xcode-build.md) — skill · 7600 installs
- [blitz](https://affpapa.org/en/nevibecode/mcp/blitz.md) — MCP server · ★ 1761
- [app-store-connect](https://affpapa.org/en/nevibecode/mcp/app-store-connect.md) — MCP server · ★ 14
- [appstore-connect](https://affpapa.org/en/nevibecode/mcp/appstore-connect.md) — MCP server · ★ 22

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
