MCP Server¶
Pablo exposes your ads data to AI assistants — Claude, ChatGPT, Cursor, and any other MCP-compatible client — through an MCP server. Connect once, and the assistant can answer questions like "What's my CPM trend over the last quarter?" without you copying data into a chat.
What is MCP, briefly?¶
The Model Context Protocol is a standard that lets AI assistants call external "tools" on your behalf. Pablo's MCP server publishes read-only tools that wrap the Meta Marketing API and the Google Ads API, plus tools for Pablo's own resources (builds, connections, assets). The assistant can list your accounts, drill into campaigns, ad sets, and ads, and pull insights — using the connections you already hold in Pablo.
The Pablo MCP endpoint is:
What the assistant can do¶
All browsing and insights tools are read-only — the assistant cannot create, pause, update, or delete anything on your ad accounts. The one exception is pablo_feedback_create, which does nothing to your ads: it just files feedback with the Pablo team.
Browsing your Meta account structure¶
| Tool | What it does |
|---|---|
meta_accounts_list |
Lists the Meta ad accounts you have access to via Pablo |
meta_accounts_get |
Full details for one account: balance, amount spent, currency, business info, funding source |
meta_campaigns_list |
Lists campaigns under an ad account; can filter by status (ACTIVE, PAUSED, etc.) and by created/updated window |
meta_campaigns_get |
Full details for one campaign: budget, bid strategy, special ad categories |
meta_adsets_list |
Lists ad sets under a campaign or across an ad account; can filter by created/updated window |
meta_adsets_get |
Full details for one ad set: targeting, optimization goal, attribution spec |
meta_ads_list |
Lists ads under an ad set, campaign, or ad account; can filter by status and by created/updated window |
meta_ads_get |
Full details for one ad, including a creative summary (thumbnail, body, video id, CTA) |
meta_activities_list |
The account's change history (Meta Activity Log): who changed what, when |
Browsing your Google Ads account structure¶
The same surface exists for Google Ads. Google's "ad groups" are exposed as adsets for cross-platform consistency.
| Tool | What it does |
|---|---|
googleads_accounts_list |
Lists the Google Ads accounts you have access to via Pablo |
googleads_accounts_get |
Full details for one account |
googleads_campaigns_list / googleads_campaigns_get |
Campaigns under an account / one campaign in full |
googleads_adsets_list / googleads_adsets_get |
Ad groups under a campaign or account / one ad group in full |
googleads_ads_list / googleads_ads_get |
Ads / one ad in full |
googleads_activities_list |
The account's change history |
Insights¶
| Tool | What it does |
|---|---|
meta_insights_get |
Performance metrics (spend, impressions, reach, clicks, CPM, CTR, actions, action values) for any Meta object — account, campaign, ad set, or ad |
googleads_insights_get |
The Google Ads equivalent |
These are the workhorses. Both support flexible date filtering and granularity (see below); meta_insights_get also supports demographic and placement breakdowns and same-period comparisons.
Pablo¶
| Tool | What it does |
|---|---|
pablo_connections_list |
Lists the marketing-platform connections you've linked to Pablo |
pablo_assets_list |
Lists assets exposed by one Pablo connection (ad accounts, pages, pixels, Instagram accounts) |
pablo_builds_list |
Lists ad builds in your Pablo account, with optional filters by ad account, status, or source |
pablo_feedback_create |
Lets the assistant send Pablo's team feedback about missing tools, missing fields, bugs, or suggestions |
Connecting an assistant¶
Claude¶
- Open Claude settings → Connectors → Add custom connector
- URL:
https://app.pablo.social/mcp/ - Click Connect. You'll be sent through Pablo's OAuth flow:
- Sign in to Pablo if you aren't already
- Approve the consent screen
- Start a new conversation and ask Claude to "list my Meta ad accounts" — it should pick up the new tools automatically.
ChatGPT¶
ChatGPT supports MCP servers through the Connectors feature on Business, Enterprise, and Team plans. In your ChatGPT workspace settings, add a custom connector pointing to https://app.pablo.social/mcp/ and sign in to Pablo when prompted.
ChatGPT's connector UI moves around — refer to OpenAI's own help docs for the current setup steps.
Other MCP-compatible clients¶
For Cursor, Windsurf, VS Code, Claude Desktop, and other clients, add Pablo to your MCP config file:
The client will trigger Pablo's OAuth flow on first use.
Date filtering¶
Insights and list tools take a single period string. It accepts four forms — the assistant picks whichever is most natural:
| Form | Example | Meaning |
|---|---|---|
| Named window | last_30d, mtd, last_quarter |
A window relative to today |
| ISO week | 2026-W24 |
That Monday–Sunday week |
| Month | 2026-06 |
That calendar month |
| Explicit range | 2026-07-01..2026-07-31 |
Inclusive start..end |
Named windows¶
| Value | Meaning |
|---|---|
today, yesterday |
The single day |
last_7d, last_14d, last_28d, last_30d, last_90d |
Rolling windows ending yesterday |
wtd, mtd, qtd, ytd |
Week / month / quarter / year to date — up to and including yesterday (on the first day of the unit there is nothing to report yet, and the call is rejected) |
last_week, last_month, last_quarter, last_year |
The previous full calendar period |
all_time |
From 2010-01-01 through yesterday |
Named windows resolve against the ad account's timezone, not the server's. Every windowed response echoes the resolved window back as period: {id, start, end, days, timezone}, so it's always explicit what was measured.
Granularity¶
Set granularity to bucket insights results:
| Value | Result |
|---|---|
total (default) |
A single aggregate row across the whole window |
day |
One row per calendar day |
week |
One row per ISO calendar week (Monday–Sunday). If the window starts mid-week, it expands outward to whole weeks |
month |
One row per calendar month |
quarter, year |
Meta reports monthly — these return monthly rows covering the window |
So "monthly spend for 2026" is period='2026-01-01..2026-12-31', granularity='month' — twelve rows back.
Comparison¶
On meta_insights_get, set compare_to='previous_period' (same duration immediately before) or compare_to='previous_year' (same window, one year earlier) to get a paired comparison in a single call. Useful for "this month vs last year". (googleads_insights_get supports granularity but not compare_to.)
granularity and compare_to apply to insights only — list tools don't bucket or compare, they just narrow.
On list tools¶
The list tools (meta_campaigns_list, meta_adsets_list, meta_ads_list, and the googleads_* equivalents) accept the same period plus one extra parameter:
| Parameter | Meaning |
|---|---|
basis |
created (default — when the object was made; answers "launched in X") or updated (last edit; answers "edited in X") |
So "campaigns launched this month" is meta_campaigns_list(account_id=..., period='mtd'). "Ads edited last week" is meta_ads_list(account_id=..., period='last_week', basis='updated').
meta_activities_list and pablo_builds_list also take period (activity lists filter on event time, so there is no basis there).
Renamed parameters refuse loudly¶
An earlier version of this surface used relative / start / end / date_field / breakdowns / limit / cursor / ad_account_id. Those spellings are rejected with an error naming the replacement rather than silently ignored — so an assistant using stale names finds out immediately. Current names: period, basis, by, filters, account_id, and page (below).
Pagination¶
Lists take a single page object — {cursor, limit} — and return a page block:
If has_more is true, the assistant passes page.next_cursor back as page: {cursor: ...} on the next call. The assistant handles this automatically when it needs to.
If a list tool has more pages and no date filter was supplied, the response's warnings array carries a nudge to set period (e.g. 'last_30d' or 'mtd'). Large accounts can have thousands of objects, and an unbounded paginated read is expensive — narrowing the window when the question allows it keeps calls fast.
Responses also carry a small envelope alongside data — the resolved period, warnings, and source/freshness metadata — so the assistant can always tell what was measured and whether anything was skipped.