{"name":"io.github.davidmosiah/google-ads-mcp","slug":"davidmosiah-google-ads-mcp","title":null,"description":"Unofficial Google Ads MCP for campaigns, keywords, budgets, and gated mutations.","url":"https://mcp.market/server/davidmosiah-google-ads-mcp","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":25,"stars":4,"forks":0,"downloads_week":null,"last_push_at":"2026-09-07T12:19:04.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/davidmosiah/google-ads-mcp-unofficial","website":"https://github.com/davidmosiah/google-ads-mcp-unofficial","version":"0.1.3","remotes":[],"packages":[{"registryType":"npm","identifier":"google-ads-mcp-unofficial","version":"0.1.3","transport":{"type":"stdio"},"environmentVariables":[{"description":"Google Ads API developer token from your Google Ads Manager account. Required.","format":"string","isSecret":true,"name":"GOOGLE_ADS_DEVELOPER_TOKEN"},{"description":"Google OAuth2 client ID. Required.","format":"string","name":"GOOGLE_ADS_CLIENT_ID"},{"description":"Google OAuth2 client secret. Prefer storing in ~/.google-ads-mcp/config.json via setup.","format":"string","isSecret":true,"name":"GOOGLE_ADS_CLIENT_SECRET"},{"description":"Manager (MCC) customer ID used as login-customer-id header, no dashes (e.g., 1234567890). Optional but required for multi-account access.","format":"string","name":"GOOGLE_ADS_LOGIN_CUSTOMER_ID"},{"description":"OAuth redirect URI. Defaults to http://127.0.0.1:3000/callback.","format":"string","name":"GOOGLE_ADS_REDIRECT_URI"},{"description":"Optional local path for OAuth tokens. Defaults to ~/.google-ads-mcp/tokens.json (0600).","format":"string","name":"GOOGLE_ADS_TOKEN_PATH"},{"description":"Optional payload mode: summary, structured, or raw. Defaults to structured. raw returns full Google Ads API payloads.","format":"string","name":"GOOGLE_ADS_PRIVACY_MODE"},{"description":"Set to true to enable write tools (pause/resume keywords/campaigns, set bids, set budgets). Default false (read-only). Agents changing real ad spend is high-stakes; review every change.","format":"string","name":"GOOGLE_ADS_ALLOW_MUTATIONS"},{"description":"Optional SQLite cache toggle. Set to true or sqlite to enable.","format":"string","name":"GOOGLE_ADS_CACHE"},{"description":"Optional local SQLite cache path. Defaults to ~/.google-ads-mcp/cache.sqlite.","format":"string","name":"GOOGLE_ADS_CACHE_PATH"},{"description":"Optional cache TTL in seconds. Defaults to 60. Set to 0 to keep entries indefinitely (entries are still overwritten on each hit).","format":"string","name":"GOOGLE_ADS_CACHE_TTL_SECONDS"},{"description":"Set to true to disable the HTTP retry middleware. Default false.","format":"string","name":"GOOGLE_ADS_NO_RETRY"}]}],"tools":[{"name":"google_ads_agent_manifest","description":"Machine-readable install, runtime, and client guidance for AI agents operating the Google Ads MCP. Does not read Google Ads or expose secrets.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_cache_status","description":"Return the SQLite GAQL-response cache status: enabled flag, on-disk path, entry count, oldest entry age, and default TTL. Read-only — never calls Google Ads and does not require credentials.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_capabilities","description":"Explain supported Google Ads data, mutation gating, privacy modes, and recommended agent workflow. Does not read Google Ads or expose secrets.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_clear_cache","description":"Delete all entries from the local SQLite GAQL-response cache. Does NOT touch Google Ads — only affects local memoization. Not gated by GOOGLE_ADS_ALLOW_MUTATIONS because nothing in your ad account changes. Does not require credentials.","write_action":true,"price_micros":0,"input_schema":null},{"name":"google_ads_connection_status","description":"Check whether local Google Ads env vars, token file, Node version, privacy mode, mutation gate, and retry settings are ready. Does not call Google Ads or expose secrets.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_daily_report","description":"Synthetic daily performance snapshot. Pulls YESTERDAY + LAST_7_DAYS + LAST_30_DAYS aggregates for a customer, optionally alerts when CPC exceeds cpc_alert_threshold. Pure-read workflow tool — never mutates.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_data_inventory","description":"List supported Google Ads data domains, scopes, privacy boundary, and recommended first calls. Does not call Google Ads APIs or expose user data.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_exchange_code","description":"Exchange a Google OAuth authorization code for local tokens. Tokens stored at ~/.google-ads-mcp/tokens.json with 0600 perms; never returned in the response.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_find_waste","description":"Identify keywords matching the 'high cost + zero conversions' waste pattern (inspiration from script #1). Returns a ranked list of candidates — NEVER pauses anything. Pair with google_ads_pause_keyword (gated) after user confirmation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_get_account_performance","description":"Aggregate performance metrics (impressions, clicks, cost_micros, ctr, average_cpc, conversions) for the customer over a date range.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_get_auth_url","description":"Generate a Google OAuth authorization URL for the Google Ads API. Does not read or modify Google Ads data. Use this first when no local token exists.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_get_campaign","description":"Get a single campaign with budget, bidding strategy, and status. Returns the linked campaign_budget id (use it with google_ads_set_campaign_budget_micros).","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_get_campaign_performance","description":"Per-campaign performance metrics over a date range. Filter to a single campaign with campaign_id.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_get_keyword_performance","description":"Per-keyword performance metrics over a date range. Returns clicks, cost_micros, ctr, average_cpc, conversions, conversion_rate. Filter with campaign_id, ad_group_id, or min_clicks.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_list_accounts","description":"List all customer accounts the authenticated user can access. For a manager (MCC) account, this includes every child customer.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_list_ad_groups","description":"List ad groups under a campaign (or all campaigns) in a customer.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_list_campaigns","description":"List campaigns under a Google Ads customer. Returns id, name, status, advertising_channel_type, bidding_strategy_type, and campaign_budget linkage.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_list_keywords","description":"List keyword criteria under a campaign or ad group. Returns criterion_id, keyword text, match type, status, and cpc_bid_micros.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_onboarding","description":"Return the 11-question Delx onboarding flow plus the current profile state and missing critical fields. Same profile reused across all Delx MCPs.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_pause_campaign","description":"Pause an entire campaign by id. GATED.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_pause_keyword","description":"Pause a single keyword by criterion_id. GATED: requires GOOGLE_ADS_ALLOW_MUTATIONS=true AND explicit_user_intent=true. Ask the user first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_privacy_audit","description":"Return the local privacy, mutation-gate, cache, token-path, env-presence and redaction posture without revealing secret values.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_profile_get","description":"Read the shared Delx profile (~/.delx-wellness/profile.json). Returns the user's preferred name, language, timezone, etc. Cross-tool — same profile is shared with other Delx MCPs. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_profile_update","description":"Persist a partial patch to the shared Delx profile (~/.delx-wellness/profile.json). REQUIRES explicit_user_intent=true. NEVER stores secrets — writes will be rejected at validation time.","write_action":true,"price_micros":0,"input_schema":null},{"name":"google_ads_quick_wins","description":"Identify keywords with LOW CPC + HIGH CTR + at-least-some conversions — candidates to RAISE the bid on. Inverse of google_ads_find_waste. Returns a ranked list with a recommended_bid_micros (current + 25%, capped at 2x). NEVER changes bids; pair with google_ads_set_keyword_bid_micros (gated) after user confirmation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_resume_campaign","description":"Resume (enable) a paused campaign by id. GATED.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_resume_keyword","description":"Resume (enable) a single paused keyword by criterion_id. GATED.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_revoke_access","description":"Revoke the current Google OAuth grant and delete local tokens. Use only when the user explicitly wants to disconnect Google Ads.","write_action":false,"price_micros":0,"input_schema":null},{"name":"google_ads_set_campaign_budget_micros","description":"Update a campaign budget's amount_micros. GATED. campaign_budget_id is NOT the campaign id — discover it via google_ads_get_campaign (campaign_budget.id).","write_action":true,"price_micros":0,"input_schema":null},{"name":"google_ads_set_keyword_bid_micros","description":"Update the cpc_bid_micros for a keyword criterion. GATED. Bid must be in micros (10_000 = $0.01).","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":83,"grade":"B","scanned_at":"2026-09-26T11:37:34.934Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T11:37:34.983Z","components":{"code":{"score":25,"max":25,"notes":["48 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 19 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"google-ads-mcp-unofficial","version":"0.1.3","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":5,"publishedAt":"2026-05-23T18:01:54.439Z","repositoryUrl":"git+https://github.com/davidmosiah/google-ads-mcp-unofficial.git"}],"repo":{"found":true,"owner":"davidmosiah","repo":"google-ads-mcp-unofficial","archived":false,"pushedAt":"2026-09-07T12:19:04Z","stars":4,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/624359?v=4","ownerCreatedAt":"2011-02-18T00:23:21Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/624359?v=4&s=128","source":"github"},"presence":{"stars":4,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-07T12:19:04.000Z","score":25}}}},"grade_history":[],"reviews":[]}