Skills de publicidad: Google Ads, Data Manager e IMA SDK

Por: Artiko
agent-skillsplugins-de-agentesia-agentesgoogle-adsdata-manager-apiadmobima-sdkmcp

Skills de publicidad: Google Ads, Data Manager e IMA SDK

De los 103 skills del catálogo, 89 viven bajo skills/cloud/, 2 bajo skills/analytics/ y 12 bajo skills/ads/. Esos 12 son el bloque más homogéneo del repositorio: todos declaran category: GoogleAds en su metadata, todos vienen de equipos de producto de publicidad y ninguno comparte convenciones con los skills de Cloud de los capítulos 8 y 9.

Es un área interesante porque concentra los tres modelos de uso que puede tener un skill: escribir código de integración en un SDK, llamar a una API de datos desde un script, y —el caso más ilustrativo de este curso— instalar un servidor MCP para que el propio agente consulte la cuenta en lenguaje natural. Recordatorio del capítulo 1: el README marca el repositorio como under active development, y veremos que un par de estos skills citan hermanos que aún no están publicados.

Mapa del área

flowchart TD
    ADS[skills/ads/ - 12 skills - category GoogleAds]
    ADS --> DM[Data Manager API - 3 skills]
    ADS --> API[Google Ads API - 3 skills]
    ADS --> GMA[Google Mobile Ads SDK - 5 skills]
    ADS --> IMA[IMA SDK - 1 skill]
    DM --> DM1[setup, audience-ingestion, event-ingestion]
    API --> API1[quickstart, account-diagnostics, mcp-setup]
    GMA --> G1[get-started, banner, interstitial, rewarded]
    GMA --> G2[android-migrate-to-next-gen]
    IMA --> I1[ima-sdk-basics]

Cada nombre de directorio da título a las secciones que siguen; ninguno lleva prefijo de categoría, el agrupamiento por producto vive solo en el README y en el campo category.

La migración a GMA Next-Gen

google-mobile-ads-android-migrate-to-next-gen

Es el skill más largo del área: 196 líneas de SKILL.md, sin references/, todo en un archivo. Su descripción no deja espacio a la ambigüedad —“Migrates Android applications from the old, legacy Google Mobile Ads (GMA) SDK (com.google.android.gms:play-services-ads) to the new GMA Next-Gen SDK (com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk)”.

Qué hace. Convierte un codebase Android completo de un SDK al otro. El grueso del archivo son dos tablas —API Mapping de clases e imports, Method Mapping de firmas— para que el agente no adivine el equivalente sino que lo busque.

Antes de tocar código pasa por Gradle, y la versión no está hardcodeada: el skill trae el comando para resolverla desde Maven.

curl -sS https://dl.google.com/dl/android/maven2/com/google/android/libraries/ads/mobile/sdk/ads-mobile-sdk/maven-metadata.xml | sed -n 's/.*<latest>\(.*\)<\/latest>.*/\1/p'

Exige además minSdk 24 o superior, compileSdk 34 o superior, y excluir globalmente play-services-ads y play-services-ads-lite para evitar símbolos duplicados. Cierra con gradle build -x test.

Las tres reglas que más cambian el código, de la sección Core Migration Rules: el applicationId de InitializationConfig sale de la meta-data com.google.android.gms.ads.APPLICATION_ID del AndroidManifest.xml, y la etiqueta <meta-data> hay que conservarla porque el SDK de User Messaging Platform la sigue necesitando; MobileAds.initialize() va en un hilo de fondo y antes de cualquier otro método, con RequestConfiguration empaquetado en InitializationConfig.Builder.setRequestConfiguration(); y —esta la escribe en mayúsculas— los callbacks del Next-Gen SDK se invocan en un hilo de fondo, así que toda operación de UI dentro de un callback va envuelta en runOnUiThread {} o Dispatchers.Main.launch {}: “SKIPPING THIS STEP WILL CAUSE THE APPLICATION TO CRASH”.

Una muestra de la tabla de mapeo, que da la medida del cambio de superficie:

ConceptoSDK antiguoGMA Next-Gen
Ad RequestAdRequestespecífico por formato: common.AdRequest, banner.BannerAdRequest, nativead.NativeAdRequest
Carga de bannerAdListenercommon.AdLoadCallback<banner.BannerAd>
Ad Loader nativoAdLoadernativead.NativeAdLoader
Ad Manager viewadmanager.AdViewbanner.AdView — ya no existe AdManagerAdView
Preloaderinterstitial.InterstitialPreloaderinterstitial.InterstitialAdPreloader

En el mapeo de métodos el cambio de forma más visible es que el ad unit ID pasó del load() al constructor del builder: donde antes iba InterstitialAd.load(context, adUnitId, request, loadCallback) ahora va InterstitialAd.load(request, loadCallback) con el request construido por AdRequest.Builder(adUnitId). El skill también manda borrar: la lógica de Mute This Ad no está soportada y LoadAdError ya no tiene variable domain. Con una excepción, las clases que implementan com.google.android.gms.ads.mediation.Adapter deben seguir en com.google.android.gms.ads.

En qué proyecto lo usarías. Una app Android con monetización ya en producción sobre play-services-ads que necesita saltar al SDK nuevo. No sirve para integrar desde cero: para eso está google-mobile-ads-get-started.

Data Manager API: tres skills encadenados

Los tres skills de Data Manager están escritos como una cadena explícita: cada uno declara en su description cuándo no usarse y a cuál derivar. Es el mejor ejemplo del área de lo que en el curso de Agent Skills llamamos descripciones con frontera negativa: setup prepara el entorno y no implementa ingesta; los otros dos implementan ingesta y devuelven al usuario a setup si el prerrequisito no está cubierto.

data-manager-api-setup

Qué hace. El más corto de los tres, 54 líneas: autenticación e instalación de librerías, y nada más. La autenticación pasa por habilitar la API en el proyecto de Google Cloud y generar ADC con gcloud auth application-default login con los scopes https://www.googleapis.com/auth/datamanager y https://www.googleapis.com/auth/cloud-platform. Para service accounts exige además el rol IAM Service Usage Consumer en la cuenta de servicio y roles/iam.serviceAccountTokenCreator en el usuario que ejecuta gcloud.

Las librerías traen un detalle que atraviesa la familia: hay dos paquetes por lenguaje, el cliente y una utilitaria que formatea, hashea y cifra identificadores según la especificación de la API.

LenguajeClienteUtilidades
Pythongoogle-ads-datamanagergoogle-ads-datamanager-util
Javacom.google.api-ads:data-managerdata-manager-util
Node@google-ads/datamanager@google-ads/data-manager-util
PHPgoogleads/data-managergoogleads/data-manager-util
.NETGoogle.Ads.DataManager.V1Google.Ads.DataManager.Util.csproj

Cada lenguaje tiene su archivo en references/: python.md, java.md, node.md, php.md, dotnet.md. En qué proyecto lo usarías: el primer contacto con Data Manager API en un backend que vaya a mandar datos de primera parte a Google Ads, DV360 o Analytics.

data-manager-api-audience-ingestion

Qué hace. Gestiona miembros de audiencia —añadir, quitar y vaciar— para Customer Match, audiencias por mobile device ID y demás casos soportados. La primera instrucción del workflow es un freno marcado [CRITICAL]: si no está claro a dónde van los datos —Google Ads, Display & Video 360— hay que parar y preguntar antes de generar una línea de código. Textual: “Do not assume Google Ads by default”. Eso mapea al account_type del operating_account dentro del Destination, y el destino decide qué se acepta: Google Ads admite composite_data.user_data, mobile_data y user_id_data; DV360 solo los dos primeros.

El checklist acaba en el paso que el propio skill señala como el error más común: un HTTP 200 con request_id solo confirma que el payload se recibió. Para saber si los registros se procesaron hay que consultar client.retrieve_request_status con ese request_id, con backoff exponencial y empezando al menos 30 minutos después del envío.

La sección Critical Gotchas es un inventario de trampas reales:

  • Si mandas identificadores ya hasheados en user_data, fija encoding a HEX o BASE64 en el IngestAudienceMembersRequest.
  • Al subir a Customer Match, el campo terms_of_service es obligatorio.
  • Solo se rellena address en UserIdentifier si están todos sus campos requeridos: postal_code, family_name, given_name, region_code.
  • product_destination_id es un string numérico, no un resource name.
  • Los valores de ConsentStatus son CONSENT_GRANTED y CONSENT_DENIED, no GRANTED ni DENIED.
  • Los campos son email_address y phone_number, no los de la Google Ads API hashed_email y hashed_phone_number.

Trae dos references/: create-audience.md —para obtener el product_destination_id cuando la audiencia aún no existe, avisando de que el cliente correcto es UserListServiceClient— y formatting.md.

En qué proyecto lo usarías. Un pipeline de CRM que sincroniza segmentos hacia Google Ads o DV360, o una migración desde la Customer Match antigua de la Google Ads API: el skill enlaza las tablas de mapeo de campos para ese refactor.

data-manager-api-event-ingestion

Qué hace. El gemelo del anterior, contra el endpoint /v1/events/ingest: conversiones offline, enhanced conversions for leads, click conversions y eventos web o app de Google Analytics. Comparte estructura completa con audience-ingestion —mismo freno [CRITICAL], mismos checkpoints, mismo aviso sobre diagnósticos— pero su lista de gotchas es propia: event_timestamp estrictamente en RFC 3339 y mejor con el objeto typed del SDK que con un string; los identificadores de clic gclid, gbraid y wbraid van anidados dentro de ad_identifiers, no colgando del payload base; el campo de moneda se llama currency, no currency_code; y consent puede fijarse global en el IngestEventsRequest o por Event individual.

Su tabla de migraciones cubre cuatro orígenes: Google Ads API Offline Conversions, Google Ads API Store Sales, Measurement Protocol de Google Analytics y Campaign Manager 360 API Offline Conversions. El formateo se hace con la librería utilitaria, no a mano: en Python, Formatter().process_email_address(email, Encoding.HEX).

En qué proyecto lo usarías. Un e-commerce que sube ventas de tienda física para cerrar el círculo de atribución, o cualquier backend que hoy manda conversiones por Measurement Protocol y quiere consolidar en Data Manager.

Qué hace. Lleva de cero a la primera petición correcta: las cinco credenciales, la elección entre seis librerías cliente o REST directo, y la depuración de los errores clásicos de arranque. Su rasgo más particular es una regla que casi ningún otro skill del catálogo formaliza tanto: “DO NOT Hardcode: Never use hardcoded Google Ads API versions (e.g., v24) or language runtime versions (e.g., Python 3.8+, Java 11+)”. El agente debe resolver la versión mayor estable leyendo las release notes o el repositorio googleapis/googleapis, y hacer búsqueda y reemplazo sobre las plantillas: vXX en minúscula para imports de Java y URLs REST, VXX en title-case para namespaces de .NET y PHP. Además obliga a emitir como primera línea de la respuesta, antes de cualquier saludo, un [SYSTEM: Using Google Ads API version: ...] con la versión resuelta.

Si la red falla hay fallback declarado: API v24, librería Java 34.0.0, y mínimos de runtime Python 3.9+, Java 11+, .NET 6.0+, PHP 8.1+, Ruby 3.0+, Perl 5.28.1+. El refresh token, una de las cinco credenciales, se genera con gcloud:

gcloud auth application-default login \
  --scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform \
  --client-id-file=client_secrets.json

Los dos errores que domina: USER_PERMISSION_DENIED, cuando el usuario OAuth llega a la cuenta cliente a través de una manager pero falta el login_customer_id —el skill lo llama “the #1 cause of permission errors”— y DEVELOPER_TOKEN_NOT_APPROVED, un token Pending que funciona solo contra cuentas de prueba y para el que obliga a nombrar los tres niveles de acceso completos: Explorer Access, Basic Access y Standard Access.

Trae además dos guardarraíles: uno de seguridad —nunca ampliar scopes más allá de adwords, ni modificar el código de la librería, ni usar wrappers de terceros para saltar la validación del token— y uno operativo: al depurar, análisis estático solamente, nada de ejecutar comandos ni reproducir el error, para no caer en bucles de ejecución fallida. Sus references/ cubren los siete caminos: python.md, java.md, dotnet.md, php.md, ruby.md, perl.md y rest.md.

En qué proyecto lo usarías. Cualquier integración nueva contra la Google Ads API, y como primera parada cuando heredas un proyecto que devuelve USER_PERMISSION_DENIED.

Qué hace. Diagnostica caídas de rendimiento de una cuenta: pérdida de conversiones o de valor, poco flujo de leads, y cuota de impresiones perdida por ad rank, pujas o presupuesto. Lo relevante para este curso es cómo lo hace: no escribe scripts. Asume el servidor MCP de Google Ads instalado y opera solo con sus herramientas —“you must call the search tool on the MCP server directly. Do not write or execute custom Python scripts or use the Google Ads client library to query the API, as they will fail authentication inside the evaluation sandbox”.

El flujo empieza siempre igual: si no hay customer ID, llamar list_accessible_customers y filtrar las cuentas cliente activas, descartando managers y desactivadas porque consultarlas provoca errores de API.

SELECT customer_client.id, customer_client.descriptive_name
FROM customer_client
WHERE customer_client.status = 'ENABLED' AND customer_client.manager = FALSE

Los cuatro workflows, cada uno con su gotcha de GAQL:

WorkflowRecursos y métricasGotcha
Pérdida de conversionescampaign o ad_group con metrics.conversions, metrics.conversions_value, metrics.cost_micros, segmentado por fecha, device y conversion actioncost_micros se divide por 1.000.000
Oportunidades perdidasmetrics.search_impression_share, metrics.search_rank_lost_impression_share, metrics.search_budget_lost_impression_sharellegan como decimales —0.35 es 35%— o como strings tipo "< 0.10"
Poco flujo de leadsseparar caída de tráfico de caída de tasa de conversión, luego change_eventLIMIT de 10000 o menos, fecha dentro de 30 días y sin métricas
Subidas offlineoffline_conversion_upload_conversion_action_summary, comparando successful_event_count con total_event_countsi vuelve vacía, detener y reportar, no reintentar

Un detalle que conviene señalar: la description de este skill remite a un gma-android-integrate para problemas de integración del Mobile Ads SDK, y ese directorio no existe en el repositorio —el equivalente publicado es google-mobile-ads-get-started. Referencia colgante, coherente con el aviso de under active development.

En qué proyecto lo usarías. Una agencia o un equipo de performance marketing que quiere hacer la primera pasada de diagnóstico conversando con el agente en vez de armar dashboards.

El skill del área que más conecta con el resto de la trilogía, porque no enseña a programar contra una API: enseña a darle una herramienta al agente.

Qué hace. Instala, configura e integra el servidor MCP open source oficial de Google Ads, googleads/google-ads-mcp.

flowchart LR
    Q[google-ads-api-quickstart] -->|si el objetivo es un asistente IA| M[google-ads-api-mcp-setup]
    M -->|faltan credenciales| Q
    M --> SRV[google-ads-mcp via pipx]
    SRV -->|stdio| CLI[Claude Code, Cursor, Antigravity]
    CLI --> D[google-ads-api-account-diagnostics]

Las dos flechas del handoff están escritas en los propios archivos: el quickstart dice que si el objetivo es conectar un asistente IA, “DO NOT write custom scripts”, hay que pasar a google-ads-api-mcp-setup; y el MCP setup dice lo inverso, si faltan las cinco credenciales hay que volver al quickstart.

Prerrequisitos e instalación. Python 3.12 o superior y pipx accesible globalmente, verificados con python3 --version y pipx --version antes de proponer nada; por defecto la release estable de PyPI.

pipx install google-ads-mcp
google-ads-mcp --help

Si ese --help falla con command not found, el skill prohíbe reinstalar en bucle: verificar con la ruta absoluta ~/.local/bin/google-ads-mcp y, si funciona, explicar que el problema es el PATH.

El transporte. Hay una directiva literal: al explicar la arquitectura hay que usar las palabras exactas standard input/output y transport. La razón de fondo sirve para cualquiera que escriba un servidor MCP: el cliente host lanza el servidor como subproceso, no hay puerto de red —todo va por piping de stdin/stdout— y como stdout está reservado al protocolo, los logs van obligatoriamente a stderr.

Credenciales. Por variables de entorno, mejor en el JSON del cliente MCP —lo aísla a esa herramienta— que en el perfil global del shell.

{
  "mcpServers": {
    "google-ads": {
      "command": "pipx",
      "args": ["run", "google-ads-mcp"],
      "env": {
        "GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN",
        "GOOGLE_ADS_CLIENT_ID": "YOUR_OAUTH_CLIENT_ID",
        "GOOGLE_ADS_CLIENT_SECRET": "YOUR_OAUTH_CLIENT_SECRET",
        "GOOGLE_ADS_REFRESH_TOKEN": "YOUR_OAUTH_REFRESH_TOKEN",
        "GOOGLE_ADS_LOGIN_CUSTOMER_ID": "YOUR_MANAGER_ACCOUNT_ID_IF_APPLICABLE"
      }
    }
  }
}

Lista además variables de despliegue —GOOGLE_PROJECT_ID, FASTMCP_HOST, GOOGLE_ADS_MCP_BASE_URL y las dos GOOGLE_ADS_MCP_OAUTH_*— porque tiene un paso 5.5 para alojarlo en Cloud Run: Artifact Registry, gcloud builds submit, gcloud run deploy con FASTMCP_HOST=0.0.0.0, y el cliente apuntando a "httpUrl": "https://tu-url.a.run.app/mcp" en vez de a un comando local.

Las tres herramientas expuestas. El skill obliga a nombrarlas todas y a dar los nombres exactos de sus argumentos, sin parafrasear customer_id como “cuenta”:

HerramientaArgumentosPara qué
list_accessible_customersningunoLista los customer IDs accesibles con esas credenciales
get_resource_metadataresourceInspecciona campos, métricas y segmentos antes de escribir GAQL
searchcustomer_id, queryEjecuta una consulta GAQL contra una cuenta

Y una advertencia que evita malentendidos: el servidor es estrictamente de solo lectura. No puede modificar pujas, pausar campañas ni crear assets.

Verificación. Se hace desde la CLI de Antigravity —agy, luego /mcp— porque aísla problemas de credenciales o de arranque antes de culpar al IDE. Los fallos catalogados: los IDEs no heredan ~/.bashrc ni ~/.zshrc; los servidores MCP solo se cargan al arrancar la aplicación, así que hay que reiniciar el cliente entero tras editar la configuración; y spawn pipx ENOENT significa que pipx no está en el PATH del IDE.

En qué proyecto lo usarías. Cuando el objetivo no es escribir un integrador sino consultar la cuenta en lenguaje natural desde tu asistente. Es el punto donde este curso se toca con el curso de Agent Plugins: un plugin distribuible es, en buena parte, esta misma combinación de skills más servidor MCP empaquetada para instalarse de una vez. Aquí ese empaquetado no existe —los plugins/ del repositorio son todos de Cloud, como veremos en el capítulo 11— y el skill suple el hueco explicando la instalación paso a paso.

Los formatos del Mobile Ads SDK

Cuatro skills de estructura casi idéntica: SKILL.md corto —entre 30 y 47 líneas—, workflow de cuatro pasos y todo el detalle real en references/ por plataforma. Es el patrón de carga diferida del capítulo 4, llevado al extremo.

google-mobile-ads-get-started

Qué hace. Instala e inicializa el SDK para AdMob o Ad Manager en Android, iOS o Unity; es la puerta de entrada de los otros tres. Su workflow cabe en cuatro pasos: determinar la plataforma —y si no está clara, preguntar—, leer la guía correspondiente y ejecutar el checklist de añadir la dependencia, fijar el identificador de aplicación, inicializar el SDK y verificar. Termina con una instrucción de producto: una vez instalado, preguntar qué formato de anuncio se quiere integrar.

Es el único de los cuatro con assets/: un skadnetwork-identifiers.xml de 203 líneas con el array SKAdNetworkItems listo para pegar en el Info.plist de iOS. Las guías usan App IDs de prueba —ca-app-pub-3940256099942544~3347511713 en Android, ca-app-pub-3940256099942544~1458002511 en iOS— con el recordatorio de reemplazarlos.

En qué proyecto lo usarías. Una app móvil que va a monetizar con AdMob por primera vez, o un proyecto Unity que necesita la misma configuración en iOS y Android.

google-mobile-ads-banner

Qué hace. Implementa banners en Android, iOS o Unity. Su aporte propio es una decisión de producto tomada por adelantado: “Default to Large Anchored Adaptive Banner if the user says banner without defining a type”. Reconoce tres tipos: Large Anchored Adaptive (el de por defecto, anclado arriba o abajo), Anchored Adaptive (igual, sin el tamaño grande) e Inline Adaptive, que se coloca dentro del contenido y está disponible solo en Android e iOS. Checklist: definir la vista, fijar el tamaño, registrar eventos de carga, cargar y verificar. Cierre operativo: recordar reemplazar el ad unit ID de prueba —ca-app-pub-3940256099942544/2435281174 en iOS— por el propio.

En qué proyecto lo usarías: cualquier app con monetización de bajo impacto donde el anuncio convive con el contenido en pantalla.

google-mobile-ads-interstitial

Qué hace. Anuncios de pantalla completa entre secciones de contenido. Solo Android e iOS —aquí no hay guía de Unity— y su descripción excluye explícitamente los rewarded interstitial. Su particularidad es una sección marcada **CRITICAL:** que se resuelve antes de escribir código: identificar el archivo donde va el anuncio, y preguntar si no está claro. Es un skill que se niega a colocar un intersticial donde le parezca. Checklist: cargar, registrar callbacks, mostrar, verificar. En qué proyecto lo usarías: un juego casual o una app con transiciones naturales entre secciones, donde el anuncio no interrumpe una tarea a medias.

google-mobile-ads-rewarded

Qué hace. Anuncios que entregan un ítem in-app a cambio de verlos. También solo Android e iOS, y también excluye los rewarded interstitial. Comparte la sección **CRITICAL:** de ubicación con el intersticial, pero su checklist tiene un paso extra que ningún otro formato tiene: añadir un elemento de UI de opt-in. No es cosmético: la definición del formato dice que el anuncio se sirve después de que el usuario acepta explícitamente verlo.

En qué proyecto lo usarías. Un juego con economía de vidas, monedas o pistas, o una app freemium que desbloquea una función a cambio de un vídeo.

IMA SDK

ima-sdk-basics

Qué hace. Inserción de anuncios de vídeo y audio del lado del cliente —client-side ad insertion— pidiendo anuncios a cualquier servidor compatible con VAST y gestionando la reproducción con VAST o VMAP. Es uno de los dos únicos skills del catálogo que repiten license: Apache-2.0 en su propio frontmatter —el otro es google-cloud-storage-basics— además del LICENSE global del repositorio, y el único que declara metadata.author: Google LLC. Su descripción excluye Dynamic Ad Insertion, SSAI y SGAI, y remite a un skill ima-sdk-dai-basics que no existe en el repositorio: segunda referencia colgante del área.

Cubre más plataformas que ningún otro skill de skills/ads/, con una regla de lectura estricta —hay que leer todas las guías de la plataforma antes de integrar:

PlataformaGuías a leer
Web, HTML5, React, Node, Angularima-sdk-web-guide.md, ima-sdk-web-iframe-mode.md, ima-sdk-web-mobile-safari.md
Android, Android TV, React Nativeima-sdk-android-guide.md
iOS, tvOS, React Nativeima-sdk-ios-guide.md, ima-sdk-tvos-guide.md

El ciclo de vida que enseña es idéntico en todas ellas:

flowchart TD
    A[Importar el SDK] --> B[Inicializacion - warmup, settings, Ad UI]
    B --> C[Ad Request - gesto de usuario valido]
    C --> D{Resultado de carga}
    D -->|exito| E[Obtener AdsManager]
    D -->|error fatal temprano| F[Manejar onAdError]
    E --> G[Eventos de reproduccion - pausar y reanudar contenido]
    G --> H[Cleanup - destruir AdsManager]
    F --> H

En web se empieza cargando el loader https://imasdk.googleapis.com/js/sdkloader/ima3.js con una etiqueta <script> a nivel de página, con el requisito de que el SDK pueda acceder a window.top.location.href. En Android es una dependencia Gradle, com.google.ads.interactivemedia.v3:interactivemedia:3.39.0, enlazada con ExoPlayer, y las guías apuntan a implementaciones de referencia en repositorios como googleads/googleads-ima-android. El paso 6 del ciclo, Cleanup, aparece explícito para evitar fugas: destruir el AdsManager libera recursos. Es el tipo de detalle que un agente omite si nadie se lo escribe.

En qué proyecto lo usarías. Un reproductor de vídeo propio —web, app o smart TV— que necesita monetizar con cortes publicitarios pedidos a Ad Manager o a cualquier ad server VAST.

Patrones del área que valen para cualquier skill

Leídos juntos, dejan cuatro lecciones aplicables a los skills que escribas tú:

LecciónEvidencia en skills/ads/
La description define fronteras, no solo capacidadesLa mayoría incluye un “Don’t use for…” que nombra el alternativo, y el handoff es bidireccional entre quickstart y mcp-setup
Los references/ cargan tardeEl SKILL.md de banner tiene 47 líneas y decide plataforma antes de leer nada más
Los gotchas valen más que los happy pathsLas Critical Gotchas de Data Manager: campos que se confunden, enums mal escritos, respuestas 200 que no son éxito
Las referencias se rompengma-android-integrate e ima-sdk-dai-basics se nombran pero no existen

El mecanismo detrás de estas convenciones está desarrollado en el curso de Agent Skills; aquí lo estás viendo aplicado por equipos de producto distintos, sobre APIs que no se parecen entre sí, dentro de un mismo repositorio.

Resumen

  • skills/ads/ agrupa 12 skills, todos con category: GoogleAds, en cuatro familias: Data Manager API, Google Ads API, Google Mobile Ads SDK e IMA SDK.
  • google-mobile-ads-android-migrate-to-next-gen es una migración guiada por tablas de mapeo, con tres reglas críticas: App ID desde el manifest, inicialización en hilo de fondo y toda operación de UI dentro de callbacks envuelta en runOnUiThread.
  • Los tres skills de Data Manager forman cadena: data-manager-api-setup prepara ADC y las dos librerías por lenguaje; audience-ingestion y event-ingestion implementan cada carga con su lista de gotchas, e insisten en que un 200 con request_id no es éxito: hay que consultar retrieve_request_status.
  • google-ads-api-quickstart cubre las cinco credenciales, prohíbe hardcodear versiones y resuelve USER_PERMISSION_DENIED y DEVELOPER_TOKEN_NOT_APPROVED.
  • google-ads-api-mcp-setup instala el servidor MCP oficial con pipx install google-ads-mcp, exige Python 3.12+, explica el transporte stdio y expone tres herramientas de solo lectura: list_accessible_customers, get_resource_metadata y search. Es el puente hacia el curso de Agent Plugins, y google-ads-api-account-diagnostics lo consume para diagnosticar cuentas con GAQL sin escribir scripts.
  • Los cuatro skills del Mobile Ads SDK son cortos y delegan todo a references/ por plataforma: banner usa Large Anchored Adaptive por defecto y rewarded añade un paso de opt-in que los demás no tienen. ima-sdk-basics cubre web, Android, iOS y tvOS para inserción client-side con VAST y VMAP, y cita un skill de DAI que todavía no está publicado.

Siguiente: Plugins y marketplace: cómo Google empaqueta y distribuye