OpenAI Ads MCP Server (ChatGPT Ads)
An MCP (Model Context Protocol) server that
exposes the ChatGPT Ads API
(https://api.ads.openai.com/v1) as tools an LLM host can call. Runs as a plain
Python process — no cloud platform required.
What it exposes
Tools map to the Advertiser API documented under Ads → API Reference:
| Area | Tools |
|---|---|
| Ad account | get_ad_account |
| Campaigns | list_campaigns, get_campaign |
| Ad groups | list_ad_groups, get_ad_group |
| Ads | list_ads, get_ad |
| Insights | get_ad_account_insights, get_campaign_insights, get_ad_group_insights, get_ad_insights |
Only read/list/report tools are registered (GET-equivalent Ads calls).
Mutating actions (create/update/activate/pause/archive/upload) are omitted for now.
All exposed tools set read-only hints (readOnlyHint) for MCP clients.
Architecture
python -m openai_ads_mcp stdio (Cursor, Claude Desktop, etc.)
python -m openai_ads_mcp --transport http streamable HTTP (remote clients)
└─ openai_ads_mcp/server.py registers every tool
├─ coordinator.py FastMCP singleton
├─ client.py httpx wrapper + bearer auth
└─ tools/ resource modules
- Single registration point.
openai_ads_mcp/server.pyimports all tool modules. - Two transports. Stdio for local IDE hosts; HTTP for remote MCP clients (e.g. via ngrok).
Authentication
- This server → Ads API. Set
OPENAI_ADS_API_KEY(headerAuthorization: Bearer …per the authentication docs). - Caller → this server. Not enforced by default. Put auth (API gateway, reverse proxy, VPN, etc.) in front of HTTP mode if you expose it publicly.
Secrets: keep Ads keys out of git — copy .env.example to .env and add your key there.
Never commit real keys.
Quick start
Prerequisites
- Python 3.11+
- An OpenAI Ads API key
Install
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -U pip
pip install -r requirements.txt
pip install -e .
Copy the example env file and add your key:
copy .env.example .env
# Edit .env and set OPENAI_ADS_API_KEY
Run (stdio — for Cursor and other IDE MCP hosts)
The process blocks with little or no visible output: MCP uses stdin/stdout for JSON-RPC. You should see a one-line notice on stderr; do not run the server interactively in a normal terminal expecting a prompt.
python -m openai_ads_mcp
Equivalent commands:
openai-ads-mcp
python -m openai_ads_mcp.server
Cursor MCP config — use your venv's python.exe as command, project root as cwd:
{
"mcpServers": {
"openai-ads": {
"command": "C:\\path\\to\\chatgptads-mcp\\.venv\\Scripts\\python.exe",
"args": ["-m", "openai_ads_mcp"],
"cwd": "C:\\path\\to\\chatgptads-mcp"
}
}
}
Or set OPENAI_ADS_API_KEY in the env block instead of using .env.
Run (HTTP — for remote MCP clients)
python -m openai_ads_mcp --transport http --host 127.0.0.1 --port 8000
Point remote MCP clients at http://127.0.0.1:8000/mcp. To expose publicly, tunnel
with ngrok or similar and add auth at the gateway layer.
Environment variables
| Variable | Required | Description |
|---|---|---|
OPENAI_ADS_API_KEY |
Yes | Ads API key |
Project layout
requirements.txt
pyproject.toml
.env.example
openai_ads_mcp/
__main__.py
server.py
coordinator.py
client.py
tools/
ad_account.py
campaigns.py
ad_groups.py
ads.py
insights.py
See also capabilities.md for a full tool reference.
No comments yet
Be the first to share your take.