ads-mcp-server
ads-mcp-server
Lokaler MCP-Server, der Google Ads- und Meta Marketing-Leistungsdaten, Kampagneneinstellungen und Änderungshistorien für Claude (Cowork) für tägliche Live-Dashboard-Workflows bereitstellt.
Funktionsweise
Drei Tools sind bei MCP registriert:
Tool | Zweck |
| Leistung + Diagnosen + 56-Tage-Reihe + WoW + 8-Wochen-DoW-Vergleiche + Kampagneneinstellungen + Änderungshistorie |
| Gleiche Struktur wie Google. Conversions gefiltert nach |
| Einstellungen + Änderungshistorie für |
Architektur: Abruf der Rohdaten (Anzeigen × Tag) einmal pro Plattform pro Stunde, Zwischenspeicherung in Parquet, Ableitung aller Aggregationen in Pandas. Kein API-Aufruf pro Aufschlüsselung.
Related MCP server: Google Ads MCP Server
Voraussetzungen
macOS / Linux
Python 3.13 (via pyenv empfohlen)
uvPaketmanager:brew install uvGoogle Ads API-Zugriff — siehe Google Ads API Erste Schritte
Meta Marketing API-Zugriff — siehe Marketing API Erste Schritte
Links zur Einrichtung der Anmeldedaten
Anmeldedaten | Bezugsquelle |
| Google Ads UI → Tools → API-Center |
| https://console.cloud.google.com → OAuth 2.0-Client (Desktop-App) |
| Führen Sie |
| Kommagetrennt, ohne Bindestriche. Zu finden in der Google Ads UI oben rechts |
| MCC-Manager-Konto-ID, ohne Bindestriche |
| https://developers.facebook.com → Meine Apps → Einstellungen → Basis |
| https://business.facebook.com → Unternehmenseinstellungen → Systembenutzer → Neuen Token generieren (langlebig, mit |
| Meta Ads Manager → Kontowähler oben links. Format: |
Installation
cd ~/marketing-ds/ads-mcp-server
uv sync --extra devuv erstellt .venv/ und installiert alle in pyproject.toml fixierten Abhängigkeiten.
Anmeldedaten konfigurieren
Zwei Optionen:
Option A — auf bestehende .env verweisen (empfohlen, falls Sie bereits Schlüssel in ~/marketing-ds/decision_science/.env haben):
export ADS_MCP_ENV_FILE=/Users/jmacaggi/marketing-ds/decision_science/.envOption B — lokale .env:
cp .env.example .env
# fill in the blanksErforderliche Schlüssel sind in .env.example mit Kommentaren zu jedem Eintrag aufgelistet.
Ausführen
Lokal zum Testen:
uv run ads-mcp-serverDer Server spricht MCP über stdio — Cowork (oder jeder MCP-Client) startet ihn bei Bedarf.
Mit Claude (Cowork) verbinden
Fügen Sie diesen Block zu ~/.claude/claude_desktop_config.json hinzu (erstellen, falls nicht vorhanden):
{
"mcpServers": {
"ads": {
"command": "uv",
"args": [
"--directory",
"/Users/jmacaggi/marketing-ds/ads-mcp-server",
"run",
"ads-mcp-server"
],
"env": {
"ADS_MCP_ENV_FILE": "/Users/jmacaggi/marketing-ds/decision_science/.env"
}
}
}
}Starten Sie Claude/Cowork neu. Die Tools get_google_ads_report, get_meta_ads_report und get_campaign_settings sollten erscheinen.
Kein Hintergrund-Daemon erforderlich — Cowork startet/stoppt den Prozess pro Sitzung.
Tägliches Vorwärmen (empfohlen für Live-Dashboard)
Cache-Gültigkeitsregel: Ein Cache ist aktuell, wenn er das Datum von gestern enthält. Aktualisierung einmal täglich. Die erste Benutzerabfrage des Tages löst die Aktualisierung aus — und ein 56-Tage-Abruf bei einem großen Konto kann 1-3 Minuten dauern.
Um diese Wartezeit zu vermeiden, planen Sie ein Vorwärmen um 6 Uhr morgens über macOS launchd:
# Install
cp /Users/jmacaggi/marketing-ds/ads-mcp-server/launchd/com.jmacaggi.adsmcp.prewarm.plist \
~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.jmacaggi.adsmcp.prewarm.plist
# Verify it's scheduled
launchctl list | grep adsmcp
# Trigger immediately (test)
launchctl start com.jmacaggi.adsmcp.prewarm
# Logs
tail -f ~/marketing-ds/ads-mcp-server/logs/prewarm.stdout.log
tail -f ~/marketing-ds/ads-mcp-server/logs/$(date +%Y-%m-%d).logWas jeden Morgen um 6 Uhr passiert:
Abruf Google Ads Leistung 56d, Einstellungen, change_event 29d → Cache
(Meta derzeit deaktiviert — siehe "Meta-Status" unten)
Schreibt Aktualisierungsstempel
cache/google_lastrefresh.txt= heute
Wenn Sie Cowork öffnen, sind die Google-Daten bereits geladen. Tool-Aufrufe erfolgen in <1s.
Zum Deinstallieren:
launchctl unload ~/Library/LaunchAgents/com.jmacaggi.adsmcp.prewarm.plist
rm ~/Library/LaunchAgents/com.jmacaggi.adsmcp.prewarm.plistMeta-Status (Stand 07.05.2026)
Meta-Tools (get_meta_ads_report, get_campaign_settings(platform="meta"|"both")) sind strukturell vollständig, aber noch nicht durchgehend verifiziert.
Was funktioniert:
Der Leistungsabruf ist in 7-Tage-Fenster unterteilt (vermeidet den Fehler "Service temporarily unavailable / subcode 1504044" "result too large")
Daten auf Anzeigenebene sind aufgeteilt:
level=campaignfür die 56-Tage-Reihe,level=adnur für gestern (vermeidet 5-minütige Paginierung)Der AdSet-Abruf ist gefiltert auf
effective_status IN [ACTIVE, PAUSED](vermeidet das Paginieren von Tausenden archivierter Anzeigengruppen)
Was uns blockiert hat:
Nach dem ersten großen Leistungsabruf stieß der AdSet-Abruf auf das stündliche Ratenlimit von Meta (
code 17, Subcode 2446079: "User request limit reached"). Die Abklingzeit beträgt normalerweise 10-60 Minuten.
Zum erneuten Testen morgen früh (nachdem das Kontingent zurückgesetzt wurde):
# Remove --skip-meta from the launchd plist to enable Meta in pre-warm
sed -i '' '/<string>--skip-meta<\/string>/d' \
~/Library/LaunchAgents/com.jmacaggi.adsmcp.prewarm.plist
launchctl unload ~/Library/LaunchAgents/com.jmacaggi.adsmcp.prewarm.plist
launchctl load ~/Library/LaunchAgents/com.jmacaggi.adsmcp.prewarm.plist
# Or run manually
ADS_MCP_ENV_FILE=/Users/jmacaggi/marketing-ds/decision_science/.env \
uv run python scripts/prewarm.pyFalls Meta weiterhin Ratenbegrenzungen erzwingt, Fallback-Optionen (noch nicht implementiert):
Asynchrone Berichtsausführungen (
async=True) für den LeistungsabrufStrengerer
effective_status-Filter (nurACTIVE, pausierte ausschließen)
Wenn Sie einen langlebigen Hintergrundprozess bevorzugen (optional, für Cowork nicht erforderlich): verwenden Sie nohup uv run ads-mcp-server > /tmp/ads-mcp.log 2>&1 & oder eine launchd-plist.
Optional: CSV-Überschreibung (API überspringen)
Die Google Ads UI exportiert CSV-Berichte ohne API-Kontingentbeschränkungen. Legen Sie eine CSV in cache/external/ ab, um den API-Abruf zu überschreiben:
cache/external/google_2026-05-07.csv
cache/external/meta_2026-05-07.csvWenn eine passende CSV existiert UND neuer ist als der Parquet-Cache, lädt der Server diese anstelle des API-Aufrufs. Die Antwort setzt metadata.data_source = "csv_override", damit Cowork dies erkennt.
Das CSV-Spaltenschema muss mit dem Parquet übereinstimmen (siehe src/ads_mcp_server/google_ads.py und meta_ads.py für Spaltennamen: date, campaign_id, campaign_name, ad_id, ad_name, spend, impressions, clicks, conversions, ...).
Test
uv run pytest -vAlle Tests basieren auf Mocks — keine Netzwerkaufrufe. Deckt ab:
classify_campaignMarke/Keine Marke/Sonstigesdiagnose5-Zustands-Klassifikator8-Wochen-gleicher-Wochentag-Selektor wählt die richtigen 8 Daten aus
WoW-Delta + Division durch Null
actions[]-Filter für MetaSnapshot-Diff inklusive Null-Altwert und Bereinigung
Fehlende Anmeldedaten geben sauberen Fehler zurück (keine Exception)
Protokolle
Jeder API-Aufruf und Fehler wird in logs/YYYY-MM-DD.log protokolliert (eine Datei pro Tag).
Fehlerbehebung
google-ads-Installation schlägt fehl: Stellen Sie sicher, dass Python 3.13 (uv python pin 3.13) undpip install grpcioauf Ihrem System funktionieren. Auf Apple Silicon:arch -arm64 uv sync.Meta-Token abgelaufen: Generieren Sie das Systembenutzer-Token in den Unternehmenseinstellungen neu; langlebige Token halten 60 Tage.
Tool erscheint nicht in Cowork: Überprüfen Sie
~/Library/Logs/Claude/mcp*.logauf Startfehler. Bestätigen Sie, dassuvimPATHfür den GUI-Prozess vorhanden ist (Sie benötigen möglicherweise einen vollständigen Pfad:which uv).Cache veraltet: Löschen Sie
cache/*.parquet, um einen frischen Abruf zu erzwingen.
Dateistruktur
src/ads_mcp_server/
server.py # MCP entry + tool handlers
config.py # env loading, validates creds
google_ads.py # 3 GAQL queries: perf, settings, change_event
meta_ads.py # Insights + AdSet pull
snapshots.py # Meta snapshot diff (Meta has no reliable change API)
cache.py # parquet + CSV override
aggregate.py # all pandas math
classify.py # Brand/NB/Other
diagnose.py # 5-state diagnosis
date_ranges.py # window resolution + 8wk DoW
retry.py # exponential backoff
logging_setup.py # daily file logs
schema.py # response shape constantsMaintenance
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
- FlicenseNot gradedqualityDmaintenanceEnables natural language access to Google Ads campaigns, accounts, and performance metrics via Claude, with tools for managing ad groups, keywords, budgets, and visualizing data.1
- AlicenseNot gradedqualityDmaintenanceProvides access to Google Ads API for comprehensive campaign analytics, enabling conversational ad performance analysis with Claude Code.512MIT
- FlicenseAqualityDmaintenanceEnables natural language querying of Google Analytics 4, Google Search Console, Meta Ads, and Google Ads data through Claude.23

OQVA Marketing MCPofficial
AlicenseAqualityAmaintenanceConnect Claude to your marketing data from Google and Meta, enabling read and write operations on Search Console, Analytics, Tag Manager, Business Profile, and Meta platforms.35Apache 2.0
Related MCP Connectors
Ask AI about your ads — query Meta, TikTok, and Google Ads performance in natural language.
AI marketing agent for Google Ads, Meta, GA4, TikTok, LinkedIn, Shopify, HubSpot and more.
Talk to your live-events CRM (campaigns, analytics, paid ads, segments) in Claude and ChatGPT.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/jmacaggi-gfm/ads-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server