gads_rsa_asset_performance
Analyze asset-level performance for RSA headlines and descriptions using labels (BEST, GOOD, LOW, PENDING, LEARNING). Determine which assets to keep, test, or replace to improve ad performance.
Instructions
Asset-level performance labels (BEST / GOOD / LOW / PENDING / LEARNING) for RSA headlines and descriptions. Identifies which assets to keep, test, or replace.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| customer_id | No | Override GOOGLE_ADS_CUSTOMER_ID for this call | |
| ad_group_id | No | Filter to a specific ad group ID | |
| date_range | No | GAQL date range literal, e.g. LAST_30_DAYS, LAST_7_DAYS, LAST_MONTH | LAST_30_DAYS |
Implementation Reference
- src/index.ts:142-147 (registration)Tool registration for 'gads_rsa_asset_performance' using McpServer.tool(), binding the rsaAssetPerformance handler with its schema.
server.tool( "gads_rsa_asset_performance", "Asset-level performance labels (BEST / GOOD / LOW / PENDING / LEARNING) for RSA headlines and descriptions. Identifies which assets to keep, test, or replace.", rsaAssetPerformanceSchema, async (args) => { try { return ok(await rsaAssetPerformance(args)); } catch (e) { return err(e); } } ); - src/tools/adCopy.ts:37-41 (schema)Input schema for rsaAssetPerformance tool: customer_id (optional), ad_group_id (optional), date_range (default LAST_30_DAYS).
export const rsaAssetPerformanceSchema = { customer_id: z.string().optional().describe("Override GOOGLE_ADS_CUSTOMER_ID for this call"), ad_group_id: z.string().optional().describe("Filter to a specific ad group ID"), date_range: z.string().default("LAST_30_DAYS").describe("GAQL date range literal, e.g. LAST_30_DAYS, LAST_7_DAYS, LAST_MONTH"), }; - src/tools/adCopy.ts:43-66 (handler)Main handler function rsaAssetPerformance. Executes a GAQL query on ad_group_ad_asset_view to get asset-level performance labels (BEST/GOOD/LOW/PENDING/LEARNING) for RSA headlines and descriptions, filtered by ad_group_id and date_range.
export async function rsaAssetPerformance(args: z.infer<z.ZodObject<typeof rsaAssetPerformanceSchema>>) { const customer = getCustomer(args.customer_id); const adGroupClause = args.ad_group_id ? `AND ad_group.id = ${args.ad_group_id}` : ""; const rows = await customer.query(` SELECT campaign.name, ad_group.id, ad_group.name, ad_group_ad.ad.id, asset.type, asset.text_asset.text, ad_group_ad_asset_view.field_type, ad_group_ad_asset_view.performance_label, ad_group_ad_asset_view.pinned_field, ad_group_ad_asset_view.enabled FROM ad_group_ad_asset_view WHERE segments.date DURING ${args.date_range} AND asset.type = 'TEXT' ${adGroupClause} ORDER BY ad_group_ad_asset_view.performance_label ASC LIMIT 500 `); return { rowCount: rows.length, rows }; } - src/tools/adCopy.ts:1-2 (helper)Imports zod for schema validation and getCustomer helper from client.ts for authenticated Google Ads API access.
import { z } from "zod"; import { getCustomer } from "../client.js"; - src/client.ts:24-31 (helper)getCustomer helper used by rsaAssetPerformance to obtain an authenticated Customer object using environment variables (developer token, client ID/secret, refresh token, customer ID).
export function getCustomer(override?: string): Customer { const refresh_token = process.env.GOOGLE_ADS_REFRESH_TOKEN; if (!refresh_token) throw new GoogleAdsError("GOOGLE_ADS_REFRESH_TOKEN is not set"); const customer_id = (override ?? process.env.GOOGLE_ADS_CUSTOMER_ID ?? "").replace(/-/g, ""); if (!customer_id) throw new GoogleAdsError("GOOGLE_ADS_CUSTOMER_ID is not set and no customer_id was passed"); const login_customer_id = process.env.GOOGLE_ADS_LOGIN_CUSTOMER_ID?.replace(/-/g, "") || undefined; return getApi().Customer({ customer_id, login_customer_id, refresh_token }); }