
MCP
Google Ads MCPTool documentation
7 tool calls, their inputs and the limits of this connection. Implementation snapshot: 8 October 2026.
The complete tool reference.
5 read tools and 2 write tools. Open a tool to see its parameters and full JSON Schema. Unknown fields are rejected.
ads_list_customersList selected customersRead
ads_list_customersList selected customersList only customers selected for this grant. No arbitrary MCC login context can be supplied.
Input parameters
No parameters. Pass an empty object: {}.
Full input schema (JSON)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}ads_get_customerGet customerRead
ads_get_customerGet customerRead the selected Ads customer ID, name, currency, timezone and test/manager flags.
Input parameters
resource_keyRequired- string · Max. characters: 100
Full input schema (JSON)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"resource_key": {
"type": "string",
"maxLength": 100,
"pattern": "^customers\\/[1-9]\\d*$"
}
},
"required": [
"resource_key"
],
"additionalProperties": false
}ads_list_campaignsList campaignsRead
ads_list_campaignsList campaignsRead campaigns and their current status, with a bounded row limit.
Input parameters
resource_keyRequired- string · Max. characters: 100
limitOptional- integer · Default: 1000 · min. 1 · max. 10000
Full input schema (JSON)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"resource_key": {
"type": "string",
"maxLength": 100,
"pattern": "^customers\\/[1-9]\\d*$"
},
"limit": {
"default": 1000,
"type": "integer",
"minimum": 1,
"maximum": 10000
}
},
"required": [
"resource_key"
],
"additionalProperties": false
}ads_query_campaign_performanceRead campaign performanceRead
ads_query_campaign_performanceRead campaign performanceRead daily clicks, impressions, cost and conversions over at most 31 days. No arbitrary GAQL or auto-pagination.
Cache: 60 seconds.
Input parameters
resource_keyRequired- string · Max. characters: 100
start_dateRequired- string · date
end_dateRequired- string · date
limitOptional- integer · Default: 1000 · min. 1 · max. 10000
Full input schema (JSON)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"resource_key": {
"type": "string",
"maxLength": 100,
"pattern": "^customers\\/[1-9]\\d*$"
},
"start_date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"end_date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"limit": {
"default": 1000,
"type": "integer",
"minimum": 1,
"maximum": 10000
}
},
"required": [
"resource_key",
"start_date",
"end_date"
],
"additionalProperties": false
}ads_list_labelsList labelsRead
ads_list_labelsList labelsRead existing labels for the selected customer.
Input parameters
resource_keyRequired- string · Max. characters: 100
limitOptional- integer · Default: 1000 · min. 1 · max. 10000
Full input schema (JSON)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"resource_key": {
"type": "string",
"maxLength": 100,
"pattern": "^customers\\/[1-9]\\d*$"
},
"limit": {
"default": 1000,
"type": "integer",
"minimum": 1,
"maximum": 10000
}
},
"required": [
"resource_key"
],
"additionalProperties": false
}ads_create_labelCreate labelWrite
ads_create_labelCreate labelCreate a customer label. validate_only defaults true and checks Google validation without changing data. A real create needs validate_only=false and a new operation_id.
Input parameters
resource_keyRequired- string · Max. characters: 100
operation_idRequired- string · uuid
nameRequired- string · Min. characters: 1 · Max. characters: 80
descriptionOptional- string · Max. characters: 2000
background_colorOptional- string
validate_onlyOptional- boolean · Default: true
Full input schema (JSON)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"resource_key": {
"type": "string",
"maxLength": 100,
"pattern": "^customers\\/[1-9]\\d*$"
},
"operation_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Unique operation ID. Reuse only to retrieve this exact operation status; never reuse for changed arguments."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"description": {
"type": "string",
"maxLength": 2000
},
"background_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$"
},
"validate_only": {
"default": true,
"type": "boolean"
}
},
"required": [
"resource_key",
"operation_id",
"name"
],
"additionalProperties": false
}ads_set_campaign_statusPause or enable campaignWrite
ads_set_campaign_statusPause or enable campaignSet one existing campaign to PAUSED or ENABLED. Enabling may resume ad spend. Requires explicit user intent. validate_only defaults true; a real change needs false and a new operation_id. Does not change budgets.
Changes existing configuration or campaign status. Requires explicit user intent.
Input parameters
resource_keyRequired- string · Max. characters: 100
operation_idRequired- string · uuid
campaign_idRequired- string · Max. characters: 40
statusRequired- string · PAUSED | ENABLED
validate_onlyOptional- boolean · Default: true
Full input schema (JSON)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"resource_key": {
"type": "string",
"maxLength": 100,
"pattern": "^customers\\/[1-9]\\d*$"
},
"operation_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Unique operation ID. Reuse only to retrieve this exact operation status; never reuse for changed arguments."
},
"campaign_id": {
"type": "string",
"maxLength": 40,
"pattern": "^[1-9]\\d*$"
},
"status": {
"type": "string",
"enum": [
"PAUSED",
"ENABLED"
]
},
"validate_only": {
"default": true,
"type": "boolean"
}
},
"required": [
"resource_key",
"operation_id",
"campaign_id",
"status"
],
"additionalProperties": false
}A concrete tool call.
JSON-RPC request after MCP initialization. Sample IDs and dates: replace them with your selected resource and reporting period. The AI client handles transport and authorization.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "ads_query_campaign_performance",
"arguments": {
"resource_key": "customers/1234567890",
"start_date": "2026-09-01",
"end_date": "2026-09-07",
"limit": 100
}
}
}How results come back.
structuredContent- Contains the tool result as a JSON object. Google field names are retained. The same JSON is also returned as a text block in content.
- Data by tool
- Read queries return Google's results with customer, campaign, metrics or label fields. costMicros is in millionths of the account currency. validate_only returns status: validated and validate_only: true without changing data.
- Selected resources
- The first list tool returns resources containing resource_key. It lists only resources authorized for this connection.
isError: true- Tool failures return structuredContent.error and request_id, optionally retry_after_seconds. For example: scope_missing for missing access or service_unavailable when a service cannot be reached. Do not repeat an uncertain write blindly.
Access and technical limits.
Performance queries: at most 31 inclusive days and 10,000 rows, default limit 1,000. Results may be cached for 60 seconds. No arbitrary GAQL, budget or bid changes. Both write tools default validate_only to true: a real write needs false and a new operation_id. ENABLED can resume ad spend.
Connection uses MCP Streamable HTTP with bearer authorization. The server checks read/write scope and the selected resource for each call. Both your Google permissions and MCP connection permissions must allow the operation. Clients discover tools using tools/list; these pages document the tool registry.
Read scope: mcp:ads:read. Write scope: mcp:ads:write.
Every write requires a UUID operation_id. Reuse it only for the exact same operation, never with changed arguments. A completed replay reports mutation_status: succeeded and replayed: true, optionally result_ref, rather than the original Google response. Writes are not retried automatically.