ChatGPT Ads

ChatGPT Ads (OpenAI Ads) API for campaign structure and delivery reporting — read-only

17 tools available

Installation

Claude Desktop

{
  "mcpServers": {
    "hopkin-chatgpt-ads": {
      "url": "https://chatgpt.mcp.hopkin.ai",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

CLI

npm install -g @hopkin/cli
hopkin auth set-key hpk_live_...
hopkin chatgpt ping

Tools

ad-account

chatgpt_ads_get_ad_account Get ChatGPT Ads Account

Read-onlyIdempotentOpen-world

Get details of the ChatGPT Ads account: name, status, currency, timezone, website, and review status. Each ChatGPT Ads API key is scoped to exactly one ad account, so this returns the account behind the resolved connection. Use chatgpt_ads_list_ad_accounts to see every account you can reach, and pass connection_id to pick one. Worth calling before reporting: every spend figure is in this account's currency, and every insights date bucket is a day in this account's timezone.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
1 optional parameter
ParameterTypeDescription
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

auth

chatgpt_ads_check_auth_status Check ChatGPT Ads Auth Status

Read-onlyIdempotentOpen-world

Check whether a ChatGPT Ads API key is connected and still accepted by the platform. Do NOT call this proactively — call the tool you actually need. Use this only after another tool fails with a permission or authentication error.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
1 optional parameter
ParameterTypeDescription
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

chatgpt_ads_ping Ping ChatGPT Ads MCP Server

Read-onlyIdempotent

Health check. Returns server status, version, and timestamp. Does not contact the ChatGPT Ads API.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
1 optional parameter
ParameterTypeDescription
messagestringOptional message to echo back
View full documentation →

ad-accounts

chatgpt_ads_list_ad_accounts List ChatGPT Ads Accounts

List the ChatGPT Ads accounts you can reach. Each ChatGPT Ads API key is scoped to exactly one ad account, and the platform has no account-listing endpoint — so this lists your connected accounts, one per API key you have added. Use the returned connection_id to target a specific account in other tools, and chatgpt_ads_get_ad_account for live details (currency, timezone, review status).

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
View full documentation →

connections

chatgpt_ads_list_connections List ChatGPT Ads Connections

List the ChatGPT Ads connections available to you — both those you own and those shared with you by your organization. Shows each connection's display name, id, and whether it is your default.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
View full documentation →

set-default-connection

chatgpt_ads_set_default_connection Set Default ChatGPT Ads Connection

Set which ChatGPT Ads connection other tools use when no connection_id is passed. Call chatgpt_ads_list_connections first to get a valid connection_id — do not guess one.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to mark as the actor's default ChatGPT Ads connection.
reason requiredstringWhy this tool call is needed
View full documentation →

rename-connection

chatgpt_ads_rename_connection Rename ChatGPT Ads Connection

Change a connection's display name. Owner-only.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to mark as the actor's default ChatGPT Ads connection.
reason requiredstringWhy this tool call is needed
View full documentation →

share-connection

chatgpt_ads_share_connection Share ChatGPT Ads Connection

Share an owned connection with your organization so teammates can report on that ad account. Owner-only. Note the ChatGPT Ads API has no reduced-scope keys, so sharing grants full read access to the whole ad account.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to mark as the actor's default ChatGPT Ads connection.
reason requiredstringWhy this tool call is needed
View full documentation →

unshare-connection

chatgpt_ads_unshare_connection Unshare ChatGPT Ads Connection

Stop sharing an owned connection with your organization. Owner-only.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to mark as the actor's default ChatGPT Ads connection.
reason requiredstringWhy this tool call is needed
View full documentation →

revoke-connection

chatgpt_ads_revoke_connection Revoke ChatGPT Ads Connection

DestructiveIdempotent

Remove a stored ChatGPT Ads connection. Owner-only. This deletes Hopkin's stored copy of the API key only. The key stays valid on the ChatGPT Ads platform — the API has no revocation endpoint — so tell the user to delete it in ChatGPT Ads Manager → Settings if they want it to stop working everywhere.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to mark as the actor's default ChatGPT Ads connection.
reason requiredstringWhy this tool call is needed
View full documentation →

feedback

chatgpt_ads_developer_feedback Submit Developer Feedback

IdempotentOpen-world

Submit feedback about missing tools, improvements, bugs, or workflow gaps in the ChatGPT Ads MCP toolset. Not for user-facing issues (auth errors, API errors). Args: feedback_type: new_tool, improvement, bug, workflow_gap title: Short description (5-200 chars) description: What is needed and why (20-2000 chars) current_workaround (optional): How you're working around the gap priority (optional): low, medium (default), high Returns: confirmation that feedback was recorded.

ParameterTypeDescription
feedback_type requiredstringFeedback category: new_tool (request new capability), improvement (enhance existing tool), bug (report issue), workflow_gap (missing workflow)
title requiredstringConcise title summarizing the feedback
description requiredstringWhat is needed and why
reason requiredstringWhy this tool call is needed
3 optional parameters
ParameterTypeDescription
current_workaroundstringCurrent workaround, if any
prioritystringImpact level: low (nice-to-have), medium (improves workflow), high (blocking issue)
interfacestringInterface the feedback originated from: MCP (default) or CLI
View full documentation →

campaigns

chatgpt_ads_list_campaigns List ChatGPT Ads Campaigns

List campaigns in the ChatGPT Ads account, with optional status and name filtering. Budget and bid amounts are integer micros (1,000,000 micros = 1 unit of the account currency — see chatgpt_ads_get_ad_account). Pass campaign_ids to resolve specific campaigns by ID instead of listing. Cache-first: pass refresh: true to force a live fetch.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
7 optional parameters
ParameterTypeDescription
limitintegerMaximum number of results to return (1–100). Default: 20.
cursorstringOpaque pagination cursor from a previous response.
refreshbooleanForce a fresh fetch bypassing the cache.
campaign_idsarrayFetch specific campaigns by ID instead of listing, e.g. ["cmpn_abc123"]. Other filters are ignored when set.
statusarrayFilter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter.
searchstringFilter by name (case-insensitive substring match).
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

ad-groups

chatgpt_ads_list_ad_groups List ChatGPT Ads Ad Groups

List ad groups in a campaign. campaign_id is required — the ChatGPT Ads API has no account-wide ad group listing, so start from chatgpt_ads_list_campaigns and drill down. Pass ad_group_ids to resolve specific ad groups by ID instead of listing. Each returned ad group carries the campaign_id you requested; the API itself does not return it on the ad group object.

ParameterTypeDescription
campaign_id requiredstringCampaign to list ad groups for (e.g. "cmpn_abc123"). Required — the API has no account-wide ad group listing. Get one from chatgpt_ads_list_campaigns.
reason requiredstringWhy this tool call is needed
7 optional parameters
ParameterTypeDescription
limitintegerMaximum number of results to return (1–100). Default: 20.
cursorstringOpaque pagination cursor from a previous response.
refreshbooleanForce a fresh fetch bypassing the cache.
ad_group_idsarrayFetch specific ad groups by ID instead of listing, e.g. ["adgrp_abc123"]. Other filters are ignored when set.
statusarrayFilter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter.
searchstringFilter by name (case-insensitive substring match).
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

ads

chatgpt_ads_list_ads List ChatGPT Ads Ads

List ads in an ad group, including creative and review status. Either ad_group_id or ad_ids is required — the API has no account-wide or campaign-wide ad listing, so drill down via chatgpt_ads_list_ad_groups. An ad only delivers when it is approved AND its ad group and campaign are both active, so check review_status when an ad is not spending — filter on it with review_status: ["rejected"]. Pass ad_ids to resolve specific ads by ID without knowing their ad group. That is the way back from an insights row, which carries ad_id but no other context. Each returned ad carries the ad_group_id you requested; the API does not return it on the ad object.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
9 optional parameters
ParameterTypeDescription
limitintegerMaximum number of results to return (1–100). Default: 20.
cursorstringOpaque pagination cursor from a previous response.
refreshbooleanForce a fresh fetch bypassing the cache.
ad_group_idstringAd group to list ads for (e.g. "adgrp_abc123"). Required unless ad_ids is given — the API has no account-wide or campaign-wide ad listing. Get one from chatgpt_ads_list_ad_groups.
ad_idsarrayFetch specific ads by ID instead of listing, e.g. ["ad_abc123"]. Works without ad_group_id, and other filters are ignored when set.
statusarrayFilter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter.
review_statusarrayFilter by review status: approved, in_review or rejected. Case-insensitive. An ad only delivers once approved. Applied client-side.
searchstringFilter by name (case-insensitive substring match).
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

insights

chatgpt_ads_get_insights Get ChatGPT Ads Insights

Delivery reporting for the ChatGPT Ads account: impressions, clicks, spend, ctr, cpc, cpm. These six are the only metrics the API exposes. This is the performance report for ChatGPT Ads — there is no separate report tool on this server. Scope vs rows: \

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
15 optional parameters
ParameterTypeDescription
levelstringScope of the report. "ad_account" covers the whole account; the others need entity_id.
entity_idstringCampaign, ad group, or ad ID to scope to. Required unless level is "ad_account".
aggregation_levelstringWhat each row represents. Must be at or below level. Defaults to level.
time_granularitystringTime bucket per row. "none" returns one row per entity for the whole window. Segmented requests do not support "hourly".
date_sincestringStart date (YYYY-MM-DD) in the ad account timezone. Defaults to 30 days before date_until.
date_untilstringEnd date (YYYY-MM-DD) in the ad account timezone. Defaults to today.
fieldsarrayCanonical dotted field names, e.g. ["campaign.name","campaign.spend"]. Defaults to ids, name, and all six metrics for the aggregation level.
filtersarrayFilters, ANDed together. E.g. [{"field":"campaign.id","operator":"IN","value":["cmpn_1"]}].
sortarraySort order, applied before pagination. E.g. [{"field":"campaign.spend","direction":"desc"}].
segmentstringExtra breakdown dimension. Only available on enabled ad accounts; segmented requests cannot use hourly granularity.
include_zero_impressionsbooleanInclude entities with no impressions in the window.
include_conversionsbooleanAlso fetch attributed conversion totals per entity. Whole-window totals only, not per time bucket. Account-gated: if unavailable the delivery data is still returned.
limitintegerMaximum rows to return (1–2000). Default: 100.
cursorstringOpaque pagination cursor from a previous response.
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

conversion-event-settings

chatgpt_ads_list_conversion_event_settings List ChatGPT Ads Conversion Event Settings

List the conversion events configured for the account — what each one counts, its attribution window, and which campaigns use it. Useful for interpreting the conversion totals returned by chatgpt_ads_get_insights. Returns a "not enabled" error on accounts without conversion tracking.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
3 optional parameters
ParameterTypeDescription
limitintegerMaximum number of results to return (1–100). Default: 20.
cursorstringOpaque pagination cursor from a previous response.
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

custom-audiences

chatgpt_ads_list_custom_audiences List ChatGPT Ads Custom Audiences

List the custom audiences on the account — name, status, and how many identifiers matched. Its main use is resolving identity: chatgpt_ads_list_campaigns returns targeting.custom_audiences.ids as bare IDs, so pass those to custom_audience_ids here to find out who a campaign actually targets. Audience sizes come back as privacy-bucketed ranges (e.g. "5000-10000"), never exact counts — report them as ranges.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
4 optional parameters
ParameterTypeDescription
limitintegerMaximum number of results to return (1–100). Default: 20.
cursorstringOpaque pagination cursor from a previous response.
custom_audience_idsarrayResolve specific audiences by ID instead of listing. Use this to turn the opaque IDs in a campaign's targeting.custom_audiences into names.
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →