google-ads-mcp-write
Provides tools for making changes to a Google Ads account, including pausing/resuming campaigns, ad groups, and keywords; changing budgets; adding negative keywords; creating search campaigns, ad groups, keywords, and responsive search ads; switching campaigns to manual CPC; and pausing auto-apply recommendations, with validation and audit logging.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@google-ads-mcp-writePause the Brand campaign"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
google-ads-mcp-write
An MCP server that lets an AI assistant make changes to a Google Ads account: pause and resume campaigns, ad groups and keywords, add negative keywords, change budgets, create search campaigns and ads, switch bidding back to manual CPC and turn off auto-applied recommendations.
It is the write-side companion to Google's official, read-only googleads/google-ads-mcp. Use the official server to read (reports, search terms, change history) and this one to act.
Every change runs in two steps: the tool first asks Google to validate the change without applying it, and only executes when called again with the confirmation token it returned. Each plan and execution is written to an audit log.
Tools
Tool | What it does |
| Shows the active configuration: allowed accounts, budget limits, kill switch, audit log path |
| Lists campaigns with id, status and daily budget (read-only, to build plans) |
| Pauses or resumes a campaign |
| Pauses or resumes an ad group |
| Pauses or resumes several keywords of an ad group at once |
| Changes a campaign's daily budget |
| Switches campaigns to manual CPC, so ad group bids apply again |
| Pauses every active auto-apply recommendation subscription |
| Creates a Search campaign (always paused), with budget, location and language targeting and a first ad group |
| Creates an ad group in an existing campaign |
| Adds keywords to an ad group (EXACT, PHRASE or BROAD) |
| Adds campaign-level negative keywords |
| Creates a responsive search ad (3–15 headlines, 2–4 descriptions) |
Amounts (budgets, CPC bids) are in the account's currency, as plain numbers: 30 means 30.00.
The two-step flow
you: "pause the Brand campaign"
assistant → set_campaign_status(customer_id, campaign_id, "PAUSED")
server → asks Google to validate the change (validateOnly), stores the plan
← {"status": "awaiting_confirmation", "summary": "campaign 123 -> PAUSED",
"confirm_token": "9f41…", "valid_for_seconds": 3600}
assistant → set_campaign_status(…, confirm_token="9f41…")
server → applies the change and appends it to the audit log
← {"status": "executed", …}Pair this with your client's tool-approval prompts (see Approving each change) so that you approve each call yourself.
Related MCP server: Google Ads MCP
Guardrails
Account allowlist. The server only touches the accounts listed in
GOOGLE_ADS_MCP_WRITE_CUSTOMERS. With the variable empty, every write is refused.Budget limits. A daily budget can't go above
GOOGLE_ADS_MCP_MAX_BUDGET_MICROS, and a single change can't raise a budget by more thanGOOGLE_ADS_MCP_MAX_BUDGET_INCREASE_PCT.No deletions. There is no REMOVE operation: things are paused, never deleted. New campaigns are created paused.
Kill switch.
GOOGLE_ADS_MCP_WRITE_ENABLED=0blocks every write without uninstalling anything.Audit log. Every plan and every execution, with the exact operations sent and Google's response, goes to a JSON Lines file.
Plans expire after one hour and each confirmation token works once.
Requirements
A Google Ads developer token with Basic or Standard access (Google Ads UI → Tools → API Center). A token with only Explorer/test access works on test accounts.
A Google Cloud project with the Google Ads API enabled.
Google credentials with the
https://www.googleapis.com/auth/adwordsscope, found through Application Default Credentials.Python 3.10 or newer.
Getting credentials
The simplest route is your own Google account through gcloud, with an OAuth client of type Desktop app created in your Cloud project (APIs & Services → Credentials). Download its JSON and run:
gcloud auth application-default login \
--client-id-file=/path/to/client_secret.json \
--scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform
gcloud auth application-default set-quota-project YOUR_CLOUD_PROJECTThe official read-only server uses the same credentials, so one login serves both.
In Google Workspace organizations with session-control policies, these credentials may expire every day or so (
invalid_rapt/ "Reauthentication is needed"). Run the same command again when that happens.
Install
pipx install git+https://github.com/andersonbuzzi/google-ads-mcp-write.gitor run it without installing:
uvx --from git+https://github.com/andersonbuzzi/google-ads-mcp-write.git google-ads-mcp-writeConfiguration
All configuration comes from environment variables, set in your MCP client's server entry.
Variable | Required | Default | Meaning |
| yes | — | Your developer token |
| yes | — | Comma-separated customer ids the server may change, e.g. |
| when using a manager account | — | Manager (MCC) id to act through |
| no |
| Highest daily budget allowed, in micros (200000000 = 200.00) |
| no |
| Largest increase allowed in one budget change, in percent |
| no | — | Default location ids for new campaigns, e.g. |
| no | — | Default language ids for new campaigns, e.g. |
| no |
| Where the audit log is written |
| no |
|
|
| no |
| Google Ads REST API version |
| sometimes | — | Quota project, if your credentials don't carry one |
Location and language ids come from Google's geo targets and language codes tables.
Connecting an MCP client
Most MCP clients accept a server entry in this format:
{
"mcpServers": {
"google-ads-write": {
"command": "google-ads-mcp-write",
"env": {
"GOOGLE_ADS_DEVELOPER_TOKEN": "your-token",
"GOOGLE_ADS_MCP_WRITE_CUSTOMERS": "1234567890",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "9876543210"
}
}
}
}Check your client's documentation for where this file lives.
Approving each change
If your client can ask before running a tool, turn that on for every tool that changes the account, which is all of them except write_status and list_campaigns:
set_campaign_status, set_ad_group_status, set_keyword_status, set_campaign_budget, set_campaign_manual_cpc, pause_auto_apply_recommendations, create_search_campaign, create_ad_group, create_keyword, add_negative_keyword, create_responsive_search_ad.
Together with the two-step flow, nothing changes in the account without you seeing the plan and saying yes.
Using it with the official read-only server
Install googleads/google-ads-mcp next to this one. A typical session: the assistant reads search terms through the official server, proposes negatives, and adds them through add_negative_keyword after you approve.
Good to know
Auto-apply recommendations can undo your settings. Google may switch bidding strategies or broaden keyword match types on its own when auto-apply is on.
pause_auto_apply_recommendationsturns off every subscription the API can address. Subscription types newer than the API version come back asUNKNOWNand can only be turned off in the UI (Recommendations → Auto-apply); the tool tells you how many there are.Campaign creation is a chain (budget → campaign → targeting → ad group). Google can only dry-run the first step, because the others reference resources that don't exist yet. If a later step fails, pass the created
budget_idto retry without leaving an orphan budget.Plans live in memory. Restarting the server drops pending plans; just ask again.
Development
git clone https://github.com/andersonbuzzi/google-ads-mcp-write.git
cd google-ads-mcp-write
python -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/ruff check . && .venv/bin/pytestThe tests replace the Google Ads API with a fake, so they run offline and never touch a real account.
License
MIT. Not affiliated with or endorsed by Google. Google Ads is a trademark of Google LLC.
Available Tools
13 toolsadd_negative_keywordAdd Negative KeywordC
Add several campaign-level negative keywords, blocking unwanted searches.
| Name | Required | Description | Default |
|---|---|---|---|
| texts | Yes | ||
| match_type | No | BROAD | |
| campaign_id | Yes | ||
| customer_id | Yes | ||
| confirm_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It never says whether the operation is destructive, whether keywords are deduplicated or error on conflict, what 'confirm_token' does or whether confirmation is required, or whether additions are reversible. Only the one-line statement that keywords block searches is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the core action front-loaded and no filler, so it is efficient. However, that brevity comes at the cost of substance rather than being tight-but-complete — it is under-specified, not optimally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutation tool with no annotations and no schema descriptions, the description is far too thin; the confirm_token safety flow is the most critical omission. An output schema exists, so return values need not be described, but operational behavior and parameter meaning are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across five parameters, so the description should compensate and does not. 'Several ... keywords' loosely implies 'texts' is a list and 'campaign-level' hints at 'campaign_id', but 'match_type' (default BROAD), 'customer_id', and especially 'confirm_token' are left completely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add several campaign-level negative keywords') plus the intent ('blocking unwanted searches'), which makes the operation immediately identifiable. It does not explicitly differentiate itself from siblings, but among names like create_keyword and set_keyword_status the negative-keyword scope is distinctive enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 tool versus alternatives, no prerequisites (e.g. customer/campaign must exist, auth needs), and no note about when not to use it. The agent must infer the entire usage context from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ad_groupCreate Ad GroupC
Create an ad group in an existing campaign (CPC in the account currency).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| campaign_id | Yes | ||
| customer_id | Yes | ||
| default_cpc | Yes | ||
| confirm_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing beyond the currency note. For a mutation tool it does not state whether the call is reversible, what the confirm_token does or whether it is required, what errors occur for an invalid campaign_id, or whether creating an ad group starts serving/spending immediately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the key constraint in parentheses. Every clause carries information and there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. However, for a five-parameter write tool with no annotations and zero schema documentation, the description omits the confirm/confirmation workflow and all parameter meanings, leaving the agent without enough to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and it only clarifies default_cpc (account currency). The four other parameters — customer_id, campaign_id, name, and especially the optional confirm_token — receive no explanation of format, source, or expected use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Create an ad group") and adds a real constraint the name does not convey: the parent campaign must already exist. It also clarifies that the CPC value is denominated in the account currency. It stops short of distinguishing itself from siblings like create_search_campaign, which also create campaign-level objects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage context is the phrase "in an existing campaign," which implies a prerequisite but names no tool for locating a campaign_id. No guidance on when to use this versus create_search_campaign, and no mention of when a confirm_token is expected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_keywordCreate KeywordC
Create several keywords in an ad group. match_type: EXACT, PHRASE or BROAD.
| Name | Required | Description | Default |
|---|---|---|---|
| texts | Yes | ||
| match_type | Yes | ||
| ad_group_id | Yes | ||
| customer_id | Yes | ||
| confirm_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for a mutation tool, yet it does not say what permissions are needed, whether creation is idempotent, what happens if some keywords already exist or fail, or whether any batch limit applies. It also never mentions confirm_token, which strongly implies a confirmation step the agent must handle.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the constraint that matters most for correctness. Nothing is padded, though the terseness comes at the cost of the missing guidance noted elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, but the definition is still thin for a four-required-parameter bulk mutation with a confirmation token. An agent would have to guess at batch limits, duplicate handling, and the confirm_token workflow before calling it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across five parameters, so the description must compensate. It adds real value by enumerating match_type values (EXACT, PHRASE, BROAD) since the schema declares no enum, but it says nothing about the texts array format, ad_group_id/customer_id sourcing, or what confirm_token is and how to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create several keywords") plus the scope ("in an ad group"), which separates it from add_negative_keyword and set_keyword_status in the sibling list. The plural "several" usefully signals a bulk operation, though it does not explicitly name the tools it replaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 add_negative_keyword, set_keyword_status, or other creation tools, and no stated prerequisites such as campaign/ad group state or account permissions. The only usage signal is the implied one from the name and the match_type note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_responsive_search_adCreate Responsive Search AdC
Create a responsive search ad. Needs 3-15 headlines (30 chars) and 2-4 descriptions (90).
| Name | Required | Description | Default |
|---|---|---|---|
| final_url | Yes | ||
| headlines | Yes | ||
| ad_group_id | Yes | ||
| customer_id | Yes | ||
| descriptions | Yes | ||
| confirm_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden of behavioral disclosure. It says nothing about the fact that this is a mutating operation, whether a confirm_token is expected or how to obtain one, whether the ad group must pre-exist, or what happens on validation failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the core constraint is front-loaded after the action statement. It is efficient, though the terseness contributes to the gaps elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, but for a mutation with five required parameters at 0% schema coverage the description is too thin. The unexplained confirm_token alone leaves an agent guessing at the invocation protocol.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across six parameters, and the description only adds meaning for two of them, the headline and description counts and character limits. The required customer_id, ad_group_id, final_url, and especially the optional confirm_token are left entirely undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a responsive search ad'), which is clearly distinct from siblings like create_search_campaign, create_ad_group, and create_keyword. It does not explicitly name those siblings, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 the other create_* tools, nor any prerequisite context such as the ad group and customer needing to exist before calling. The confirm_token parameter implies a confirmation flow that is never explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_search_campaignCreate Search CampaignA
Create a PAUSED Search campaign with a budget, location/language targeting and one ad group.
Amounts are in the account currency. It is created paused on purpose: nothing spends until you resume it explicitly. geo_target_ids and language_ids are Google criterion ids (e.g. 2076 = Brazil, 1014 = Portuguese); when omitted they come from GOOGLE_ADS_MCP_DEFAULT_GEO_TARGETS / GOOGLE_ADS_MCP_DEFAULT_LANGUAGES. budget_id reuses an existing budget instead of creating one, which helps to resume a sequence that failed after the budget was already created.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| budget_id | No | ||
| customer_id | Yes | ||
| default_cpc | Yes | ||
| daily_budget | Yes | ||
| language_ids | No | ||
| ad_group_name | No | Ad group 1 | |
| confirm_token | No | ||
| geo_target_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does well: it discloses the non-obvious behavioral trait that the campaign is created paused, that nothing spends until an explicit resume, and that geo/language defaults come from environment variables when omitted. It does not mention permission/auth requirements or what happens on partial failure, which leaves a gap for a multi-entity mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The most important fact, that the campaign is created paused, is front-loaded in the first clause, and each subsequent sentence carries practical information. It is slightly dense with environment variable names, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required, and the description covers the key defaults and safety behavior. Still, for a 9-parameter mutation with zero schema description coverage and no annotations, the unexplained confirm_token and several required fields leave an agent without enough to invoke confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and it explains geo_target_ids and language_ids as Google criterion IDs with concrete examples (2076 = Brazil, 1014 = Portuguese), plus budget_id's reuse semantics and the account-currency rule for amounts. However, confirm_token, customer_id, name, ad_group_name, daily_budget and default_cpc get no explanation at all, and confirm_token in particular is left entirely opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Create a PAUSED Search campaign') and enumerates exactly what is created: budget, location/language targeting, and one ad group. This is clearly distinguishable from siblings like create_ad_group or create_keyword, which build sub-resources rather than whole campaigns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states clearly when this tool applies and explains the deliberate paused state so the agent knows a resume step is required later. It also gives a concrete reuse scenario for budget_id (recovering a sequence that failed after budget creation), but it does not explicitly contrast itself with batching alternatives such as composing create_ad_group manually.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaignsList CampaignsB
List campaigns with id, status and budget. Read-only, to build plans.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden, and it does disclose the key trait: "Read-only". It also lists the returned fields, which is useful given there is an output schema anyway. However, it says nothing about scope (are all campaigns for the customer returned?), pagination, or result size limits for accounts with many campaigns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the returned fields front-loaded and the safety trait immediately after. Nothing is padded, though "to build plans" is vague enough that it barely earns its words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter, output schema present), so the description does not need to explain return values. Still, it omits the customer-scoping semantics of the only parameter and any hint about result volume, which are the things an agent would most need before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter, customer_id, and the description never mentions it. The agent must infer from the parameter name alone that results are scoped to one customer account. This is the clearest gap in the definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"List campaigns with id, status and budget" gives a specific verb and resource plus the fields returned, which distinguishes it cleanly from every sibling (all of which are write operations). It stops short of explicitly naming a sibling alternative, but the read/write split is obvious from the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"to build plans" implies a use context, and "Read-only" signals when this tool is appropriate versus the mutation siblings. There is no explicit when-not guidance, no mention of how it relates to the status/budget setters, and no stated prerequisite for the required customer scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_auto_apply_recommendationsPause Auto Apply RecommendationsC
Turn off auto-applied recommendations (every active subscription).
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | ||
| confirm_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the blast radius ('every active subscription'), which is valuable for a mutation, but it says nothing about permissions required, reversibility, idempotency, or what the nullable confirm_token implies about a confirmation step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the scope qualifier front-loaded and no filler. It is efficient, though its brevity borders on under-specification rather than true conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, but for a two-parameter mutation with zero schema coverage and no annotations, the description omits critical details: what customer_id identifies, whether confirm_token is required for the action to take effect, and whether the change can be undone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for two parameters, so the description must compensate and does not. Neither customer_id nor confirm_token is mentioned; 'every active subscription' only loosely hints that the operation is customer-scoped, and the purpose of confirm_token is entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (turn off) and resource (auto-applied recommendations), which clearly distinguishes it from the sibling tools that all deal with campaign/ad group/keyword status and budgets. It does not name or contrast with any sibling explicitly, but the purpose is unambiguous on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 tool versus alternatives, no prerequisites, and no mention of the counterpart action (re-enabling). The parenthetical scope note is descriptive, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_ad_group_statusSet Ad Group StatusC
Pause or resume an ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| ad_group_id | Yes | ||
| customer_id | Yes | ||
| confirm_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does not meet it. It does not say that the operation is a mutation, what happens to serving during the pause, whether it is reversible, or that a confirm_token safety parameter exists and may be required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence, front-loaded with the action and its scope, with no filler. Its brevity is efficient rather than padded, though the same brevity leaves required detail unstated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema is present so return values need not be explained, but for a four-parameter mutation tool with zero annotation coverage and zero schema descriptions, the definition omits prerequisites, the confirm_token gate, and any effect description. It is not sufficient for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four parameters, and the description only implicitly constrains the status parameter to two states (pause/resume). Nothing is said about customer_id, ad_group_id, or the confirm_token parameter, so most of the input surface is undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb pair ('Pause or resume') and a specific resource ('an ad group'), which distinguishes it from sibling status tools like set_campaign_status and set_keyword_status by level of entity. It stops short of explicitly contrasting with those siblings or with write_status, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this tool over the sibling status setters, no preconditions, and no exclusions. The agent must infer from the name and the 'ad group' object that this is the ad-group-level status tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_campaign_budgetSet Campaign BudgetC
Change a campaign's daily budget (account currency), within the cap and max increase.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | ||
| daily_amount | Yes | ||
| confirm_token | No | ||
| campaign_budget_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It does disclose a real constraint (value must stay "within the cap and max increase"), hinting the call can fail on out-of-range values, but it says nothing about the mutation's irreversibility, what happens on partial failure, or why the optional confirm_token exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded with the action and resource, and the parenthetical currency note earns its place. It is under-informative rather than padded, so its brevity is efficient though it leaves gaps elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. But for a four-parameter mutating tool with zero annotations, the description omits permission requirements, the role of confirm_token, and the failure behavior when limits are exceeded — too much is missing for an agent to invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four parameters, so the description must compensate and largely does not. It clarifies daily_amount's unit and range limits, but customer_id, campaign_budget_id, and especially the optional confirm_token (a mutation-safety parameter whose semantics are entirely undisclosed) receive no explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Change a campaign's daily budget") and specifies the unit is the account currency, which separates it from siblings like set_campaign_manual_cpc and set_campaign_status. It stops short of explicitly differentiating itself from other campaign-mutation tools, but the action and target are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no mention of prerequisites such as required permissions or the need to obtain a confirm token first. The agent is left to infer usage entirely from the verb and the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_campaign_manual_cpcSet Campaign Manual CpcC
Switch campaigns to manual CPC (no enhanced CPC); ad group bids apply again.
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | Yes | ||
| campaign_ids | Yes | ||
| confirm_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full behavioral burden. It discloses meaningful effects — manual CPC with no enhanced CPC and ad group bids applying again — but omits important operational details like confirmation requirements, permissions, and whether the change affects all specified campaigns at once.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It is efficient, though its terseness leaves little room for the usage and confirmation guidance an agent needs for a mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that this is a mutation tool with no annotations, no parameter descriptions, and a confirm_token field, the description is under-specified. The output schema covers return value information, but the description still lacks the procedural and safety context needed to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters. It only vaguely implies campaign targeting through 'campaigns' and does not explain customer_id or the optional confirm_token, leaving two of three parameters without added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Switch campaigns to manual CPC') with a clear resource and mode, and clarifies an important consequence ('ad group bids apply again'). It does not explicitly distinguish itself from sibling tools such as set_campaign_budget, but the core purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the tool is useful by naming the target bidding mode, but it gives no explicit when-to-use or when-not-to-use guidance, no alternatives, and no mention of prerequisites such as the confirm_token flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_campaign_statusSet Campaign StatusA
Pause or resume a campaign. Without confirm_token returns the plan; with it, executes.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| campaign_id | Yes | ||
| customer_id | Yes | ||
| confirm_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden, and it does disclose one genuinely important trait: the two-phase confirm_token flow where the call returns a plan first and only executes on a second call. It does not say whether the change is reversible, what the plan contains, whether the operation is idempotent, or what permissions customer_id implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the core action first and the confirm_token contract second; every clause carries information and nothing is padded. The terseness creates ambiguity in places, but that is a completeness problem rather than a conciseness one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, but for a mutation tool with zero annotation coverage and 0% parameter documentation the description leaves too much open: the accepted status values, what happens on an invalid token, and whether the pause is reversible. It is adequate to attempt a call but not to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 four undocumented parameters. It explains confirm_token's semantics well, but status is a bare string with no enum and the description only hints at values via 'pause or resume' without stating the accepted strings, and customer_id/campaign_id are left entirely undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific pair of verbs (pause/resume) and the resource (campaign), which lets an agent distinguish it from siblings like set_ad_group_status and set_keyword_status. It stops short of naming those siblings explicitly, so differentiation is inferred from the resource rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb pair: use this to pause or resume a campaign rather than to change budget, bid, or status of other entities. There is no explicit when-not guidance, no mention of prerequisites, and no routing to alternative tools such as write_status for other object types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_keyword_statusSet Keyword StatusC
Pause or resume several keywords of the same ad group in one operation.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| ad_group_id | Yes | ||
| customer_id | Yes | ||
| confirm_token | No | ||
| criterion_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full disclosure burden, and it discloses almost nothing about behavior: no required permissions, no mention of the confirm_token parameter that hints at a confirmation step, no statement about reversibility, and no indication of valid status values despite 'status' being a free-form string. Only the mutation intent and batch atomicity are implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the action and scope front-loaded and no wasted wording. It is terse to the point of under-specification, but every word earns its place structurally.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, 0% schema coverage on five parameters, and an undocumented confirmation token, the description is far too thin. An output schema exists so return values need not be explained, but the input and safety picture remain incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across five parameters, so the description must compensate and largely does not. It conveys that criterion_ids are keywords from a single ad group and that status means pause/resume, but says nothing about customer_id, ad_group_id format, or the role and expected values of confirm_token.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb pair (pause/resume) and resource (keywords of one ad group), plus the batch scope ('several ... in one operation'). That distinguishes it from set_ad_group_status and set_campaign_status by resource level, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Batch phrasing implies this is preferred over repeated single-keyword calls, and the 'same ad group' constraint hints at when it does not apply. However, it gives no explicit when-to-use versus siblings like write_status or set_ad_group_status, and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_statusWrite StatusA
Show the active guardrails: allowed accounts, budget limits and kill switch.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. Saying 'Show' implies read-only behavior, and the description lists what data is returned, which is useful context. However, it does not explicitly confirm no side effects, required permissions, or whether the guardrails are global or per-account, and the contrast with the name 'write_status' leaves ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero wasted words. It immediately states the action and then lists the specific guardrails shown. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema, the description is nearly complete: it explains what information is shown, and the output schema covers return values. The remaining gap is the lack of explicit usage guidance and read-only assurance, but the description gives enough context to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. The schema description coverage is 100% and the description does not need to add parameter meaning. Baseline 4 applies for a zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Show' and names the resource 'active guardrails', then enumerates allowed accounts, budget limits, and kill switch. This clearly states what the tool displays, though the tool name 'write_status' is misleading and could cause confusion about whether it mutates state. Sibling tools are all set/create/list operations, so the 'Show' verb does distinguish it from mutating siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 tool versus alternatives, no preconditions, and no exclusions. The description only states what it shows, leaving the agent to infer that it is a read-only inspection tool. No implicit usage context (e.g., check limits before setting budgets) is provided.
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.
13 tool updates
v0.1.0- First observed
add_negative_keyword - First observed
create_ad_group - First observed
create_keyword - First observed
create_responsive_search_ad - First observed
create_search_campaign - First observed
list_campaigns - First observed
pause_auto_apply_recommendations - First observed
set_ad_group_status - First observed
set_campaign_budget - First observed
set_campaign_manual_cpc - First observed
set_campaign_status - First observed
set_keyword_status - First observed
write_status
TDQS
Scored across 13 tools
Tools cleanly partition by resource+action: campaign vs ad group vs keyword status setters, plus distinct budget, CPC, and creation tools. Minor friction comes from set_campaign_status having a plan/confirm_token execute mode while other mutators don't state one, and write_status sounding like a write operation when it is a read-only guardrail view.
Nearly all names follow verb_noun (set_campaign_status, create_ad_group, add_negative_keyword, list_campaigns). Deviations are small: write_status is a noun-ish outlier for a read tool, and set_campaign_manual_cpc swaps the noun slot compared to the set_X_status pattern.
13 tools is well within the sweet spot and every tool maps to a concrete write operation or safety check. Nothing looks redundant or padded for the stated write-focused scope.
Creation (campaign, ad group, keyword, RSA, negative keyword), pausing, budgets, and guardrails are covered, but there are notable gaps: only list_campaigns exists (no list_ad_groups/keywords/ads), no delete/remove operations, and no tool to set ad group or keyword bids even though manual CPC defers to 'ad group bids'.
Maintenance
Related MCP Connectors
- AdCopilotDeprecatedcloud.adcopilot
Google Ads, GA4, Search Console and Tag Manager for AI assistants. Every change is proposed first.
Build, edit and sync Google, Microsoft, Reddit and Meta ad campaigns from your assistant.
Google Ads MCP: reports, search terms, negatives, budgets, campaigns. Approval on every write.
Connect authorized ad accounts to AI assistants for audits, reporting, and approval-gated changes.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables 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.2Apache 2.0
- AlicenseAqualityFmaintenanceEnables managing Google Ads campaigns through an AI assistant with read-only reporting, recommendations, and gated write operations for bids, budgets, and statuses, all backed by preview and audit logging.311MIT
- FlicenseAqualityDmaintenanceEnables AI agents to manage Google Ads campaigns (Search and UAC) through natural language, with read tools always available and guarded write operations for budgets, campaigns, ad groups, and keywords.3-
- FlicenseNot gradedqualityBmaintenanceEnables authorized users to manage Google Ads accounts through natural language, with guardrails like role tiers, account allowlists, spend limits, and two-step confirmations to prevent accidental changes.-