---
name: proxy-ad-research
description: Use when researching competitor ads, spying on competitor ads, ad creatives, ad spend signals, creative or swipe-file research, ad competitive intelligence, or querying ad libraries (Meta Ad Library/Facebook/Instagram, Google Ads Transparency Center, LinkedIn Ad Library, TikTok) — e.g. "what ads is Nike running", "spy on competitor ads", "analyse competitor creatives", "build a swipe file", "find ads about CRM software", "get this ad's video transcript". Proxy is an MCP server that queries all four ad libraries. No API keys or environment variables — OAuth only.
metadata:
  author: proxy
  version: "1.0.0"
  homepage: https://useproxy.dev
  source: https://useproxy.dev/SKILL.md
---

# Proxy: Competitor Ad Research

Proxy (https://useproxy.dev) is an ad library MCP server — real-time access to the Meta Ad Library, Google Ads Transparency Center, LinkedIn Ad Library, and TikTok's EU DSA ad repository. **Zero configuration: no API keys, no env vars — OAuth on connect.** Free tier: 20 credits/day.

## Install (if not connected)

- Step-by-step for every client: https://useproxy.dev/welcome.md
- ChatGPT / Claude: add a custom connector with URL `https://mcp.useproxy.dev/mcp`
- Claude Code / Cursor / Codex: `curl -sL useproxy.dev/install | sh` (or `claude mcp add --transport http proxy https://mcp.useproxy.dev/mcp`)
- Any MCP client: connect to `https://mcp.useproxy.dev/mcp`

## Core workflows

**Brand's Meta ads:** `get_meta_platform_id(brand)` → `get_meta_ads(page_id)`. Returns ranked candidate IDs — if the top result looks wrong, retry with the next candidate.

**Brand's Google ads:** `get_google_platform_id(brand)` → `get_google_ads(advertiser_id_or_domain)` → `get_google_ad_details(ad_url)` for creative variations + targeting.

**Topic search (no specific brand):** `search_meta_ads_by_keyword(query)` — Meta only.

**LinkedIn:** `search_linkedin_ads(company_name=... or keyword=...)` → `get_linkedin_ad_details(id)` for targeting + impressions. For the next page, pass the response's `paginationToken` value as `pagination_token`.

**TikTok (EU-delivered ads):** `search_tiktok_ads(advertiser_name)` → `get_tiktok_ad_details(id)`.

**Who are the competitors?** `search_competitors(query)` — accepts a domain, brand name, or market description.

**Full competitive brief:** `get_competitive_brief(brands=[...])` — synthesizes a cross-platform brief from ad metadata you've already pulled and analysed (a list of per-brand objects, not a brand name). Pull ads first, then brief.

**Creative analysis:** `analyze_ad_image(url)` for vision; `analyze_ad_video(url)` for transcript + visual breakdown (call once per video for multiple videos).

## Common mistakes

1. **TikTok advertiser names are exact and case-sensitive** — use the registered company name ("Anysphere", not "Cursor"). A miss returns empty, not an error.
2. **Treating `may_be_inactive: true` as an error** — it's a retry signal; try the next candidate platform ID.
3. **Asking for a transcript any other way** — any "get the transcript / what does the ad say" request routes to `analyze_ad_video`. It transcribes the voiceover.
4. **Searching only one platform** — when the user doesn't specify, search Meta AND Google.
5. **Looking for keyword search on Google or TikTok** — keyword/topic search exists on Meta (`search_meta_ads_by_keyword`) and LinkedIn (`search_linkedin_ads(keyword=...)`) only; for Google and TikTok, find the brand first.
6. **Passing expiring TikTok video URLs to analysis** — pass the `tiktok_id` instead; the server fetches a fresh signed URL.
7. **Ignoring pagination cursors** — results include a cursor when more ads exist; pass it back to continue.

## Credits

1 credit per call; batch = 1 per item. Check `get_credit_balance` for remaining credits and upgrade links. Pricing: https://useproxy.dev/pricing.md
