openai-ads-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | Bind address for http transport. | 127.0.0.1 |
| MCP_PORT | No | Bind port for http transport. | 8000 |
| READ_ONLY | No | When true, write tools are not registered and cannot be called. | false |
| MCP_TRANSPORT | No | stdio or http. | stdio |
| OPENAI_ADS_API_KEY | Yes | Advertiser API key; identifies the single ad account. | |
| OPENAI_ADS_BASE_URL | No | API base URL. | https://api.ads.openai.com/v1 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| account_healthA | Validate the API key and report the account's currency, timezone, and write mode. Call this first. |
| account_overviewA | Compact campaign -> ad group -> ad tree with statuses and roll-up counts. Use this instead of trying to "list all ads": the API has no global ad list, so this
walks the hierarchy for you. Archived objects are never returned by the list endpoints
(they're only retrievable by id), so the tree shows active/paused objects only. Each
node has a derived |
| ad_performanceA | Per-ad performance over an inclusive Returns impressions/clicks/spend with derived CTR/CPC/CPM and joined conversions &
cost-per-conversion. Each row's |
| copy_auditA | Find near-identical ad copy + length issues, and return all copy in scope. Near-identical pairs use normalized token overlap (Jaccard 0..1) — a cheap, deterministic
screen for mechanical near-duplicates (reworded/reordered text), NOT same-angle
paraphrases. For semantic "these say the same thing" dedup, reason over the returned
|
| context_hints_auditC | Flag ad groups whose |
| get_insightsA | Escape hatch for raw insight rows at a given aggregation level.
|
| get_campaignB | Fetch one campaign by id, with
|
| get_ad_groupA | Fetch one ad group by id; backfills its parent The API omits |
| get_adA | Fetch one ad by id — use to diagnose non-serving ads. Backfills the parent |
| pause_adsA | Pause many ads at once (reversible). Failures are reported per id, not fatal. |
| archive_adsA | Archive many ads. IRREVERSIBLE and removes them from list views — pass confirm=true. Prefer |
| set_statusA | Apply a single lifecycle transition to a campaign, ad group, or ad. Note: pausing a campaign or ad group does NOT change its children's status (they
stay 'active' but stop serving). |
| update_ad_copyA | Update an ad's creative copy. Pass only the fields you want to change. Re-sends the full creative (which the API requires on ad updates) for you. Title must be 3-50 chars, body <= 100. Aim for a headline near 16 chars and body near 32, and make variants take a distinct angle rather than rephrasing. |
| create_ad_variantA | Create a new ad: upload the creative image, then create the ad in one step. Provide the image as |
| create_campaignA | Create a campaign. Set exactly one budget — |
| create_ad_groupA | Create an ad group under a campaign.
|
| update_campaignB | Update a campaign. Budget and targeting are full-object replaces when provided. |
| update_ad_groupC | Update an ad group — including adding/replacing conversational |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| openai-ads-optimizer/SKILL.md | Use when optimizing an OpenAI Ads (ChatGPT Ads) account through the `openai-ads` MCP server — auditing campaigns/ad groups/ads, finding dead or underperforming ads, detecting near-identical ad copy, auditing ad-group context hints, and (when writes are enabled) pausing/archiving dead ads, rewriting copy, adjusting context hints, and creating new ad variants. Invoke for any performance-marketing task on an OpenAI Ads account. |
| openai-ads-optimizer/_manifest | File listing for openai-ads-optimizer |
Latest Blog Posts
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/shinypebble/openai-ads-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server