Manage Apple Search Ads from chat: sign in with Apple ID, check notifications, and pull campaign pe…
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Add a targeting keyword to an ad group (CM API array POST).
Keyword text (required, max 80 chars).
Ad group ID.
Campaign ID.
ACTIVE or PAUSED (default ACTIVE).
Max CPT bid (defaults to default_bid_amount or 1.00).
EXACT or BROAD (default EXACT).
Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http mcp-apple_ads https://nova.civai.co/mcp/agents/mcp-apple_ads
Add a targeting keyword to an ad group (CM API array POST).
| Argument | Type | Description |
|---|---|---|
| ad_group_id | string | Ad group ID. |
| campaign_id | string | Campaign ID. |
| keyword_text* | string | Keyword text (required, max 80 chars). |
| keyword_status | string | ACTIVE or PAUSED (default ACTIVE). |
| keyword_bid_amount | string | Max CPT bid (defaults to default_bid_amount or 1.00). |
| keyword_match_type | string | EXACT or BROAD (default EXACT). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [
"keyword_text"
],
"properties": {
"ad_group_id": {
"type": "string",
"description": "Ad group ID."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID."
},
"keyword_text": {
"type": "string",
"description": "Keyword text (required, max 80 chars)."
},
"keyword_status": {
"type": "string",
"description": "ACTIVE or PAUSED (default ACTIVE)."
},
"keyword_bid_amount": {
"type": "string",
"description": "Max CPT bid (defaults to default_bid_amount or 1.00)."
},
"keyword_match_type": {
"type": "string",
"description": "EXACT or BROAD (default EXACT)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Create ad group under campaign_id.
| Argument | Type | Description |
|---|---|---|
| campaign_id | string | Campaign ID (or use created_campaign_id from create_campaign). |
| ad_group_name* | string | Ad group name (required). |
| default_bid_amount | string | Default max CPT bid (default 1.00). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
| ad_group_create_status | string | PAUSED or ENABLED (default PAUSED). |
| automated_keywords_opt_in | string | true/false for Search Match (default false). |
{
"type": "object",
"required": [
"ad_group_name"
],
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign ID (or use created_campaign_id from create_campaign)."
},
"ad_group_name": {
"type": "string",
"description": "Ad group name (required)."
},
"default_bid_amount": {
"type": "string",
"description": "Default max CPT bid (default 1.00)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
},
"ad_group_create_status": {
"type": "string",
"description": "PAUSED or ENABLED (default PAUSED)."
},
"automated_keywords_opt_in": {
"type": "string",
"description": "true/false for Search Match (default false)."
}
}
}Create Search Results campaign (default PAUSED). Requires unique campaign_name.
| Argument | Type | Description |
|---|---|---|
| app_adam_id | string | App Store adam ID for the promoted app (default BrowserGPT 6746402487). |
| campaign_name* | string | Unique campaign name (required). |
| daily_budget_amount | string | Daily budget amount (default 10). |
| countries_or_regions | string | Comma-separated ISO country codes (default US). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
| daily_budget_currency | string | Budget currency (default USD). |
| campaign_create_status | string | PAUSED or ENABLED (default PAUSED). |
{
"type": "object",
"required": [
"campaign_name"
],
"properties": {
"app_adam_id": {
"type": "string",
"description": "App Store adam ID for the promoted app (default BrowserGPT 6746402487)."
},
"campaign_name": {
"type": "string",
"description": "Unique campaign name (required)."
},
"daily_budget_amount": {
"type": "string",
"description": "Daily budget amount (default 10)."
},
"countries_or_regions": {
"type": "string",
"description": "Comma-separated ISO country codes (default US)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
},
"daily_budget_currency": {
"type": "string",
"description": "Budget currency (default USD)."
},
"campaign_create_status": {
"type": "string",
"description": "PAUSED or ENABLED (default PAUSED)."
}
}
}Delete a campaign permanently (GraphQL deleteCampaignsGql). Confirm with the user first.
| Argument | Type | Description |
|---|---|---|
| adam_id | string | Portal org app id for Referer (default 9025370). |
| campaign_id* | string | Campaign ID to delete. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"adam_id": {
"type": "string",
"description": "Portal org app id for Referer (default 9025370)."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID to delete."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Delete a targeting keyword from an ad group.
| Argument | Type | Description |
|---|---|---|
| keyword_id* | string | Keyword ID to delete. |
| ad_group_id | string | Ad group ID. |
| campaign_id | string | Campaign ID. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [
"keyword_id"
],
"properties": {
"keyword_id": {
"type": "string",
"description": "Keyword ID to delete."
},
"ad_group_id": {
"type": "string",
"description": "Ad group ID."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Duplicate an existing campaign (CM REST). adPlacements default from source supplySources.
| Argument | Type | Description |
|---|---|---|
| campaign_id* | string | Source campaign ID. |
| countries_or_regions | string | Optional comma-separated country codes. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
| copy_adgroup_keywords | string | true/false copy ad group keywords (default false). |
| duplicate_ad_placements | string | Optional comma-separated placements (default from source). |
| duplicate_campaign_name* | string | New campaign name (required). |
| duplicate_campaign_status | string | PAUSED or ENABLED (default PAUSED). |
| copy_campaign_negative_keywords | string | true/false copy negative keywords (default false). |
Set ad group status ENABLED or PAUSED.
| Argument | Type | Description |
|---|---|---|
| ad_group_id* | string | Ad group ID. |
| campaign_id* | string | Campaign ID. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
| ad_group_update_status | string | ENABLED or PAUSED (default ENABLED). |
{
"type": "object",
"required": [
"campaign_id",
"ad_group_id"
],
"properties": {
"ad_group_id": {
"type": "string",
"description": "Ad group ID."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
},
"ad_group_update_status": {
"type": "string",
"description": "ENABLED or PAUSED (default ENABLED)."
}
}
}Update campaign status and/or daily budget (PUT CM API).
| Argument | Type | Description |
|---|---|---|
| campaign_id* | string | Campaign ID to update. |
| daily_budget_amount | string | Optional new daily budget amount (USD unless daily_budget_currency set). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
| daily_budget_currency | string | Budget currency when updating daily_budget_amount (default USD). |
| campaign_update_status | string | ENABLED or PAUSED (default ENABLED). |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign ID to update."
},
"daily_budget_amount": {
"type": "string",
"description": "Optional new daily budget amount (USD unless daily_budget_currency set)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
},
"daily_budget_currency": {
"type": "string",
"description": "Budget currency when updating daily_budget_amount (default USD)."
},
"campaign_update_status": {
"type": "string",
"description": "ENABLED or PAUSED (default ENABLED)."
}
}
}Campaign detail (name, status, budget, app metadata) via reloadCampaignFromAdGroupGQL.
| Argument | Type | Description |
|---|---|---|
| adam_id | string | App Store adam ID for Referer (default 9025370). |
| ad_group_id | string | Ad group ID for Referer path when opened from ad group UI. |
| campaign_id* | string | Apple Ads campaign ID. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"adam_id": {
"type": "string",
"description": "App Store adam ID for Referer (default 9025370)."
},
"ad_group_id": {
"type": "string",
"description": "Ad group ID for Referer path when opened from ad group UI."
},
"campaign_id": {
"type": "string",
"description": "Apple Ads campaign ID."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Dashboard campaign column layout.
| Argument | Type | Description |
|---|---|---|
| adam_id | string | App Store adam ID for Referer (default 9025370). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [],
"properties": {
"adam_id": {
"type": "string",
"description": "App Store adam ID for Referer (default 9025370)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Saved dashboard filter sets.
| Argument | Type | Description |
|---|---|---|
| adam_id | string | App Store adam ID for Referer (default 9025370). |
| filter_set_type | string | GraphQL filterSetType (default CAMPAIGNS). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [],
"properties": {
"adam_id": {
"type": "string",
"description": "App Store adam ID for Referer (default 9025370)."
},
"filter_set_type": {
"type": "string",
"description": "GraphQL filterSetType (default CAMPAIGNS)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Account general setting (e.g. timezone).
| Argument | Type | Description |
|---|---|---|
| adam_id | string | App Store adam ID for Referer (default 9025370). |
| general_setting_name | string | Setting name (default timezone). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [],
"properties": {
"adam_id": {
"type": "string",
"description": "App Store adam ID for Referer (default 9025370)."
},
"general_setting_name": {
"type": "string",
"description": "Setting name (default timezone)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Search Ads notification inbox (GET /cm/api/v1/ns/inbox). Returns status, data[], pagination.
| Argument | Type | Description |
|---|---|---|
| adam_id | string | Portal app adam ID for Referer (default 9025370). |
| ad_group_id | string | Ad group ID for Referer path. |
| campaign_id | string | Campaign ID for Referer path. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [],
"properties": {
"adam_id": {
"type": "string",
"description": "Portal app adam ID for Referer (default 9025370)."
},
"ad_group_id": {
"type": "string",
"description": "Ad group ID for Referer path."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID for Referer path."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Ad group metrics for a campaign (GraphQL).
| Argument | Type | Description |
|---|---|---|
| adam_id | string | Portal org app id for Referer (default 9025370). |
| campaign_id* | string | Campaign ID. |
| report_end_time | string | End date YYYY-MM-DD (UTC). |
| report_start_time | string | Start date YYYY-MM-DD (UTC). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"adam_id": {
"type": "string",
"description": "Portal org app id for Referer (default 9025370)."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID."
},
"report_end_time": {
"type": "string",
"description": "End date YYYY-MM-DD (UTC)."
},
"report_start_time": {
"type": "string",
"description": "Start date YYYY-MM-DD (UTC)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}List ad groups in a campaign.
| Argument | Type | Description |
|---|---|---|
| campaign_id* | string | Campaign ID. |
| ad_group_list_query | string | Optional name/id search filter. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign ID."
},
"ad_group_list_query": {
"type": "string",
"description": "Optional name/id search filter."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Campaign performance report (getReportsByCampaign).
| Argument | Type | Description |
|---|---|---|
| adam_id | string | App Store adam ID for Referer (default 9025370). |
| report_end_time | string | End date YYYY-MM-DD (UTC). |
| report_timezone | string | Reporting time zone (default UTC). |
| report_start_time | string | Start date YYYY-MM-DD (UTC). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [],
"properties": {
"adam_id": {
"type": "string",
"description": "App Store adam ID for Referer (default 9025370)."
},
"report_end_time": {
"type": "string",
"description": "End date YYYY-MM-DD (UTC)."
},
"report_timezone": {
"type": "string",
"description": "Reporting time zone (default UTC)."
},
"report_start_time": {
"type": "string",
"description": "Start date YYYY-MM-DD (UTC)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}List campaigns for an app (CM API find).
| Argument | Type | Description |
|---|---|---|
| app_adam_id | string | App Store adam ID (default BrowserGPT 6746402487). |
| campaign_list_query | string | Optional name filter. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [],
"properties": {
"app_adam_id": {
"type": "string",
"description": "App Store adam ID (default BrowserGPT 6746402487)."
},
"campaign_list_query": {
"type": "string",
"description": "Optional name filter."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Alias for get_inbox — same inbox API.
| Argument | Type | Description |
|---|---|---|
| adam_id | string | Portal app adam ID for Referer (default 9025370). |
| ad_group_id | string | Ad group ID for Referer path. |
| campaign_id | string | Campaign ID for Referer path. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [],
"properties": {
"adam_id": {
"type": "string",
"description": "Portal app adam ID for Referer (default 9025370)."
},
"ad_group_id": {
"type": "string",
"description": "Ad group ID for Referer path."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID for Referer path."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}List targeting keywords for an ad group (GraphQL adgroup_targetedkeywords).
| Argument | Type | Description |
|---|---|---|
| adam_id | string | Portal org app id for Referer (default 9025370). |
| ad_group_id* | string | Ad group ID. |
| campaign_id* | string | Campaign ID. |
| report_end_time | string | End date YYYY-MM-DD (UTC). |
| report_start_time | string | Start date YYYY-MM-DD (UTC). |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [
"campaign_id",
"ad_group_id"
],
"properties": {
"adam_id": {
"type": "string",
"description": "Portal org app id for Referer (default 9025370)."
},
"ad_group_id": {
"type": "string",
"description": "Ad group ID."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID."
},
"report_end_time": {
"type": "string",
"description": "End date YYYY-MM-DD (UTC)."
},
"report_start_time": {
"type": "string",
"description": "Start date YYYY-MM-DD (UTC)."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Campaign detail from campaign reporting view (GraphQL).
| Argument | Type | Description |
|---|---|---|
| adam_id | string | Portal org app id for Referer (default 9025370). |
| campaign_id* | string | Campaign ID. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"adam_id": {
"type": "string",
"description": "Portal org app id for Referer (default 9025370)."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Search promotable apps (CM API).
| Argument | Type | Description |
|---|---|---|
| app_search_query | string | App name search string. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [],
"properties": {
"app_search_query": {
"type": "string",
"description": "App name search string."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Verify Apple Search Ads session (config + GetView).
| Argument | Type | Description |
|---|---|---|
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [],
"properties": {
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}Open App Store Connect sign-in only when needed. If the saved session is still valid, this tool returns success immediately and does not open the viewer. Call session_status first. Use force_reconnect only when the user explicitly wants to wipe the saved cookie and sign in again (destructive).
| Argument | Type | Description |
|---|---|---|
| force_reconnect | boolean | DESTRUCTIVE: delete the saved session cookie for this tenant, then open the viewer for a fresh sign-in. Do not set true unless the user explicitly asks to sign out / reconnect / clear session. |
{
"type": "object",
"required": [],
"properties": {
"force_reconnect": {
"type": "boolean",
"description": "DESTRUCTIVE: delete the saved session cookie for this tenant, then open the viewer for a fresh sign-in. Do not set true unless the user explicitly asks to sign out / reconnect / clear session."
}
}
}Update ad group status, name, and/or default max CPT bid.
| Argument | Type | Description |
|---|---|---|
| ad_group_id* | string | Ad group ID. |
| campaign_id* | string | Campaign ID. |
| ad_group_name | string | Optional new ad group name. |
| default_bid_amount | string | Optional new default max CPT bid. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
| daily_budget_currency | string | Bid currency (default USD). |
| ad_group_update_status | string | Optional ENABLED or PAUSED. |
{
"type": "object",
"required": [
"campaign_id",
"ad_group_id"
],
"properties": {
"ad_group_id": {
"type": "string",
"description": "Ad group ID."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID."
},
"ad_group_name": {
"type": "string",
"description": "Optional new ad group name."
},
"default_bid_amount": {
"type": "string",
"description": "Optional new default max CPT bid."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
},
"daily_budget_currency": {
"type": "string",
"description": "Bid currency (default USD)."
},
"ad_group_update_status": {
"type": "string",
"description": "Optional ENABLED or PAUSED."
}
}
}Update bid, status, or text on an existing targeting keyword.
| Argument | Type | Description |
|---|---|---|
| keyword_id* | string | Keyword ID. |
| ad_group_id | string | Ad group ID. |
| campaign_id | string | Campaign ID. |
| keyword_text* | string | Keyword text. |
| keyword_status | string | ACTIVE or PAUSED. |
| keyword_bid_amount | string | Max CPT bid. |
| keyword_match_type | string | EXACT or BROAD. |
| notification_message | string | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
{
"type": "object",
"required": [
"keyword_id",
"keyword_text"
],
"properties": {
"keyword_id": {
"type": "string",
"description": "Keyword ID."
},
"ad_group_id": {
"type": "string",
"description": "Ad group ID."
},
"campaign_id": {
"type": "string",
"description": "Campaign ID."
},
"keyword_text": {
"type": "string",
"description": "Keyword text."
},
"keyword_status": {
"type": "string",
"description": "ACTIVE or PAUSED."
},
"keyword_bid_amount": {
"type": "string",
"description": "Max CPT bid."
},
"keyword_match_type": {
"type": "string",
"description": "EXACT or BROAD."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 2, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.
{
"type": "object",
"required": [
"campaign_id",
"duplicate_campaign_name"
],
"properties": {
"campaign_id": {
"type": "string",
"description": "Source campaign ID."
},
"countries_or_regions": {
"type": "string",
"description": "Optional comma-separated country codes."
},
"notification_message": {
"type": "string",
"description": "Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names."
},
"copy_adgroup_keywords": {
"type": "string",
"description": "true/false copy ad group keywords (default false)."
},
"duplicate_ad_placements": {
"type": "string",
"description": "Optional comma-separated placements (default from source)."
},
"duplicate_campaign_name": {
"type": "string",
"description": "New campaign name (required)."
},
"duplicate_campaign_status": {
"type": "string",
"description": "PAUSED or ENABLED (default PAUSED)."
},
"copy_campaign_negative_keywords": {
"type": "string",
"description": "true/false copy negative keywords (default false)."
}
}
}