StinCodes/FbAdLibraryMCPServer
If you are the rightful owner of FbAdLibraryMCPServer and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
The Facebook Ad Library MCP Server is a Model Context Protocol server that provides access to Facebook's Ad Library through web scraping, offering advanced filtering and sorting options for ad searches.
search_ads
Search for Facebook ads with optional filters such as company, date range, and keywords.
Facebook Ad Library MCP Server
A Model Context Protocol (MCP) server that provides access to Facebook's Ad Library through web scraping. This server exposes a single MCP tool for searching advertisements with comprehensive filtering options.
Features
- MCP-compliant: Built using the official MCP SDK
- Comprehensive ad data: Extracts advertiser, content, dates, impressions, spend, and more
- Advanced filtering: Filter by company, date range, and keywords
- Smart pagination: Auto-scrolling to retrieve up to 100 ads per search
- Flexible sorting: Sort by date (ascending/descending) or relevance
Installation
- Clone the repository:
git clone <repository-url>
cd FbAdLibraryMCPServer
- Install dependencies:
npm install
- Install Playwright browsers:
npx playwright install
Usage
Development
npm run dev
Production
npm run build
npm start
The server will start on port 3000 (configurable via PORT
environment variable).
API Documentation
MCP Tool: search_ads
Search for Facebook ads with optional filters.
Parameters:
company
(string, optional): Company/advertiser name to filter bystart_date
(string, optional): Start date in YYYY-MM-DD formatend_date
(string, optional): End date in YYYY-MM-DD formatkeywords
(array of strings, optional): Keywords to search in ad contentlimit
(integer, optional): Maximum ads to return (default: 50, max: 100)order
(string, optional): Sort order - "date_desc", "date_asc", or "relevance" (default: "date_desc")
Example Tool Call:
{
"tool": "search_ads",
"arguments": {
"company": "Nike",
"start_date": "2024-01-01",
"end_date": "2024-01-31",
"keywords": ["running", "shoes"],
"limit": 10,
"order": "date_desc"
}
}
Response Format:
{
"ads": [
{
"id": "unique_ad_identifier",
"advertiser": "Company Name",
"content": "Ad text content",
"start_date": "Jan 15, 2024",
"end_date": "Feb 15, 2024",
"impressions": "1,000-5,000",
"spend": "$100-$500",
"platforms": ["Facebook"],
"creative_url": "https://...",
"demographics": {"targeting": "..."},
"scraped_at": "2024-01-20T10:30:00Z"
}
]
}
MCP Client Connection
Connect to the server using any MCP-compatible client:
HTTP Transport:
- URL:
http://localhost:3000/mcp
- Method: POST
- Headers:
Content-Type: application/json
Health Check:
- URL:
http://localhost:3000/healthz
- Method: GET
Architecture
- MCP Server (
src/index.ts
): Express HTTP server hosting MCP protocol - Search Handler (
src/mcp/searchAdsHandler.ts
): Core business logic - Web Scraper (
src/scraper/scrapeFacebookAds.ts
): Playwright-based Facebook scraper - Filters (
src/utils/filters.ts
): Date parsing and filtering utilities
Performance Considerations
- Rate Limiting: Built-in delays between requests to avoid blocking
- Pagination: Auto-scrolling with intelligent stopping conditions
- Browser Management: Proper cleanup of Playwright browser instances
- Memory Efficiency: Streaming data processing where possible
Anti-Bot Detection Countermeasures
This server successfully bypasses Facebook's anti-bot detection through:
- Virtual Display (Xvfb): Runs non-headless browsers in cloud environments
- Natural Navigation: Mimics human browsing patterns (homepage → Ad Library)
- Simplified Browser Config: Avoids complex "stealth" techniques that trigger detection
- Smart Timeout Handling: 30-second browser launch timeout with fallback mechanisms
- Production-Optimized: Different behavior in production vs development environments
Known Limitations
- Runs in non-headless mode to avoid detection
- Limited to 100 ads per search to prevent timeouts
- Date formats depend on Facebook's display format
- Subject to Facebook's anti-bot measures
Legal & Ethical Notes
- Respects Facebook's rate limiting through built-in delays
- Does not store personal user data
- Intended for research and analysis purposes
- Users should comply with Facebook's Terms of Service
Dependencies
@modelcontextprotocol/sdk
: MCP protocol implementationplaywright
: Web scraping automationdate-fns
: Date parsing and manipulationexpress
: HTTP server frameworkzod
: Runtime type validation
Deployment (Fly.io)
- Install flyctl:
curl -L https://fly.io/install.sh | sh
export FLYCTL_INSTALL="/root/.fly"
export PATH="$FLYCTL_INSTALL/bin:$PATH"
- Deploy to Fly.io:
flyctl auth signup
flyctl launch --no-deploy
flyctl secrets set NODE_ENV=production
flyctl deploy
- Live Deployment:
- App URL:
https://fbadlibrarymcpserver.fly.dev
- Health check:
https://fbadlibrarymcpserver.fly.dev/healthz
- MCP endpoint:
https://fbadlibrarymcpserver.fly.dev/mcp
(POST only) - Test endpoint:
https://fbadlibrarymcpserver.fly.dev/test-search
(GET/POST)
- App URL:
Connection Details
Public URL: https://fbadlibrarymcpserver.fly.dev
Quick Test: https://fbadlibrarymcpserver.fly.dev/test-search?company=Nike&limit=3
MCP Client Configuration:
{
"transport": "http",
"url": "https://fbadlibrarymcpserver.fly.dev/mcp",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream"
}
}
Authentication: None required
License
ISC