Asc Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Asc Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
App Store Connect MCP Server — register, test, ship.
Every other ASC MCP can list your apps. This one ships them — and now manages TestFlight too.
One tool, 28 actions. Bundle ID registration, metadata, screenshots, age rating, TestFlight groups + testers, composite one-call shipping — all from your AI agent.
Existing ASC MCP servers (JoshuaRileyDev 288 stars, SardorbekR 13 stars) are read-heavy, write-light. They can list apps and manage basic TestFlight. None can submit for review. None have composite actions.
We built this after shipping two iOS apps entirely from Claude Code's CLI — and burning ~15 API calls just discovering age rating field types. The schemas are now baked in.
| Action | What |
|---|---|
schema | Returns all ASC API schemas — age rating fields, categories, screenshot types. Call this first. |
list_apps | List all apps |
find_app | Find app by bundle ID |
get_app | App details + versions |
get_version | Version details + localizations |
get_builds | Recent builds + processing state + TestFlight status |
check_submission | Check review status |
list_beta_groups | List TestFlight groups (internal + external) |
list_beta_testers | List TestFlight testers for an app |
| Action | What |
|---|---|
register_bundle_id | Register a new bundle ID (identifier + name, optional platform) |
upload_metadata | Description, keywords, promo text, support URL, what's new |
upload_app_info | Subtitle, privacy URL, categories |
set_age_rating | All 22 fields in one call — defaults to 4+ (NONE/false) |
set_copyright | Copyright text on version |
set_content_rights | Third-party content declaration |
set_encryption | Export compliance (most apps: uses_non_exempt=false) |
set_pricing_free | Set price to FREE |
attach_build | Attach a processed build to a version |
create_review_detail | Reviewer contact info + notes |
upload_screenshots | Upload screenshots with auto-cleanup of existing sets |
submit_for_review | Full 3-step submission: create → add version → confirm |
| Action | What |
|---|---|
create_beta_group | Create internal or external testing group |
add_build_to_group | Assign a build to a beta group |
add_beta_tester | Add tester by email (optionally to a specific group) |
set_beta_whats_new | Set "What to Test" for a build |
set_beta_app_info | Set TestFlight description + feedback email |
| Action | What |
|---|---|
testflight_setup | One call: set encryption → beta app info → what-to-test → create/find group → add build. TestFlight live in one action. |
ship_app | One call: find app → get version → get build → set encryption → attach build → age rating → content rights. App ready for metadata + submission. |
The stuff that wastes tokens if you don't know it:
NONE/INFREQUENT_OR_MILD/FREQUENT_OR_INTENSE) + 9 boolean fields. ALL required in one PATCH call.TRAVEL, SOCIAL_NETWORKING — not UUIDs.iphone_67 → APP_IPHONE_67 (1290x2796), etc.+44 844 209 0611App Store Connect → Users and Access → Integrations → Keys → Generate.
You need:
V82Q36H9CR)~/private_keys/)Using uv (recommended):
cd /path/to/asc-mcp
uv venv && uv pip install fastmcp PyJWT cryptographyOr with pip:
pip install fastmcp PyJWT cryptographyAdd to your .mcp.json (Claude Code, Cursor, etc.):
{
"mcpServers": {
"asc": {
"command": "python3",
"args": ["/path/to/asc-mcp/server.py"],
"env": {
"ASC_KEY_ID": "YOUR_KEY_ID",
"ASC_ISSUER_ID": "YOUR_ISSUER_ID",
"ASC_KEY_PATH": "~/private_keys/AuthKey_XXXX.p8"
}
}
}
}If your key is in ~/private_keys/AuthKey_*.p8, Key ID and path are auto-discovered. You still need ASC_ISSUER_ID.
asc action=schema
asc action=find_app bundle_id=com.example.myapp
asc action=upload_metadata version_id=XXX description="My app" keywords="app,cool"
asc action=set_age_rating app_id=XXX
asc action=set_pricing_free app_id=XXX
asc action=upload_screenshots version_id=XXX display_type=iphone_67 screenshot_paths=["/path/1.png","/path/2.png"]
asc action=attach_build version_id=XXX build_id=YYY
asc action=submit_for_review app_id=XXX version_id=XXXasc action=ship_app bundle_id=com.example.myapp
asc action=submit_for_review app_id=XXX version_id=XXXasc action=testflight_setup app_id=XXX build_id=YYY whats_new="Test the new onboarding flow" beta_description="Beta version of MyApp" [email protected]asc action=add_beta_tester app_id=XXX [email protected] first_name=Jane last_name=Doexcrun altool, not this MCP (Apple's Transporter handles binary upload, not the REST API).set_pricing_free is implemented. Paid tiers need price point lookup per territory.MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.