Apple Ads MCP
apple-search-ads-mcp
전체 Apple Search Ads(현재 Apple Ads) 캠페인 관리 API v5를 래핑하는 MCP(Model Context Protocol) 서버입니다. 74개의 타입 지정 도구가 포함되어 있으며, 문서화된 모든 v5 엔드포인트(캠페인, 광고 그룹, 광고, 크리에이티브, 맞춤형 제품 페이지, 키워드, 제외 키워드, 보고서, 노출 점유율 보고서, 예산 주문, ACL, 지역/앱 검색, 앱 메타데이터, 거절 사유 감사)와 1:1로 매핑됩니다. 또한 향후 추가될 엔드포인트를 위한 원시 패스스루(raw passthrough) 기능도 제공합니다.
API 수명 주기: Apple Ads(Search Ads) v5는 현재 운영 중인 API입니다. v5는 2026년 여름에 출시될 새로운 "Apple Ads Platform API"를 위해 2027년 1월 26일에 종료됩니다. 이 서버는 v5.0 → v5.5를 대상으로 합니다.
빠른 설치
git clone https://github.com/AppVisionOS/apple-search-ads-mcp.git
cd apple-search-ads-mcp
npm install
npm run build그런 다음 Claude Code에 한 줄로 등록하세요:
claude mcp add apple-search-ads --scope user \
-e ASA_CLIENT_ID=SEARCHADS.xxxx \
-e ASA_TEAM_ID=SEARCHADS.xxxx \
-e ASA_KEY_ID=xxxx \
-e ASA_PRIVATE_KEY_PATH=/absolute/path/to/asa-private.p8 \
-e ASA_ORG_ID=1234567 \
-- node $(pwd)/dist/index.js설정
1. API 자격 증명 받기
Apple Ads UI는 자격 증명을 두 화면으로 분리합니다. 계정 설정 내의 API 탭은 제3자 서비스 제공업체에 대한 액세스만 관리합니다. 직접적인 프로그래밍 방식의 액세스를 위해서는 먼저 **사용자 관리(User Management)**를 거쳐야 합니다.
a) API 사용자 초대
app-ads.apple.com → 계정 설정(Account Settings) → 사용자 관리(User Management) → 사용자 초대(Invite User):
이메일: 본인이 제어하는 주소(본인 소유 가능; Apple은 API 사용자를 위해 별도의 Apple ID를 요구함)
역할: API 권한이 있는 역할 선택(예: API 계정 관리자)
초대장을 보낸 후, 초대받은 받은 편지함에서 수락
b) 로컬에서 키 쌍 생성
초대가 처리되는 동안, 머신에서 ES256 키 쌍을 생성하세요. 반드시 PKCS#8 형식이어야 합니다. Apple의 .p8 예제와 이전 openssl ecparam 출력은 PKCS#8이 아니며 jose 라이브러리에서 로드할 수 없습니다.
# CORRECT — produces PKCS#8 (-----BEGIN PRIVATE KEY-----)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out asa-private.p8
openssl ec -in asa-private.p8 -pubout -out asa-public.pem
# If you already produced traditional EC (-----BEGIN EC PRIVATE KEY-----), convert it:
# openssl pkcs8 -topk8 -nocrypt -in asa-private.p8 -out asa-private-pkcs8.p8asa-private.p8을 안전한 곳(예: ~/.apple-search-ads/, chmod 600)에 보관하세요. 공개 키 부분만 Apple에 붙여넣게 됩니다.
c) API 클라이언트 생성
로그아웃한 후 초대받은 API 사용자 계정으로 다시 로그인하세요(관리자 계정이 아님). 계정 설정(Account Settings) → API로 이동하세요. 공개 키(Public Key) 텍스트 영역이 있는 클라이언트 자격 증명(Client Credentials) 화면이 나타납니다. 이 화면은 API 역할이 있는 사용자에게만 표시됩니다.
asa-public.pem의 내용(-----BEGIN PUBLIC KEY-----/-----END PUBLIC KEY-----마커 포함)을 붙여넣으세요.**API 클라이언트 생성(Generate API Client)**을 클릭하세요.
Apple이 표시하는 세 가지 값(클라이언트 ID, 팀 ID, 키 ID)을 복사하세요. 이 값들은 나중에 다시 표시되지 않습니다.
2. 설치
npm install
npm run build3. 구성
.env.example을 .env로 복사하여 내용을 채우거나, MCP 클라이언트를 통해 환경 변수를 전달하세요.
ASA_CLIENT_ID=SEARCHADS.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ASA_TEAM_ID=SEARCHADS.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ASA_KEY_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ASA_PRIVATE_KEY_PATH=/absolute/path/to/private-key.p8
ASA_ORG_ID=1234567 # optional default; can be overridden per callASA_PRIVATE_KEY(PEM 내용을 인라인으로 입력, JSON을 통해 주입 시 \n 이스케이프 사용)는 ASA_PRIVATE_KEY_PATH의 대안으로 지원됩니다.
4. MCP 클라이언트에 연결
{
"mcpServers": {
"apple-search-ads": {
"command": "node",
"args": ["/absolute/path/to/apple-search-ads-mcp/dist/index.js"],
"env": {
"ASA_CLIENT_ID": "SEARCHADS.xxxx...",
"ASA_TEAM_ID": "SEARCHADS.xxxx...",
"ASA_KEY_ID": "xxxx...",
"ASA_PRIVATE_KEY_PATH": "/absolute/path/to/private-key.p8",
"ASA_ORG_ID": "1234567"
}
}
}
}인증
이 서버는 ES256 JWT 클라이언트 어설션을 사용하는 OAuth 2.0 클라이언트 자격 증명 흐름을 처리합니다:
.p8개인 키로 JWT에 서명합니다(헤더:kid=키 ID,alg=ES256; 페이로드:iss=팀 ID,sub=클라이언트 ID,aud=https://appleid.apple.com).grant_type=client_credentials및scope=searchadsorg와 함께https://appleid.apple.com/auth/oauth2/token으로 POST 요청을 보냅니다.반환된 1시간짜리 액세스 토큰을 모든 API 호출 시
Authorization: Bearer …및X-AP-Context: orgId=…헤더와 함께 사용합니다.
토큰은 만료 약 30초 전까지 메모리에 캐시되므로, 시간당 하나의 어설션에 서명하고 하나의 토큰을 교환합니다. 401 오류 발생 시 서버는 강제로 새로 고침 후 한 번 재시도합니다. 429/5xx 오류 발생 시 최대 3회까지(Retry-After 준수) 대기 후 재시도합니다.
도구 목록 (74개)
계정 및 액세스 (2)
org_acls, me_user — 조직 컨텍스트 없이 호출하여 토큰의 권한 범위를 확인합니다.
검색 (3)
search_apps, search_geo, geo_lookup
앱 메타데이터 (6)
apps_get, apps_locale_details, apps_eligibilities_find, apps_assets_find, creative_app_preview_devices, countries_or_regions_list
맞춤형 제품 페이지 (3)
cpp_list, cpp_get, cpp_locale_details
캠페인 (6)
campaigns_create, campaigns_get, campaigns_list, campaigns_find, campaigns_update, campaigns_delete
광고 그룹 (7)
adgroups_create, adgroups_get, adgroups_list, adgroups_find_in_campaign, adgroups_find_org_wide, adgroups_update, adgroups_delete
크리에이티브 (4)
creatives_create, creatives_list, creatives_get, creatives_find — 크리에이티브는 맞춤형 제품 페이지, 기본 제품 페이지 또는 크리에이티브 세트 참조를 래핑합니다. 광고는 creativeId를 통해 크리에이티브에 바인딩됩니다.
광고 (7)
ads_create, ads_get, ads_list, ads_find_in_campaign, ads_find_org_wide, ads_update, ads_delete
타겟팅 키워드 (7)
targeting_keywords_create, targeting_keywords_get, targeting_keywords_list, targeting_keywords_find, targeting_keywords_update, targeting_keywords_delete (일괄), targeting_keywords_delete_single
제외 키워드 — 광고 그룹 범위 (6)
adgroup_negative_keywords_create, adgroup_negative_keywords_get, adgroup_negative_keywords_list, adgroup_negative_keywords_find, adgroup_negative_keywords_update, adgroup_negative_keywords_delete
제외 키워드 — 캠페인 범위 (6)
campaign_negative_keywords_create, campaign_negative_keywords_get, campaign_negative_keywords_list, campaign_negative_keywords_find, campaign_negative_keywords_update, campaign_negative_keywords_delete
보고서 (7)
도구 | 엔드포인트 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
모든 도구는 startTime, endTime, 선택적 granularity(HOURLY/DAILY/WEEKLY/MONTHLY), 선택적 groupBy(adminArea / ageRange / countryCode / countryOrRegion / deviceClass / gender / locality), selector, returnRowTotals, returnGrandTotals, returnRecordsWithNoMetrics, timeZone(UTC | ORTZ)를 허용합니다.
노출 점유율 보고서 (3) — 비동기
custom_reports_create → reportId를 반환합니다. state=COMPLETED가 될 때까지 custom_reports_get으로 폴링하세요. custom_reports_list로 목록을 확인합니다.
예산 주문 (4) — LOC 계정 전용
budget_orders_create, budget_orders_get, budget_orders_list, budget_orders_update. v5에는 예산 주문 삭제 기능이 없습니다.
거절 사유 감사 (2)
product_page_reasons_find, product_page_reasons_get — Apple 검수자가 크리에이티브를 거절한 이유를 읽기 전용으로 확인합니다.
탈출구 (1)
apple_search_ads_request — 모든 경로와 메서드로 호출 가능합니다. 인증 및 조직 컨텍스트는 자동으로 처리됩니다.
선택자(Selectors)
*_find 도구는 Apple의 선택자 문법을 허용합니다:
{
"conditions": [
{ "field": "status", "operator": "EQUALS", "values": ["ENABLED"] },
{ "field": "countriesOrRegions", "operator": "CONTAINS_ANY", "values": ["US", "GB"] }
],
"fields": ["id", "name", "status"],
"orderBy": [{ "field": "name", "sortOrder": "ASCENDING" }],
"pagination": { "limit": 100, "offset": 0 }
}연산자: EQUALS, NOT_EQUALS, CONTAINS, STARTS_WITH, ENDS_WITH, GREATER_THAN, LESS_THAN, IN, NOT_IN, CONTAINS_ALL, CONTAINS_ANY, BETWEEN. values는 항상 배열입니다.
엔드투엔드 예시
Claude를 통해 완전히 제어할 수 있는 워크플로우:
org_acls→orgId선택.앱에 대한
search_apps→adamId획득.해당
adamId, 일일 예산, 미국 타겟팅,adChannelType=SEARCH,supplySources=["APPSTORE_SEARCH_RESULTS"],billingEvent=TAPS로campaigns_create호출.defaultBidAmount={amount:"1.00",currency:"USD"}및pricingModel=CPC로 캠페인 내adgroups_create호출.{text, matchType, bidAmount}행 배치로targeting_keywords_create호출.cpp_list→productPageId선택 →type=CUSTOM_PRODUCT_PAGE로creatives_create호출하여creativeId생성 →ads_create로 광고 그룹에 바인딩.며칠 대기. 상위 수준 보고서는
reports_campaigns, 새로운 키워드/제외 키워드 수집은reports_search_terms_in_campaign사용.상위 검색어에 대한 노출 점유율/점유율 확인을 위해
custom_reports_create사용.
알려진 표면적 참고 사항 (v5 특이 사항)
레거시 크리에이티브 세트 CRUD 없음. Apple은 v5에서 이를 제거했습니다. 대신
creatives행을 생성하고ads.creativeId에서 참조하세요.앱 카테고리 엔드포인트 없음.
apps_get을 사용하여primaryGenre/secondaryGenre를 읽으세요.우편번호 지역 타겟팅 없음. v5의 지역 엔티티는 국가 / 행정 구역 / 지역(Locality)뿐입니다.
키워드 또는 광고 그룹 범위 키워드에 대한 조직 전체 검색 없음. Apple은 타겟팅 키워드 검색을 캠페인 수준(
/campaigns/{id}/adgroups/targetingkeywords/find)으로 제한하고 광고 그룹 전체를 롤업합니다. 선택자에서adGroupId로 필터링하여 범위를 좁히세요.예산 주문에 대한 DELETE 없음. 삭제하지 말고 업데이트하세요.
오디언스, 예측, 전환 이벤트는 v5에 포함되어 있지 않습니다. 이는 별도의 Apple API(AdServices Attribution 등)에 있습니다.
로컬 개발
npm run dev # tsc --watch
npm run typecheck # one-shot type check
npm run build # compile to dist/apple_search_ads_request를 사용하여 모든 엔드포인트를 직접 디버깅하세요. Apple이 반환한 정확한 응답 형태를 볼 수 있도록 원시 봉투(raw envelope)를 반환합니다.
Maintenance
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AppVisionOS/apple-search-ads-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server