Skip to main content
Glama

mcp-openai-ads

CI npm License: MIT

An open-source Model Context Protocol (MCP) server for the OpenAI Ads (ads in ChatGPT) Advertiser API.

It lets an AI assistant such as Claude Desktop, Claude Code, Cursor or VS Code read your ChatGPT Ads account, report on performance and, if you allow it, manage campaigns, ad groups and ads.

Community project by PPC Blog Pro. Not affiliated with or endorsed by OpenAI.

Features

  • Read-only by default. Write tools are only registered when you set OPENAI_ADS_ALLOW_WRITES=true.

  • Dry run first. Every write returns a preview until it is called again with confirm: true, and updates report a before/after diff.

  • New entities start paused, so nothing spends money until you activate it.

  • Money in plain currency units. You say daily_budget: 50 and the server converts it to the API's micros.

  • Compact markdown tables, which keep token use low.

  • Retries with backoff on 429 and 5xx responses, respecting Retry-After. Create calls send an Idempotency-Key.

Related MCP server: OpenAI Ads & Conversion Intelligence MCP Server

Tools

Tool

What it does

account_summary

Account status, campaigns, budgets, serving issues and performance for the last N days

get_insights

Performance report by account, campaign, ad group or ad. Supports date ranges, daily/hourly/monthly granularity, segments (country, device, platform, product), filters and sort

get_ad_account

Account details, currency, timezone and brand review status

get_spend_limits

Daily limit and spend-limit windows, with amounts spent and remaining

list_campaigns / get_campaign

Campaigns with budgets, targeting and serving issues

list_ad_groups / get_ad_group

Bid strategy, max bid and context hints

list_ads / get_ad / preview_ad

Creative, review status and a rendered preview

list_product_feeds

Product feeds and their product and campaign counts

list_conversion_setup

Pixels and conversion event settings

list_recent_conversion_events

Recent raw events, to check that a pixel is firing

geo_lookup

Location ids for targeting

Write tools (require OPENAI_ADS_ALLOW_WRITES=true):

Tool

What it does

set_status

Activate, pause or archive a campaign, ad group or ad

create_campaign / update_campaign

Create a campaign, or change its budget, schedule or targeting

create_ad_group / update_ad_group

Create an ad group, or change its context hints or bidding

create_ad / update_ad

Create an ad, or change its creative (a changed creative goes back to review)

upload_image

Upload a creative image from a local file or a URL

Prompts: weekly_performance_review, find_underperformers, diagnose_not_serving.

Setup

1. Get an API key

  1. Open OpenAI Ads Manager, then go to Settings.

  2. Create an Advertiser API key. It is tied to one ad account.

See OpenAI's Advertiser API overview for details.

2. Add the server to your MCP client

Requires Node.js 20 or later.

Claude Desktop: edit claude_desktop_config.json:

{
  "mcpServers": {
    "openai-ads": {
      "command": "npx",
      "args": ["-y", "mcp-openai-ads"],
      "env": {
        "OPENAI_ADS_API_KEY": "your-advertiser-api-key"
      }
    }
  }
}

On Windows, if npx isn't found, use "command": "cmd" and "args": ["/c", "npx", "-y", "mcp-openai-ads"].

Claude Code:

claude mcp add openai-ads -e OPENAI_ADS_API_KEY=your-key -- npx -y mcp-openai-ads

Cursor: use the same JSON as Claude Desktop, in ~/.cursor/mcp.json.

VS Code: add this to .vscode/mcp.json:

{
  "servers": {
    "openai-ads": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "mcp-openai-ads"],
      "env": { "OPENAI_ADS_API_KEY": "${input:openaiAdsKey}" }
    }
  },
  "inputs": [{ "id": "openaiAdsKey", "type": "promptString", "description": "OpenAI Ads API key", "password": true }]
}

Configuration

Variable

Default

Description

OPENAI_ADS_API_KEY

(required)

Advertiser API key

OPENAI_ADS_ALLOW_WRITES

false

Set to true to enable the write tools

OPENAI_ADS_MAX_ROWS

200

Maximum report rows returned per call

OPENAI_ADS_BASE_URL

https://api.ads.openai.com/v1

Override the API base URL

Example prompts

  • "Give me a summary of my ChatGPT Ads account for the last 14 days."

  • "Show daily clicks and spend for campaign Fall Sale this month, split by device."

  • "Which ads have the lowest CTR? Suggest better copy."

  • "Why isn't my new campaign serving?"

  • (with writes enabled) "Raise the daily budget of Fall Sale to 80 and show me the change before applying it."

Safety notes

  • The API key has full access to its ad account. Keep it in your MCP client's env block, never in a repo.

  • The server logs only to stderr and never logs the key.

  • Leave writes disabled unless you need them. When they are enabled, your AI client should still ask before calling a tool with confirm: true.

Releasing (maintainers)

  1. Bump version in both package.json and server.json (a test enforces that they match), and update CHANGELOG.md.

  2. Commit, then git tag vX.Y.Z && git push --tags.

  3. The Release workflow publishes to npm and to the MCP Registry as io.github.dienhokhanh/mcp-openai-ads.

Development

npm install
npm run build
npm test
npm run inspect   # opens the MCP Inspector against dist/index.js

To run from source in a client, point it at node /path/to/repo/dist/index.js.

The API client is in src/client.ts, and tools live in src/tools/ as read.ts, insights.ts and write.ts. The OpenAI Ads API is new, so if an endpoint changes, please open an issue or PR.

Author

Built and maintained by PPC Blog Pro, which publishes PPC and paid-ads guides, tips and tools.

License

MIT

Available Tools

15 tools
account_summaryAccount summaryA
Read-only

One-shot snapshot: account status, active campaigns with budgets and serving issues, and per-campaign performance for the last N days (default 7).

ParametersJSON Schema
NameRequiredDescriptionDefault
last_n_daysNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds what data is aggregated (status, budgets, serving issues, performance) but says nothing about cost, latency, rate limits, or whether campaign lists are paginated/capped — relevant for a broad aggregate call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence leads with the key framing ('One-shot snapshot') and then enumerates the returned content with zero filler. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the response contents (account status, campaigns with budgets and serving issues, per-campaign performance), which covers most of what an agent needs. Only the parameter bounds and limits on the aggregate are left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the single integer parameter. It does add the semantic meaning ('last N days') and the default (7), which the schema lacks, but omits the documented 1–90 bounds, leaving the parameter only partially explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific composite operation: an account snapshot bundling status, active campaigns with budgets/serving issues, and per-campaign performance. The 'one-shot snapshot' framing distinguishes it from granular siblings like list_campaigns and get_campaign, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'One-shot snapshot' implies the tool should be used when a broad overview is wanted instead of many individual calls, which is useful implied guidance. However, it never states when to prefer this over alternatives such as get_insights or list_campaigns, nor any exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

geo_lookupGeo lookupB
Read-only

Search locations (cities, regions, countries) to get ids for campaign location targeting.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the useful fact that the output is ids consumed by campaign targeting, but says nothing about result relevance/ranking, partial matching, or how the limit interacts with a broad query — a notable gap for an open-world search.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the searchable entity types and the payoff (ids) come first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It covers the input intent and the kind of output (ids), which is reasonable for a small two-parameter tool with no output schema. It falls short on the two parameters and on result-shaping behavior, leaving an agent unable to call it optimally.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across both parameters, so the description must carry the load and it does not. 'query' (minLength 1) is never characterized — free-text city name? country code? — and 'limit' (1-50) is not mentioned at all, so an agent cannot infer the cap on results or default behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search) and resource (locations) and enumerates the scope: cities, regions, countries. It also names the downstream purpose (ids for campaign location targeting). It does not need to differentiate from a sibling, since none of the listed siblings does geo lookup, but it also does no explicit routing work.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the phrase 'to get ids for campaign location targeting', which tells the agent why it would call this. There is no explicit when-not guidance, no mention of alternatives, and no note that this is a prerequisite step before setting campaign targeting.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_adGet adB
Read-only

Get full details of one ad, including creative, review and appeal status.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNoAlso return the full API object as JSON (targeting, bidding config, review details).
ad_idYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful scope about what is returned (creative plus review and appeal status), but says nothing about the 'raw' expansion side effect or response size when raw is set, which is the one behavior an agent would want flagged.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence, front-loaded with the verb and the returned content. No filler, though it is short enough that a little more clarifying content might have been worthwhile.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only lookup with no output schema, the description is minimally adequate: it names what detail is returned and the annotations cover safety. It is incomplete regarding ad_id semantics and the behavior of the raw flag, which the description never references despite it being a declared parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%: 'raw' is documented in the schema but 'ad_id' carries no description anywhere. The description does not state the ad_id format or identifier source, nor clarify when to set raw, so it leaves half the parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get full details of one ad') and enumerates the content returned (creative, review and appeal status), which distinguishes it from list_ads. It does not, however, contrast itself with adjacent single-entity readers like get_campaign or get_ad_group, so sibling differentiation relies mostly on the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use guidance. There is no mention of when to prefer this over list_ads (to fetch one known ad) or preview_ad (to render an ad), nor any prerequisite such as needing a known ad_id first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ad_accountGet ad accountA
Read-only

Get the ad account tied to the API key: name, URL, status, currency, timezone and brand/integrity review status. Money values in other tools are in this account's currency.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description still adds meaningful context beyond that: the lookup is scoped to whatever account the API key is bound to, and the returned currency field governs the units used by money values in other tools — a behavioral/interpretation detail an agent would not derive from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and resource, then the field list, then the cross-tool currency caveat. No filler, no restating of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description carries the return-shape burden and does so by enumerating the returned fields and the currency semantics. It stops short of covering edge cases such as error behavior when the API key maps to multiple or no accounts, which keeps it from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so by rule the baseline is 4. There is nothing parameter-wise for the description to clarify, and it correctly avoids inventing inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (get) plus precise resource (the ad account tied to the API key), followed by the exact fields returned: name, URL, status, currency, timezone, brand/integrity review status. This is clearly distinguishable from sibling getters like get_ad, get_campaign, or get_ad_group, which target sub-resources rather than the account itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (fetch account-level metadata) and adds cross-tool context with the note that money values in other tools are expressed in this account's currency, but it never states when to reach for this tool versus account_summary or get_spend_limits, and offers no exclusions or prerequisites beyond the implicit API-key scoping.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ad_groupGet ad groupC
Read-only

Get full details of one ad group.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNoAlso return the full API object as JSON (targeting, bidding config, review details).
ad_group_idYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond that - no mention of what 'full details' includes, whether the raw JSON payload is large, or any rate/auth context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with zero filler. It is efficient, though arguably under-specified rather than genuinely concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read with no output schema, a minimal description is defensible, but 'full details' is never unpacked - the agent cannot tell what fields are returned or how the raw flag changes the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: the 'raw' parameter is documented in the schema but ad_group_id is not. The description contributes no parameter information at all, so the undocumented required identifier is left to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (get) and resource (ad group) and the scope 'one' implicitly separates it from the sibling list_ad_groups. It stops short of explicitly naming that sibling or stating what distinguishes it from get_ad.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus list_ad_groups (for enumeration) or get_ad (for the parent creative). No prerequisites or conditions are given; the agent must infer usage entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_campaignGet campaignB
Read-only

Get full details of one campaign, including targeting and serving issues.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNoAlso return the full API object as JSON (targeting, bidding config, review details).
campaign_idYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-state characteristics are covered. The description adds what content is surfaced ('targeting and serving issues'), but says nothing about how the raw flag changes the response or what limits apply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence with the resource and returned payload front-loaded. Nothing is wasted, though it is arguably under-specified rather than optimally concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with no output schema, the description gives a minimal sense of the return payload. It is adequate for invocation but leaves the campaign_id-only requirement and the purpose of the raw flag entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: the raw flag is self-documented in the schema, while campaign_id has no description anywhere but is an obvious identifier. The description adds no parameter-level meaning, so this sits at the baseline for partly-covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get full details of one campaign') and hints at the payload with 'targeting and serving issues.' The singular scope implicitly separates it from list_campaigns, though it never names that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no alternatives named. An agent must infer that this is the follow-up call after list_campaigns yields a campaign_id, and nothing tells it when get_insights or account_summary would be a better fit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_insightsGet performance insightsA
Read-only

Performance report (impressions, clicks, spend, CTR, CPC, CPM) for the ad account, broken down by campaign, ad group or ad. Date range: pass since/until (YYYY-MM-DD, inclusive, account timezone; until defaults to yesterday) or last_n_days (default 7, ending yesterday). Scope to one entity with campaign_id / ad_group_id / ad_id. Optional one-dimension segment: product, country, device, platform. Spend values are in account currency units (not micros). Today's attribution metrics are preliminary. Advanced: pass canonical fields like "campaign.roas", "ad.cpa", "country.name", filters and sort.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNo
ad_idNo
afterNo
levelNoAggregation level (row granularity).campaign
limitNo
sinceNo
untilNo
fieldsNoCanonical field names. Defaults to id, name and core metrics for the level.
filtersNo
segmentNo
ad_group_idNo
campaign_idNo
last_n_daysNo
time_granularityNoDefault none (one row per entity).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint, but the description adds substantial behavioral context the annotations cannot: spend is in account currency units (not micros), today's attribution metrics are preliminary, dates are inclusive and in account timezone, and until defaults to yesterday. These are exactly the kinds of caveats an agent needs before trusting the numbers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the report's purpose and metrics, then flows through date range, scope, segment, currency/caveats, and advanced options. Dense but every clause carries distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter, no-output-schema, open-world reporting tool this is close to complete: it covers dates, scoping, segmentation, currency semantics, and advanced fields/filters/sort. It omits pagination (limit) and time_granularity guidance, which an agent would need for large result sets.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 21% across 14 parameters, so the description must compensate and largely does: it explains since/until format and inclusivity, last_n_days default of 7, the three id-scoping params, the segment enum values, and that 'fields' accepts canonical names like 'campaign.roas'/'ad.cpa'. Gaps remain for limit, after, and time_granularity, which are never mentioned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Performance report') and enumerates the exact metrics returned (impressions, clicks, spend, CTR, CPC, CPM) plus the supported aggregation levels. This clearly separates it from sibling tools like account_summary, get_campaign, or list_ads, which do not return a multi-metric report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives rich operational context: two alternative date-range mechanisms with defaults, entity scoping via campaign_id/ad_group_id/ad_id, optional single-dimension segmentation, and an 'Advanced' path for canonical fields, filters and sort. It does not explicitly name a sibling tool or state when-not-to-use, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_spend_limitsGet spend limitsA
Read-only

Get the ad account's daily spend limit and dated spend-limit windows, with amounts spent and remaining.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description contributes by naming the return contents (daily limit, dated windows, spent and remaining amounts), but adds nothing about auth requirements, caching, or rate limits. Note the description implies an implicit account context despite there being no account parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the resource stated first and the payload contents second. No filler, no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing returns and does so adequately by listing limits, dated windows, and spent/remaining amounts. The one gap is how 'the ad account' is determined given there is no account parameter, which an agent might need to know.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. There are no arguments whose semantics need explaining, and the description correctly doesn't invent any. The only nuance - that the ad account is resolved from ambient/auth context - is left implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('the ad account's daily spend limit and dated spend-limit windows') and enumerates the returned fields (amounts spent and remaining). This clearly separates it from generic siblings like get_ad_account or account_summary, though it doesn't explicitly name those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the subject matter - an agent should call this when it needs spend limits - but there is no explicit when-to-use, when-not-to-use, or alternative routing. Given the tool is a narrow 0-param read, this is acceptable but not instructive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ad_groupsList ad groupsB
Read-only

List ad groups, optionally for one campaign, with bid strategy, max bid and context hints.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
afterNoCursor: return results after this id (use last_id from the previous page).
limitNoPage size (default 20, max 500).
orderNo
campaign_idNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read profile is covered. The description adds what fields surface (bid strategy, max bid, context hints) but says nothing about pagination behavior despite the cursor/limit params.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with no filler. It is efficient, though the trailing "context hints" phrasing is vague for the space it consumes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does carry the return-field burden and names three returned attributes, which helps. However, for a 5-param paginated list with 40% schema coverage, the missing filter and ordering semantics leave it only minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 40% across 5 params: name, order, and campaign_id are undocumented in the schema, and the description only alludes to the campaign filter ("optionally for one campaign"). It does not compensate for the coverage gap, nor explain allowed name matching or order semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("List ad groups") with scope ("optionally for one campaign") and the fields returned. It is distinguishable from singular get_ad_group, though it never names the sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"optionally for one campaign" implies the campaign_id filter is the scoping switch, but there is no explicit when-to-use guidance, no exclusions, and no routing to alternatives like list_campaigns or get_ad_group. Usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_adsList adsC
Read-only

List ads, optionally for one ad group, with creative text, review status and serving issues.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
afterNoCursor: return results after this id (use last_id from the previous page).
limitNoPage size (default 20, max 500).
orderNo
ad_group_idNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds useful output context (review status, serving issues), but says nothing about pagination behavior despite having cursor/limit parameters, and nothing about result volume or ordering defaults.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the resource, the optional filter, and the returned fields all come in one pass. Slightly dense but efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter list tool with 40% schema coverage and no output schema, the description is thin: three parameters are undocumented anywhere, and pagination/ordering behavior is unstated. The returned-field mention is the only substantive addition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40% (after and limit documented; name, order, ad_group_id undocumented). The description partially compensates by implying the ad_group_id filter, but leaves name, order, and pagination semantics entirely unaddressed. It adds little beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List ads') plus the optional scope ('for one ad group') and the fields returned (creative text, review status, serving issues). It implicitly distinguishes itself from the singular sibling get_ad, though it never names it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says the ad-group filter is optional but gives no guidance on when to use list_ads versus get_ad, preview_ad, or list_ad_groups. No prerequisites, no exclusions, no routing to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_campaignsList campaignsB
Read-only

List campaigns with status, budget (account currency), targeting countries and serving issues.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter by campaign name.
afterNoCursor: return results after this id (use last_id from the previous page).
limitNoPage size (default 20, max 500).
orderNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context that budget is expressed in account currency and that serving issues are surfaced, but says nothing about pagination behavior, result volume, or auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that conveys the resource and the payload fields with no filler. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing returns and does so by naming the key fields. It is slightly incomplete in not explaining pagination or the account-currency scoping implication, but it is adequate for a read-only list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so the schema already documents name, after, and limit; only 'order' lacks a description. The description contributes no parameter-level detail (no mention of filtering by name, cursoring, or ordering), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource ('List campaigns') and enumerates the returned fields (status, budget, targeting countries, serving issues), which is more than a restatement of the name. It implicitly distinguishes itself from the singular sibling get_campaign, but never names or contrasts with it explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no exclusions, and no reference to alternatives such as get_campaign for a single record. The agent must infer that this is the bulk/listing path from the verb alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_conversion_setupList conversion setupB
Read-only

List conversion pixels/sources and conversion event settings (event type, attribution window, linked campaigns).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful detail about what configuration fields are returned (event type, attribution window, linked campaigns), but says nothing about pagination, result size, or scoping.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with the resource front-loaded and the returned fields in parentheses. No filler, though it is terse enough that it leaves room for missing usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description carries the burden of telling the agent what comes back, and it does so by naming the settings fields. It is adequate for a simple read-only listing, though a note on scope or pagination would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; the description correctly implies a full unfiltered listing with no parameter-related gaps to fill.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('conversion pixels/sources and conversion event settings') and enumerates the settings covered. It is distinguishable from the nearby sibling 'list_recent_conversion_events', though it does not explicitly call out the difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus 'list_recent_conversion_events' or the other list_* siblings. The usage context is only implied by the noun 'conversion setup'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_product_feedsList product feedsB
Read-only

List product feeds with countries, currencies, product and campaign counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoCursor: return results after this id (use last_id from the previous page).
limitNoPage size (default 20, max 500).

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds that the listing includes aggregate counts, which is behavioral context, but omits pagination behavior and any rate or scope limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with zero waste. It is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with no output schema, the description covers what is returned but not pagination or result limits. It is adequate but leaves an agent guessing about cursor behavior and the shape of the counts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters fully. The description adds no additional parameter meaning, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List product feeds') and enumerates included fields (countries, currencies, product/campaign counts). It is clear, but it does not distinguish itself from siblings like list_campaigns or list_ads beyond the resource name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives or in what context it is appropriate. The description only states what it returns, not when to choose it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recent_conversion_eventsList recent conversion eventsA
Read-only

List recent raw conversion events received for a pixel/source. Useful to verify a pixel or Conversions API integration is firing.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
pixel_idYesThe pixel/source id (pid).

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the useful "raw" qualifier (raw vs. processed events) but says nothing about ordering, time window, pagination, or rate limits for what is meant by "recent".

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, purpose front-loaded, zero filler. Every clause contributes information an agent can act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing tool with no output schema and annotations covering safety, the definition is nearly sufficient. Minor gaps remain around default limit, time window for "recent", and ordering of returned events.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: pixel_id is documented in the schema itself, while limit (1-100) has no description anywhere. The description adds no meaning to either parameter and does not explain the default limit or what "recent" covers, leaving the limit parameter's semantics unspecified across all sources.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) plus resource (recent raw conversion events) scoped to a pixel/source, which is concrete enough to distinguish it from siblings like list_conversion_setup. It does not, however, explicitly name which sibling to prefer when the agent wants setup/config rather than raw events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Useful to verify a pixel or Conversions API integration is firing" gives an explicit diagnostic use case, so an agent knows when to reach for it. It stops short of naming alternatives (e.g., list_conversion_setup) or any exclusion condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_adPreview adB
Read-only

Render a preview of how an ad will look in ChatGPT. Does not change the ad.

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The sentence 'Does not change the ad' corroborates rather than contradicts that, and the ChatGPT rendering target adds a little context, but there is no disclosure of latency, whether the preview is persisted, or what the render contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no filler; the core purpose leads and the non-mutation caveat follows immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, no-output-schema tool with annotations present, the description covers purpose and non-mutation adequately, but leaves the sole parameter undefined and gives no hint of what the preview returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one parameter (ad_id) with 0% schema description coverage, and the description says nothing about it — not its format, not where to obtain it, not whether it refers to an ad in the current account. With the schema silent, the description fails to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (render/preview) and resource (ad) plus the rendering target (ChatGPT), which cleanly separates it from data-fetching siblings like get_ad or list_ads. An agent can identify the tool's job without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says what the tool does but never says when to reach for it over get_ad or list_ads, nor does it name any alternative or precondition (e.g., call before publishing). Usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 15 tool updatesv0.1.0
    • First observedaccount_summary
    • First observedgeo_lookup
    • First observedget_ad
    • First observedget_ad_account
    • First observedget_ad_group
    • First observedget_campaign
    • First observedget_insights
    • First observedget_spend_limits
    • First observedlist_ad_groups
    • First observedlist_ads
    • First observedlist_campaigns
    • First observedlist_conversion_setup
    • First observedlist_product_feeds
    • First observedlist_recent_conversion_events
    • First observedpreview_ad

TDQS

B3.4/5.0

Scored across 15 tools

Disambiguation4/5

The list_/get_ pairs map cleanly to distinct resources (campaigns, ad groups, ads, feeds), and geo_lookup/preview_ad are clearly unique. The main overlap is account_summary, which bundles account status, campaigns, and performance and thus partially duplicates get_ad_account, list_campaigns, and get_insights. One or two tools could be confused, but overall boundaries are clear.

Naming Consistency4/5

Strong, predictable get_/list_ verb_noun pattern dominates (get_ad, list_campaigns, get_ad_group, list_conversion_setup). Deviations are minor: geo_lookup reverses to noun_verb and account_summary uses a noun_noun snapshot name, both still readable and recognizable.

Tool Count5/5

15 tools is well within the sensible range and each one earns its place, covering account, campaigns, ad groups, ads, feeds, conversions, targeting, and reporting. No redundant or trivial tools inflate the set.

Completeness3/5

The surface is heavily read-oriented: rich list/get/preview and diagnostic coverage, but no create, update, pause, or budget-mutation operations for campaigns, ad groups, or ads, leaving write-side lifecycle workflows as dead ends. A user can inspect everything but cannot manage or change anything.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI assistants to manage Google Ads accounts by providing tools for querying account data and performing write operations such as updating campaign budgets, statuses, and bidding strategies.
    2
    Apache 2.0
  • A
    license
    B
    quality
    C
    maintenance
    Enables AI agents to manage OpenAI Ads campaigns, ad groups, creatives, custom audiences, conversion tracking via web pixel and CAPI, and run tracking audits through the OpenAI Ads Advertiser API.
    43
    47 npm
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Connects AI assistants to Google Ads, Meta Ads, ChatGPT Ads, TikTok Ads and LinkedIn Ads so users can query live campaign performance, budgets and audiences in the account's own currency and prepare changes as proposals that only take effect after explicit approval. Reads run immediately, while every write is staged as an approvable proposal with before/after values, and newly created campaigns, ad sets and ads start paused.
    1
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to access, analyze, and manage LinkedIn advertising data, including campaigns, creatives, audiences, and conversions, with full create, update, and delete capabilities plus analytics via natural language.
    6 npm
    40
    MIT