Skip to main content
Glama
imfaisii

Apple Ads MCP Server

by imfaisii

Apple Ads MCP Server

Die Apple Ads Platform API als MCP-Server. 99 Operationen über alle dokumentierten Ressourcen, bereitgestellt für Claude Code, Claude Desktop, Cursor und jeden anderen Model Context Protocol-Client über 4 token-effiziente Tools.

CI Model Context Protocol Apple Ads Platform API 99 operations 4 MCP tools Bun TypeScript License: MIT


apple-ads-mcp ist ein Open-Source-Model Context Protocol (MCP)-Server für die Apple Ads Platform API – die API hinter Apple Search Ads und Apple Maps Brand Ads. Einmal installiert, kann Ihr KI-Agent Kampagnen, Anzeigengruppen, Keywords, Creatives, Budgets, Berichte und alles andere lesen und schreiben, was Apple für Ihre Werbekonten bereitstellt.

Der Katalog wird aus openapi/apple-ads.openapi.json generiert, das aus Apples offiziellem Node-Client (apple/apple-ads-platform-api-node, Spec-Tag 109) rekonstruiert und Endpunkt für Endpunkt gegen Apples veröffentlichte Dokumentation geprüft wurde.

In diesem Repository liegen keine Anmeldedaten. Sie stellen Ihre eigenen Apple Ads API-Anmeldedaten zur Laufzeit über Umgebungsvariablen bereit. Es wird nichts gebündelt, protokolliert oder irgendwohin übertragen außer an Apple.

Inhaltsverzeichnis


Warum 4 Tools statt 99

Alle 99 Apple Ads-Operationen als einzelne MCP-Tools zu registrieren bedeutet, 99 vollständige JSON-Schemas in den Kontextfenster des Modells zu laden, bevor es irgendetwas Nützliches tut. Der größte Teil dieses Budgets wird für Operationen verschwendet, die der Agent in einer bestimmten Konversation nie aufruft.

Dieser Server hält den vollständigen Katalog intern und legt eine kleine, stabile Oberfläche darüber:

ads_search  →  find operations           (names, methods, paths, tags — no schemas)
ads_schema  →  describe one operation    (full input JSON Schema + call hint)
ads_call    →  execute one operation     (real request, or _dryRun)
ads_tags    →  list resource tags        (with operation counts, to narrow search)

Der Agent bezahlt genau für das Schema, das er gleich verwenden wird, und sonst nichts. Ein typischer Ablauf Suche → Schema → Aufruf kostet ein paar tausend Tokens statt der Zehntausende, die es bräuchte, um jedes Schema im Voraus zu laden – und es geht keine Abdeckung verloren, denn der vollständige 99-Operationen-Katalog ist weiterhin über ads_search und ads_call erreichbar.


Related MCP server: mlg-meta-mcp

Was Sie damit tun können

Alle 99 Operationen über 28 Ressourcen-Tags. Führen Sie jederzeit ads_tags aus, um die aktuelle, exakte Liste mit Zählwerten zu erhalten.

  • Kampagnen – erstellen, lesen, aktualisieren, löschen, per Filter/Sortierung/Paginierung abfragen (Campaigns)

  • Anzeigengruppen – erstellen, lesen, aktualisieren, löschen, abfragen (AdGroups)

  • Keywords und negative Keywords – erstellen, lesen, aktualisieren, löschen, abfragen, plus Bulk-Erstellen/-Aktualisieren für beide (Keywords, NegativeKeywords)

  • Anzeigen – erstellen, lesen, aktualisieren, löschen, abfragen (Ads)

  • Creatives – erstellen, lesen, aktualisieren, löschen, abfragen (Creatives)

  • Assets – hochladen, lesen, löschen, abfragen – die Bilder und Videos, die in Creatives und Apple Maps Brand Ads verwendet werden (Assets)

  • Produktseiten – benutzerdefinierte Produktseiten und ihre Locale-Details lesen, abfragen (ProductPages)

  • Gemeinsame Budgets – erstellen, lesen, aktualisieren, löschen, abfragen – Budgets, die über mehrere Kampagnen geteilt werden (SharedBudgets)

  • Geo und Standorte – zielbare Standorte suchen und abfragen, Standortgruppen verwalten (Locations, LocationGroups, Search)

  • Apple Maps Brand Ads – Business-Brands und Business-Kategorien für Maps-basierte Kampagnen (Brands, Categories)

  • Berichte – App- und Business-Brand-Leistungsberichte nach Kampagne, Anzeigengruppe, Anzeige, Keyword und Suchbegriff (Reports)

  • Insights – Impression Share und Suchbegriff-Beliebtheit (Insights)

  • Empfehlungen – Tagesbudget- und Ziel-CPA-Empfehlungen: abfragen, anwenden, verwerfen (Recommendations)

  • Vorschläge – Keyword-, Phrasen-, Kategorie- und Ziel-CPA-Vorschläge für den Ausbau von Kampagnen (Suggestions)

  • Änderungshistorie – Audit-Zusammenfassungen und Änderungsdetails für ein Werbekonto (ChangeHistory)

  • Konto- und Zugriffsverwaltung – Werbekonten, Organisationsinformationen, Benutzer-ACLs, die Identität des authentifizierten Aufrufers, Werbetreibenden-Ressourcen (AdAccounts, Orgs, Acls, Me, AdvertiserResources)

  • App-Suche, Eignung und Metadaten – den App-Store-Katalog durchsuchen, App-Store-Anzeigeneignung prüfen, App-Locale-Details, unterstützte Sprachen und Ablehnungsgründe für Apps und Brands nachschlagen (Apps, Search, Eligibilities, Metadata, RejectionReasons)


Voraussetzungen

  • Bun 1.1 oder neuer

  • Ein Apple Ads-Konto mit API-Zugriff – eine Client-ID, Team-ID, Key-ID und ein privater Schlüssel aus der Apple Ads-Oberfläche

  • Ein MCP-Client, der stdio spricht: Claude Code, Claude Desktop, Cursor oder Ihr eigener Agent


Anmeldedaten abrufen

  1. Melden Sie sich bei ads.apple.com an.

  2. Generieren Sie lokal einen EC-privaten Schlüssel (Apple sieht den privaten Schlüssel selbst nie):

    openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out private-key.pem
    openssl ec -in private-key.pem -pubout -out public-key.pem
  3. Gehen Sie zu Account Settings → API, fügen Sie den Inhalt von public-key.pem (einschließlich der BEGIN/END-Zeilen) in das Feld Public Key ein und speichern Sie.

  4. Nach dem Speichern zeigt die Seite Ihren Anmeldedaten-Block: eine Client-ID, eine Team-ID und eine Key-ID. Kopieren Sie alle drei.

  5. Bewahren Sie private-key.pem außerhalb Ihres Repositorys auf, z. B. unter ~/.apple-ads/private-key.pem, und setzen Sie chmod 600 darauf.

Dieser Server übernimmt ab hier: Er signiert das ES256-Client-Secret-JWT, tauscht es gegen ein Zugriffstoken ein und speichert das Token im Arbeitsspeicher zwischen. Siehe Werbekonto-Scoping für die Ermittlung Ihrer Werbekonto-ID, sobald Sie Anmeldedaten haben.


Installation und Konfiguration

git clone https://github.com/imfaisii/apple-ads-mcp.git
cd apple-ads-mcp
bun install
bun run smoke     # offline catalog check + server boot — no credentials needed

Kopieren Sie .env.example in .env und füllen Sie Ihre Werte ein, oder übergeben Sie sie direkt in der Konfiguration Ihres MCP-Clients. Jeder Client, der einen stdio-MCP-Server startet, funktioniert auf dieselbe Weise – mcp.example.json in diesem Repository ist eine kopierfertige Vorlage:

{
  "mcpServers": {
    "apple-ads": {
      "command": "bun",
      "args": [
        "run",
        "/ABS/PATH/to/apple-ads-mcp/src/index.ts"
      ],
      "env": {
        "APPLE_ADS_CLIENT_ID": "SEARCHADS.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "APPLE_ADS_TEAM_ID": "SEARCHADS.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "APPLE_ADS_KEY_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "APPLE_ADS_PRIVATE_KEY_PATH": "/ABS/PATH/to/private-key.pem",
        "APPLE_ADS_AD_ACCOUNT_ID": "1234567"
      }
    }
  }
}

Claude Code – global registrieren:

claude mcp add apple-ads \
  -s user \
  -t stdio \
  -e APPLE_ADS_CLIENT_ID=SEARCHADS.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  -e APPLE_ADS_TEAM_ID=SEARCHADS.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  -e APPLE_ADS_KEY_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  -e APPLE_ADS_PRIVATE_KEY_PATH=$HOME/.apple-ads/private-key.pem \
  -e APPLE_ADS_AD_ACCOUNT_ID=1234567 \
  -- bun run /ABS/PATH/to/apple-ads-mcp/src/index.ts

claude mcp get apple-ads

Starten Sie eine neue Sitzung. Die Tools erscheinen als mcp__apple-ads__ads_search, …ads_schema, …ads_call und …ads_tags.

Claude Desktop – fügen Sie denselben oben gezeigten mcpServers-Block zu claude_desktop_config.json hinzu:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Starten Sie Claude Desktop nach der Bearbeitung neu.

Cursor~/.cursor/mcp.json (global) oder .cursor/mcp.json (pro Projekt), derselbe mcpServers-Block.

Ihr eigener Agent – führen Sie bun run src/index.ts aus und sprechen Sie MCP über stdio. In einem rohen Terminal sieht es so aus, als würde es hängen; das ist ein stdio-Server, der auf einen Client wartet, und das ist korrekt.


Die vier Tools

Freitextsuche über operationId, Name, Pfad, Tags, Methode und Beschreibung. Liefert nach Relevanz sortierte Treffer ohne die JSON-Schemas.

Parameter

Typ

Erforderlich

Beschreibung

query

string

optional*

Freitext, z. B. "list campaigns", "create ad group", "keyword bids", "impression share report"

tag

string

optional*

Exakter Ressourcen-Tag-Filter, z. B. Campaigns, AdGroups, Keywords

method

string

optional

GET, POST, PUT, DELETE

limit

integer

optional

Maximale Treffer, Standard 15, Maximum 50

* Mindestens eines von query, tag oder method.

{ "query": "create campaign", "method": "POST", "limit": 5 }

ads_schema – eine Operation beschreiben

Liefert das vollständige Eingabe-JSON-Schema der Operation, ihre Pfad-/Abfrage-/Header-Parameterlisten und einen callHint, der zeigt, wie sie aufgerufen wird.

Parameter

Typ

Erforderlich

Beschreibung

operation

string

ja

operationId oder generierter Tool-Name, z. B. campaigns_create

{ "operation": "campaigns_create" }

ads_call – die Operation ausführen

Parameter

Typ

Erforderlich

Beschreibung

operation

string

ja

operationId oder generierter Tool-Name

args

object

optional

Pfadparameter, Abfrageparameter, body, adAccountId, _dryRun. Zusätzliche Eigenschaften erlaubt

_dryRun

boolean

optional

Methode/Pfad/Abfrage/Body auflösen, ohne Apple aufzurufen

Pfad- und Abfragefelder, adAccountId und _dryRun funktionieren sowohl verschachtelt in args als auch als Top-Level-Schlüssel neben operation.

// query campaigns
{
  "operation": "campaigns_query",
  "args": {
    "body": {
      "filters": [{ "field": "status", "operator": "EQUALS", "value": "ENABLED" }],
      "pagination": { "pageSize": 10, "fetchTotalCount": true }
    }
  }
}

// create a campaign
{
  "operation": "campaigns_create",
  "args": {
    "body": {
      "name": "Away Finder — Brand",
      "billingEvent": "TAPS",
      "startTime": "2026-09-01T00:00:00Z",
      "promotedObjectType": "APPSTORE_APP",
      "promotedObjectId": "1234567890",
      "status": "ENABLED",
      "dailyBudget": { "value": { "amount": "50.00", "currency": "USD" } }
    }
  }
}

ads_tags – Orientierung in der API

Parameter

Typ

Erforderlich

Beschreibung

limit

integer

optional

Maximale Tags, Standard alle 28, sortiert nach Operationsanzahl

{}

Ein durchgearbeitetes Beispiel

Ein vollständiger Ablauf von null Kontext bis zu einem echten Aufruf: Werbekonto entdecken, Operation finden, Schema lesen, dann ausführen.

1. ads_call     { operation: "acls_list" }
   → { result: { acls: [ { adAccount: { id: 123456789, name: "Away Finder" }, roles: ["Admin"] } ] } }
   Use adAccount.id as the ad account for every scoped call below.

2. ads_search   { query: "list campaigns" }
   → hits: [ { name: "campaigns_query", operationId: "campaignsQueryPost", method: "POST", path: "/campaigns/query", tags: ["Campaigns"] }, ... ]

3. ads_schema   { operation: "campaigns_query" }
   → full inputSchema (adAccountId, body.filters, body.sorting, body.pagination) + callHint

4. ads_call     {
     operation: "campaigns_query",
     args: {
       adAccountId: "123456789",
       body: {
         filters: [{ field: "status", operator: "EQUALS", value: "ENABLED" }],
         sorting: [{ field: "name", order: "ASC" }],
         pagination: { pageSize: 10, fetchTotalCount: true }
       }
     }
   }
   → { status: 200, body: { result: [ { id: 542370549, name: "Away Finder — Brand", status: "ENABLED", ... } ], pagination: { offset: 0, pageSize: 10, totalCount: 1 } } }

Um statt einer Auflistung etwas zu erstellen, führen Sie dieselbe Form zuerst als Probelauf aus (siehe Probelauf), prüfen Sie die aufgelöste Anfrage gegen ads_schema und rufen Sie sie dann wirklich auf.


Werbekonto-Scoping

Die meisten Apple Ads-Aufrufe sind auf ein Werbekonto beschränkt. Der Server sendet dies als X-Ap-Context-Header:

X-Ap-Context: adAccountId=123456789;

Sie bauen diesen Header nicht selbst. Entweder:

  • setzen Sie APPLE_ADS_AD_ACCOUNT_ID einmal in Ihrer Umgebung, sodass jeder beschränkte Aufruf sie standardmäßig verwendet, oder

  • übergeben Sie adAccountId pro Aufruf in args (oder als Top-Level-Feld neben operation), was den Standardwert für diesen einen Aufruf überschreibt.

Eine Handvoll Operationen benötigt kein Werbekonto und funktioniert nur mit Ihrem Zugriffstoken: me_list (GET /me) und acls_list (GET /acls). Rufen Sie zuerst acls_list auf – es liefert jedes Werbekonto, das Ihre Anmeldedaten erreichen können, plus Ihre Rolle auf jedem, sodass Sie wissen, welche adAccountId-Werte gültig sind, bevor Sie einen anderen Aufruf darauf beschränken.


Abfrage, Paginierung und Sortierung

Die meisten Listen-Endpunkte folgen demselben Muster: POST /<resource>/query mit einem Selektor-Body aus filters, sorting und pagination. Dieses Muster gilt gleichermaßen für Abfragen von Kampagnen, Anzeigengruppen, Keywords, Creatives oder einem Report.

// POST /campaigns/query
{
  "filters": [
    { "field": "status", "operator": "EQUALS", "value": "ENABLED" }
  ],
  "sorting": [
    { "field": "name", "order": "ASC" }
  ],
  "pagination": {
    "offset": 0,
    "pageSize": 10,
    "fetchTotalCount": true
  }
}

Filter (field, operator, value, optional ignoreCase) unterstützen einen breiten Operatorsatz: EQUALS, NOT_EQUALS, IN, NOT_IN, CONTAINS_ANY, CONTAINS_ALL, NOT_CONTAINS_ANY, NOT_CONTAINS_ALL, STARTS_WITH, ENDS_WITH, LIKE, NOT_LIKE, BETWEEN, GREATER_THAN, GREATER_THAN_OR_EQUAL_TO, LESS_THAN, LESS_THAN_OR_EQUAL_TO, IS_NULL, IS_NOT_NULL. Nicht jedes Feld jeder Entität unterstützt jeden Operator – prüfe die Feldliste in ads_schema für den jeweiligen Aufruf.

Sortierung verwendet field und order (ASC oder DESC). Wird sie weggelassen, werden die Ergebnisse aufsteigend nach id sortiert.

Paginierung verwendet offset und pageSize, wobei fetchTotalCount (Standard false) zusätzlich die Gesamtzahl der Treffer zurückgibt. Reporting-Endpunkte begrenzen pageSize auf 5000 und verwenden standardmäßig 100, wenn nichts angegeben ist; andere /query-Endpunkte dokumentieren keine feste Obergrenze – beginne mit einer moderaten pageSize und blättere mit offset durch.

Keywords und negative Keywords haben außerdem Bulk-Endpunkte (keywords_bulkCreate, keywords_bulkUpdate, negativeKeywords_bulkCreate, negativeKeywords_bulkUpdate), die ein items-Array entgegennehmen, wobei jedes Element eine vom Client bereitgestellte correlationId und einen data-Payload enthält, plus ein allowPartialSuccess-Flag.


Reports

Der Tag Reports umfasst 10 Operationen: Performance-Reports auf App-Ebene und Business-Brand-Ebene nach Kampagne, Anzeigengruppe, Anzeige, Keyword und Suchbegriff (reports_appsCampaignsQuery, reports_appsAdgroupsQuery, reports_appsAdsQuery, reports_appsKeywordsQuery, reports_appsSearchtermsQuery sowie die entsprechenden reports_businessBrandsCampaignsQuery / reports_businessBrandsAdgroupsQuery / reports_businessBrandsAdsQuery / reports_businessBrandsKeywordsQuery / reports_businessBrandsSearchtermsQuery für Apple-Maps-Brand-Anzeigen).

Jede Report-Operation ist ein POST /reports/.../query-Aufruf mit demselben oben beschriebenen filters / sorting / pagination-Selektor-Body, begrenzt auf ein Werbekonto:

{
  "operation": "reports_appsCampaignsQuery",
  "args": {
    "adAccountId": "123456789",
    "body": {
      "pagination": { "pageSize": 100 }
    }
  }
}

Führe zuerst ads_schema { operation: "reports_appsCampaignsQuery" } aus, um die genauen filterbaren/gruppierbaren Felder für diesen Report zu sehen, bevor du ihn aufrufst – sie unterscheiden sich je nach Reporttyp.


Hochladen von Creative-Assets

assets_upload ist die einzige Operation, die multipart/form-data statt JSON sendet. Ein MCP-Client kann nur JSON senden, daher wird der Dateiteil als Objekt beschrieben und der Server wandelt ihn in einen echten Multipart-Upload um:

{
  "operation": "assets_upload",
  "args": {
    "adAccountId": "123456789",
    "body": {
      "file": { "path": "/Users/you/creative/hero.png", "contentType": "image/png" },
      "promotedObjectId": "987654",
      "promotedObjectType": "BUSINESS_BRAND"
    }
  }
}

Verwende { "path": "/abs/path" }, um eine Datei von dem Rechner zu lesen, auf dem der Server läuft, oder { "base64": "...", "filename": "hero.png", "contentType": "image/png" }, wenn die Bytes bereits vorliegen. Apple akzeptiert hier PNG, JPG und HEIC.


Fehler und Rate-Limits

  • Der Antwort-Body von Apple wird unverändert durchgereicht. Bei einem 4xx/5xx sieht der Agent Apples eigene error.code, error.message und error.details und kann so genau erkennen, was abgelehnt wurde, und sich selbst korrigieren.

  • Bei 401 erneuert dieser Server das Zugriffstoken einmal und wiederholt den Aufruf automatisch – veraltete Token-Fehler sollten dem Agenten nicht angezeigt werden.

  • Bei 429 enthält die Antwort einen hint sowie die von Apple gesendeten Rate-Limit-Response-Header (RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset und Retry-After, sofern vorhanden). Der Server wiederholt den Aufruf nicht in deinem Namen – warte anhand dieser Header ab, wobei Retry-After bevorzugt werden sollte, wenn es vorhanden ist. Apples Dokumentation veröffentlicht keinen festen numerischen Grenzwert, also hartcodiere keinen; lies stattdessen die Header jeder Antwort.

  • Ein Bulk-Request (keywords_bulkCreate usw.) zählt unabhängig von der Anzahl der enthaltenen Elemente als ein einziger Aufruf gegen das Rate-Limit – bündle Änderungen bei großem Umfang in Bulk-Requests.

  • Antworten über ~120.000 Zeichen werden mit einem Hinweis gekürzt, die Anfrage einzugrenzen. Senke bei Listen-/Report-Endpunkten die pageSize oder füge spezifischere filters hinzu, statt alles auf einmal abzurufen.


Trockenlauf

Jeder ads_call akzeptiert _dryRun: true. Er löst die Anfrage auf – Methode, Pfad, Pfadparameter, Query, Header, Body und den Werbekonto-Kontext – ohne etwas an Apple zu senden:

{
  "operation": "campaigns_update",
  "_dryRun": true,
  "args": {
    "id": "542370549",
    "adAccountId": "123456789",
    "body": { "status": "PAUSED" }
  }
}
{
  "dryRun": true,
  "operationId": "campaignsIdPut",
  "method": "PUT",
  "path": "/campaigns/{id}",
  "pathParams": { "id": "542370549" },
  "query": {},
  "headers": {},
  "body": { "status": "PAUSED" },
  "adAccountId": "123456789",
  "xApContext": "adAccountId=123456789;"
}

Verwende dies, um eine Schreibanfrage gegen ads_schema zu prüfen, bevor sie ein echtes Werbekonto berührt.


Umgebungsvariablen

Variable

Erforderlich

Zweck

APPLE_ADS_CLIENT_ID

ja

Client-ID aus dem Anmeldedaten-Block der Apple-Ads-Oberfläche

APPLE_ADS_TEAM_ID

ja

Team-ID aus demselben Anmeldedaten-Block

APPLE_ADS_KEY_ID

ja

Key-ID aus demselben Anmeldedaten-Block

APPLE_ADS_PRIVATE_KEY_PATH

ja*

Absoluter Pfad zu deiner EC-Private-Key-Datei

APPLE_ADS_PRIVATE_KEY

ja*

Inline-PEM-Inhalt statt eines Dateipfads (nützlich in CI)

APPLE_ADS_AD_ACCOUNT_ID

nein

Standard-Werbekonto-ID für X-Ap-Context. Gültige Werte mit acls_list ermitteln

APPLE_ADS_BASE_URL

nein

Standard: https://api.ads.apple.com/v1

APPLE_ADS_AUTH_BASE_URL

nein

Standard: https://appleid.apple.com

APPLE_ADS_EXPOSE_ALL_TOOLS

nein

1 oder true registriert alle 99 Operationen als einzelne MCP-Tools. Nur zum Debuggen

* Gib genau eine der beiden Variablen APPLE_ADS_PRIVATE_KEY_PATH oder APPLE_ADS_PRIVATE_KEY an.

Kopiere .env.example nach .env für lokale Shells. .env*, *.p8 und *.pem sind bereits in .gitignore.


Wie der Katalog generiert wird

openapi/apple-ads.openapi.json   →   bun run generate   →   generated/tools.json
                                                              generated/manifest.json

openapi/apple-ads.openapi.json ist die vendored Quelle der Wahrheit: rekonstruiert aus Apples offiziellem Node-Client (apple/apple-ads-platform-api-node, Spec-Tag 109) und Endpunkt für Endpunkt gegen Apples veröffentlichte Dokumentation abgeglichen. scripts/generate-tools.ts liest sie und erzeugt einen Katalogeintrag pro Pfad+Methode – 99 Operationen, 80 Pfade, 28 Tags – in generated/tools.json, plus Zählungen und Herkunft in generated/manifest.json.

Tool-Beschreibungen werden aus Apples eigener Dokumentation angereichert. generated/docs.json ordnet jedem METHOD /path den Titel, die Zusammenfassung und die URL seiner Seite auf developer.apple.com zu, sodass ads_search und ads_schema Apples eigene Formulierungen und einen Link zum Öffnen zurückgeben.

bun run generate   # rebuild the catalog from openapi/apple-ads.openapi.json
bun run docs       # refresh generated/docs.json from developer.apple.com
bun run smoke      # regenerate, validate the catalog, boot the server

Die Abdeckung ist verifiziert, nicht angenommen. Apple veröffentlicht 99 Endpunktseiten; dieser Katalog hat 99 Operationen, und jede stimmt 1:1 nach Methode und Pfadform überein. Der vollständige Endpunkt-für-Endpunkt-Vergleich befindet sich in docs/endpoint-coverage.md.

generated/ ist Build-Ausgabe. Bearbeite sie niemals von Hand – ändere die Spec oder den Generator und generiere dann neu. CI schlägt fehl, wenn der eingecheckte Katalog nicht mit einer frischen Generierung übereinstimmt.


Notausstieg: jede Operation als eigenes Tool

export APPLE_ADS_EXPOSE_ALL_TOOLS=1   # also register all 99 operations as individual MCP tools

Lass dies im normalen Betrieb nicht gesetzt – es existiert zum Debuggen des generierten Katalogs, nicht für den täglichen Agenten-Einsatz, und es bringt das vollständige Schema jeder Operation zurück in den Kontext.


Sicherheit

  • In diesem Repository wird nichts Geheimes gespeichert. Anmeldedaten kommen ausschließlich aus Umgebungsvariablen.

  • .gitignore blockiert *.p8, *.pem, PrivateKey_*.p8 und .env*.

  • Das Client-Secret ist ein per Richtlinie kurzlebiges ES256-JWT, das du lokal mit deinem privaten Schlüssel signierst (gültig bis zu 180 Tage, Apples eigenes Maximum); Apple erhält den privaten Schlüssel selbst nie. Das resultierende Zugriffstoken wird nur im Speicher zwischengespeichert und mit einem 60-Sekunden-Puffer vor dem von Apple zurückgegebenen expires_in (derzeit 3600 Sekunden) erneuert – plus einem einmaligen Wiederholungsversuch bei einem 401.

  • Tool-Ergebnisse geben niemals Anmeldedaten an das Modell zurück.

  • Die einzigen Netzwerkziele sind APPLE_ADS_BASE_URL (Standard: Apples API-Host) und APPLE_ADS_AUTH_BASE_URL (Standard: Apples OAuth-Host).

  • Wenn du jemals versehentlich einen privaten Schlüssel committest, rotiere ihn sofort in der Apple-Ads-Oberfläche.

Siehe SECURITY.md zum Melden einer Sicherheitslücke.


Mitwirken

Issues und Pull Requests sind willkommen. Siehe CONTRIBUTING.md. Zwei Regeln sind am wichtigsten: generated/ wird neu generiert statt von Hand bearbeitet, und in einem Pull Request dürfen niemals Anmeldedaten auftauchen.


Lizenz

MIT © imfaisii

Nicht mit Apple Inc. verbunden oder von ihr unterstützt.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    A Model Context Protocol server that exposes the entire Apple App Store Connect API (1,200+ operations) as MCP tools, enabling AI assistants to query apps, manage builds, handle submissions, read analytics, and more.
    21
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for Meta Ads providing 30 tools for account discovery, campaign management, targeting research, and insights. Designed with LLM-friendly outputs and productivity features like cloning and bulk operations.
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that exposes the Apple App Store Connect API to AI agents, enabling management of apps, metadata, in-app purchases, subscriptions, TestFlight, provisioning, reviews, analytics, and more through 113 curated tools plus two generic JSON:API escape-hatch tools.
    1
  • A
    license
    Not graded
    quality
    B
    maintenance
    Complete Google Ads API v21 MCP server with 40+ fully implemented tools for campaign, ad group, keyword, extension, and portfolio bidding management, enabling AI assistants to create, optimize, and manage Google Ads campaigns through natural language commands.
    MIT

View all related MCP servers

Related MCP Connectors

  • Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.

  • Free public MCP for AI agents — 193 tools, 44 workflows. No API key.

  • 60+ Meta Ads tools for AI agents: audits, campaign management, audiences and CAPI tracking.

View all MCP Connectors

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/imfaisii/apple-ads-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server