google-ads-mcp
OfficialGoogle Ads MCP Server
This repo contains the source code for running an MCP server that interacts with the Google Ads API.
Herramientas
El servidor utiliza la Google Ads API para proporcionar varias Herramientas y Recursos para su uso con LLMs y agentes de IA.
Herramientas disponibles
search: Recupera información sobre la cuenta de Google Ads.get_resource_metadata: Recupera metadatos sobre un tipo de recurso de la Google Ads API, por ejemplo "campaña". Esto es útil para comprender la estructura de los datos y qué campos están disponibles para consultar.list_accessible_customers: Devuelve los IDs de los clientes directamente accesibles por el usuario que autentica la llamada.
Configuración y Espacios de Nombres de Herramientas
El servidor MCP de Google Ads utiliza el tools_config.yaml para permitirle habilitar o deshabilitar selectivamente herramientas individuales o categorías de herramientas (espacios de nombres) y personalizar sus prefijos de espacio de nombres.
Un tools_config.yaml predeterminado con todas las herramientas habilitadas se incluye en el paquete, por lo que el servidor funciona de inmediato sin configuración adicional. Para personalizar su instalación, el servidor resuelve la configuración en el siguiente orden:
Una ruta explícita establecida mediante la variable de entorno
GOOGLE_ADS_MCP_TOOLS_CONFIG.Un archivo
tools_config.yamlen el directorio de trabajo actual.El
tools_config.yamlpredeterminado incluido en el paquete.
Si falta un archivo de configuración solicitado explícitamente (a través de la variable de entorno) o cualquier archivo resuelto no es válido, el servidor genera un error y no se inicia.
Ejemplo de Configuración:
namespaces:
# Option 1: Enable category 'customers' with default prefix -> "customers_list_accessible_customers"
customers: true
# Option 2: Enable category 'search' with a custom prefix -> "query_search"
search: "query"
# Option 3: Fine-grained control over tools in a category
metadata:
enabled: true
prefix: "metadata"
enabled_tools:
- get_resource_metadata: trueRecursos disponibles
discovery-document: Recupera el documento de descubrimiento de la Google Ads API. Proporciona el documento de descubrimiento para la última versión de la Google Ads API, que describe la superficie de la API, incluidos recursos, métodos y esquemas. Los LLM anfitriones deben acceder a este recurso para comprender la estructura de la Google Ads API y descubrir las funciones disponibles.metrics: Recupera información sobre las métricas disponibles para la generación de informes en la Google Ads API.segments: Recupera información sobre los segmentos disponibles para la generación de informes en la Google Ads API.release-notes: Recupera las notas de la versión de la última versión de la Google Ads API.
Related MCP server: gads
Notas
El servidor MCP expondrá sus datos al Agente o LLM al que se conecte.
Si tiene problemas técnicos, utilice el rastreador de incidencias de GitHub.
Para ayudarnos a recopilar datos de uso, notará que se ha añadido un encabezado adicional a sus llamadas a la API: estos datos se utilizan para mejorar el producto.
Instrucciones de configuración
La configuración implica los siguientes pasos:
Configurar Python.
Configurar el token de desarrollador.
Habilitar las API en su proyecto.
Configurar las credenciales.
Configurar su cliente MCP.
Configurar Python
Configurar el token de desarrollador
Siga las instrucciones para Obtener un token de desarrollador.
Su token de desarrollador debe tener al menos acceso de Explorador para consultar cuentas de producción. Los tokens nuevos pueden actualizarse automáticamente al acceso de Explorador; si no, puede solicitarlo a través del Centro de API. Consulte la documentación de niveles de acceso para obtener más detalles.
Si ve el error "El token de desarrollador solo está aprobado para su uso con cuentas de prueba", su token aún no tiene acceso a cuentas de producción. Consulte la documentación de niveles de acceso para saber cómo solicitar el nivel de acceso que necesita.
Habilitar las API en su proyecto
Siga las instrucciones para habilitar las siguientes API en su proyecto de Google Cloud:
Configurar las credenciales
Opción 1: Usar el proxy OAuth de FastMCP
El servidor admite la función de proxy OAuth de FastMCP para la autenticación dinámica de usuarios. Esto es útil cuando se ejecuta el servidor como un servicio web.
Para habilitarlo, configure las siguientes variables de entorno:
GOOGLE_ADS_MCP_OAUTH_CLIENT_ID: Su ID de cliente OAuth 2.0 de Google Cloud.GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET: Su secreto de cliente OAuth 2.0 de Google Cloud.GOOGLE_ADS_MCP_BASE_URL: (Opcional) La URL base donde el servidor es accesible (por defectohttp://localhost:8080).GOOGLE_ADS_MCP_JWT_SIGNING_KEY: (Opcional) Clave secreta utilizada para firmar tokens JWT de FastMCP en múltiples instancias o implementaciones de servidores.GOOGLE_ADS_MCP_STORAGE_TYPE: (Opcional) Backend de almacenamiento para el estado OAuth (filetree,redis,firestoreomemory).GOOGLE_ADS_MCP_STORAGE_PATH: (Opcional) Ruta de directorio para el almacenamiento persistentefiletree.GOOGLE_ADS_MCP_STORAGE_REDIS_URL: (Opcional) URL de Redis para el almacenamiento persistenteredis.GOOGLE_ADS_MCP_STORAGE_FIRESTORE_PROJECT: (Opcional) Proyecto de Google Cloud para el almacenamiento persistentefirestore. Por defecto, se infiere del proyecto de las Credenciales predeterminadas de la aplicación. Establecerlo selecciona el backendfirestoreincluso siGOOGLE_ADS_MCP_STORAGE_TYPEno está configurado.GOOGLE_ADS_MCP_STORAGE_FIRESTORE_DATABASE: (Opcional) Nombre de la base de datos Firestore para el almacenamiento persistentefirestore. Por defecto es(default).GOOGLE_ADS_MCP_STORAGE_ENCRYPTION_KEY: (Opcional) Clave de cifrado para los tokens OAuth almacenados.GOOGLE_ADS_MCP_STORAGE_DISABLE_ENCRYPTION: (Opcional) Establézcalo entruepara deshabilitar el cifrado de tokens.
Los backends redis y firestore necesitan que su biblioteca de almacenamiento esté instalada junto con el servidor: pip install py-key-value-aio[redis] y pip install google-ads-mcp[firestore] respectivamente.
Una vez habilitado, puede autenticarse en la API a través de su cliente MCP.
Cuando se configuran estas variables, el servidor cambia automáticamente al transporte streamable-http (SSE/HTTP) en lugar de stdio.
Deberá ejecutar el servidor como un proceso separado y configurar su cliente MCP para conectarse al endpoint SSE (por ejemplo, http://localhost:8080/mcp).
Opción 2: Configurar las credenciales con las Application Default Credentials
Configure sus Application Default Credentials (ADC). Asegúrese de que las credenciales correspondan a un usuario con acceso a sus cuentas o propiedades de Google Ads.
Las credenciales deben incluir el alcance de la Google Ads API:
https://www.googleapis.com/auth/adwordsConsulte Manage OAuth Clients para saber cómo crear un cliente OAuth.
Aquí hay algunos comandos de gcloud de ejemplo que pueden resultarle útiles:
Configure ADC con credenciales de usuario y un cliente OAuth de escritorio o web después de descargar el JSON del cliente en
YOUR_CLIENT_JSON_FILE.gcloud auth application-default login \ --scopes https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform \ --client-id-file=YOUR_CLIENT_JSON_FILEConfigure ADC mediante la suplantación de una cuenta de servicio.
gcloud auth application-default login \ --impersonate-service-account=SERVICE_ACCOUNT_EMAIL \ --scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform
Cuando el comando gcloud auth application-default se complete, copie la ubicación del archivo PATH_TO_CREDENTIALS_JSON que se imprime en la consola en el siguiente mensaje. ¡Necesitará esto para un paso posterior!
Credentials saved to file: [PATH_TO_CREDENTIALS_JSON]Opción 3: Configurar las credenciales con la biblioteca cliente de Python de la Google Ads API
Siga las instrucciones para configurar la biblioteca cliente de Python de la Google Ads API.
Si ya ha hecho esto y tiene un archivo google-ads.yaml funcional, ¡puede reutilizar este archivo!
En el archivo utils.py, cambie get_googleads_client() para que use el método load_from_storage().
Configurar su cliente MCP
Agregue el servidor a la configuración de su cliente MCP. A continuación se muestran ejemplos para clientes populares.
Antigravity CLI / Antigravity Code Assist
Instale Antigravity CLI o Antigravity Code Assist.
Configure su servidor. Consulte la documentación en https://antigravity.google/docs/mcp para obtener detalles sobre cómo configurar servidores MCP.
Opción 1: Usar el proxy OAuth de FastMCP (Streamable HTTP)
Puede ejecutar el servidor como un proceso separado y configurar su cliente MCP para conectarse al endpoint SSE (por ejemplo,
http://localhost:8080/mcp). Esto también permite usar la función de proxy OAuth de FastMCP para la autenticación dinámica de usuarios.{ "mcpServers": { "google-ads-mcp": { "httpUrl":"http://localhost:8080/mcp", "env": { "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID", "GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN" } } } }Opción 2: el método de Application Default Credentials
Reemplace
PATH_TO_CREDENTIALS_JSONcon la ruta que copió en el paso anterior.También recomendamos que agregue un atributo
GOOGLE_CLOUD_PROJECTal objetoenv. ReemplaceYOUR_PROJECT_IDen el siguiente ejemplo con el ID del proyecto de su proyecto de Google Cloud.{ "mcpServers": { "google-ads-mcp": { "command": "pipx", "args": [ "run", "--spec", "git+https://github.com/googleads/google-ads-mcp.git", "google-ads-mcp" ], "env": { "GOOGLE_APPLICATION_CREDENTIALS": "PATH_TO_CREDENTIALS_JSON", "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID", "GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN" } } } }Opción 3: el método de la biblioteca cliente de Python
{ "mcpServers": { "google-ads-mcp": { "command": "pipx", "args": [ "run", "--spec", "git+https://github.com/googleads/google-ads-mcp.git", "google-ads-mcp" ], "env": { "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID", "GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN" } } } }
Login Customer Id
Si su acceso a la cuenta de cliente es a través de una cuenta de administrador, deberá agregar el ID de cliente de la cuenta de administrador al archivo de configuración.
Consulte aquí para obtener más detalles.
El archivo final se verá así:
{
"mcpServers": {
"google-ads-mcp": {
"command": "pipx",
"args": [
"run",
"--spec",
"git+https://github.com/googleads/google-ads-mcp.git",
"google-ads-mcp"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "PATH_TO_CREDENTIALS_JSON",
"GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID",
"GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN",
"GOOGLE_ADS_LOGIN_CUSTOMER_ID": "YOUR_MANAGER_CUSTOMER_ID"
}
}
}
}Otros clientes MCP (Claude Code, Cursor, VS Code, etc.)
El formato del bloque mcpServers es el mismo en todos los clientes MCP. Agregue la configuración que se muestra arriba al archivo de configuración correspondiente para su cliente (por ejemplo, ~/.claude/settings.json para Claude Code, .cursor/mcp.json para Cursor, .vscode/mcp.json para VS Code con Copilot).
Implementación en Google Cloud Platform
En lugar de alojar este servidor MCP localmente, puede alojarlo en Google Cloud Run o en cualquier otra infraestructura basada en la nube. Esto es útil si desea compartir el servidor entre diferentes agentes o ejecutarlo como un servicio web.
Tenga en cuenta que esto solo admite la autenticación con un par de ID de cliente OAuth y secreto de cliente a través del proxy OAuth (Opción #1 anterior).
Requisitos previos
Un proyecto de Google Cloud.
La CLI de
gcloudinstalada, autenticada y con el proyecto activo configurado.
gcloud config set project YOUR_PROJECT_IDPaso 1: Crear y enviar la imagen de Docker
Puede usar Cloud Build para crear y enviar la imagen a Artifact Registry sin necesidad de tener Docker instalado localmente.
Cree un repositorio en Artifact Registry:
gcloud artifacts repositories create mcp-servers --repository-format=docker --location=us-central1Cree y envíe la imagen:
gcloud builds submit --tag us-central1-docker.pkg.dev/YOUR_PROJECT_ID/mcp-servers/google-ads-mcp:latest .Reemplace YOUR_PROJECT_ID con el ID de su proyecto de Google Cloud.
Paso 2: Implementar en Google Cloud Run
Asegúrese de configurar las variables de entorno necesarias:
GOOGLE_PROJECT_ID: El ID de tu proyecto de Google Cloud.GOOGLE_ADS_DEVELOPER_TOKEN: El token de desarrollador que quieres que use el servidor MCP (ver más arriba).GOOGLE_ADS_MCP_OAUTH_CLIENT_ID: El ID de cliente OAuth que quieres que use el servidor MCP.GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET: El secreto de cliente OAuth que quieres que use el servidor MCP.GOOGLE_ADS_MCP_BASE_URL: La URL base donde tu servidor MCP es accesible: será asignada automáticamente por Google Cloud Run después de tu primer despliegue. Puedes actualizar las variables de entorno después del despliegue.GOOGLE_ADS_MCP_JWT_SIGNING_KEY: (Recomendado para producción) Clave de firma JWT persistente entre instancias de Cloud Run.GOOGLE_ADS_MCP_STORAGE_TYPE: (Recomendado para producción) Backend de almacenamiento para persistir tokens OAuth entre instancias. Establézcalo enfirestorepara usar Firestore a través de las Credenciales de Aplicación Predeterminadas, lo que no necesita un conector VPC, o enredisjunto conGOOGLE_ADS_MCP_STORAGE_REDIS_URL.Usar
firestorerequiere tres cosas: construir la imagen con el extra instalado (cambiar el Dockerfile auv pip install --system .[firestore]), crear una base de datos Firestore en el proyecto, ya que no se aprovisiona una automáticamente, y otorgar a la cuenta de servicio de Cloud Run el rolroles/datastore.user. Tenga en cuenta que las entradas no caducan automáticamente: el almacén filtra las entradas caducadas al leer pero nunca las elimina, yexpires_atse escribe como una cadena, por lo que una política TTL de Firestore tampoco puede recogerlas. Planifique un trabajo de limpieza periódica para despliegues de larga duración. Redis caduca las entradas por sí mismo.FASTMCP_HOST: Establezca esto en0.0.0.0para permitir que FastMCP acepte conexiones de todas las direcciones IP.
gcloud run deploy google-ads-mcp \
--image us-central1-docker.pkg.dev/YOUR_PROJECT_ID/mcp-servers/google-ads-mcp:latest \
--platform managed \
--region us-central1 \
--allow-unauthenticated \
--set-env-vars="GOOGLE_PROJECT_ID=YOUR_PROJECT_ID,GOOGLE_ADS_DEVELOPER_TOKEN=YOUR_DEVELOPER_TOKEN,GOOGLE_ADS_MCP_OAUTH_CLIENT_ID=YOUR_CLIENT_ID,GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET=YOUR_CLIENT_SECRET,GOOGLE_ADS_MCP_BASE_URL=YOUR_BASE_URL,GOOGLE_ADS_MCP_JWT_SIGNING_KEY=YOUR_JWT_SIGNING_KEY,GOOGLE_ADS_MCP_STORAGE_TYPE=firestore,FASTMCP_HOST=0.0.0.0"Paso 3: Configurar el Cliente MCP
Una vez desplegado, actualice la configuración de su cliente MCP (consulte la documentación en https://antigravity.google/docs/mcp) para usar la URL de Cloud Run.
{
"mcpServers": {
"google-ads-mcp": {
"httpUrl": "https://your-cloud-run-url.a.run.app/mcp"
}
}
}Pruébelo
Inicie su cliente MCP. Debería ver google-ads-mcp listado en los
servidores disponibles.
Aquí hay algunos ejemplos de indicaciones para empezar:
Pregunte qué puede hacer el servidor:
what can the ads-mcp server do?Pregunte sobre clientes:
what customers do I have access to?Pregunte sobre campañas
How many active campaigns do I have?How is my campaign performance this week?
Nota sobre el ID de Cliente
Su agente necesitará y solicitará un ID de cliente para la mayoría de las indicaciones. Si se está moviendo entre múltiples clientes, incluir el ID de cliente en la indicación puede ser más simple.
How many active campaigns do I have for customer id 1234567890Contribuir
¡Las contribuciones son bienvenidas! Consulte la Guía de Contribución.
Available Tools
3 toolscustomers_list_accessible_customersCustomers List Accessible CustomersARead-only
Returns ids of customers directly accessible by the user authenticating the call.
Use this tool first to discover available customer IDs if the user hasn't provided one. Most other tools require a valid customer ID as input.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered by structured data. The description still adds genuine behavioral context by clarifying that results are scoped to the authenticated caller's direct access, which matters for interpreting the returned IDs. It says nothing about pagination or result ordering, so it is not exhaustive.
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, no filler, and the primary guidance ('use this tool first') is front-loaded in the second sentence before the reason. Every sentence earns its place.
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 discovery tool with an output schema already covering the return shape, the description supplies everything needed: what it returns, its auth scope, and its role as the entry point before other customer-ID-dependent tools. Nothing required for correct invocation is 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?
The tool takes zero parameters, which is the baseline-4 case; there is no parameter behavior left to explain. The description correctly implies the call is fully parameterless and derived from the caller's auth context.
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 (returns IDs of accessible customers) and adds the scoping constraint that access is limited to the authenticating user. It does not explicitly name or contrast the siblings (metadata_get_resource_metadata, search_search), 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?
It states exactly when to reach for this tool: 'Use this tool first to discover available customer IDs if the user hasn't provided one,' plus the rationale that most other tools need a valid customer ID. The sequencing and trigger condition are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metadata_get_resource_metadataMetadata Get Resource MetadataARead-only
Retrieves the selectable, filterable, and sortable fields for a specific Google Ads resource, including compatible metrics and segments.
Use this tool to find out which fields you can select, filter by, or sort by when querying a specific resource (e.g., 'campaign', 'ad_group'). This tool also returns metrics and segments that can be selected with the resource. Their names start with 'metrics.' and 'segments.' respectively.
Do not guess fields, you MUST use this tool to discover them before constructing a query for the
search tool.
The responses of this tool should be cached, as they don't change frequently.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_name | Yes | The name of the Google Ads resource (e.g., 'campaign', 'ad_group'). | |
| login_customer_id | No | Optional manager customer ID to use as the login-customer-id header. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already covers the safety profile, and the description complements it by disclosing the response contents (fields, metrics, segments) and the naming convention for metrics/segments. It also adds an operational trait: 'responses ... should be cached, as they don't change frequently'. No contradiction with annotations.
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 front-loaded with the core purpose and adds concise, actionable guidance. There is minor redundancy: the first sentence says 'including compatible metrics and segments' and the third sentence repeats that metrics and segments can be selected. Still, it is well-structured and every section adds value.
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 metadata-lookup tool with an output schema and readOnlyHint annotation, the description covers everything an agent needs: what the tool returns, naming conventions, mandatory usage before querying, and caching guidance. No significant gaps remain for correct 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?
The input schema already describes both parameters comprehensively (100% coverage), so the description need not repeat them. It adds a small amount of extra context with examples like 'campaign', 'ad_group', but this does not significantly exceed what the schema provides. Baseline 3 is appropriate.
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 ('Retrieves') and names a clear resource: the selectable, filterable, and sortable fields for a Google Ads resource, including metrics and segments. This clearly distinguishes the tool from the siblings: search_search executes queries, while this tool provides metadata for building them.
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 explicitly states when to use the tool: before constructing a query for the `search` tool, and it warns 'Do not guess fields, you MUST use this tool to discover them'. This gives the agent an unambiguous directive and contextual placement relative to the sibling search tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_searchSearch SearchCRead-only
Fetches data from the Google Ads API using the search method
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | The maximum number of rows to return | |
| fields | Yes | The fields to fetch | |
| resource | Yes | The resource to return fields from | |
| orderings | No | How the data is ordered | |
| conditions | No | List of conditions to filter the data, combined using AND clauses | |
| customer_id | Yes | The id of the customer | |
| login_customer_id | No | Optional manager customer ID to use as the login-customer-id header. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is readOnlyHint=true, which already tells the agent this is a safe read operation. The description adds no additional behavioral context—nothing about pagination, limits, error handling, or response format. It fails to enrich the annotation-provided information.
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 only one sentence and is technically concise, but it is under-specified to the point of being nearly useless. It does not front-load critical information or structure the content in a way that helps an agent understand the tool's scope. The brevity is a deficiency, not a virtue.
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?
This is a 7-parameter tool with 3 required parameters, yet the description provides no context about what the tool actually accomplishes beyond a generic 'search'. It lacks any explanation of the query syntax, the relationship between fields and resource, or expected output. Given the complexity, the description is grossly 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 coverage is 100%, meaning all parameters have descriptions in the schema. The description adds no extra meaning beyond what the schema already provides, so the baseline of 3 applies. It does not compensate with any additional clarifications about parameter relationships or formatting.
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 verb ('Fetches data') and a resource ('Google Ads API') but is extremely vague about what kind of data or which resources are searchable. It does not differentiate from sibling tools like metadata_get_resource_metadata or customers_list_accessible_customers, making it unclear when this tool is the right choice.
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 the siblings. No mention of alternatives, exclusions, or prerequisites. An agent has to infer that this is a general search tool, but the description gives no contextual hints about when it should be preferred.
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.
2 tool updates
v0.0.4- Changed
metadata_get_resource_metadata1 field changed- added
Input schema / properties / login_customer_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional manager customer ID to use as the login-customer-id header." +}
- Changed
search_search1 field changed- added
Input schema / properties / login_customer_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional manager customer ID to use as the login-customer-id header." +}
3 tool updates
v0.0.3- First observed
customers_list_accessible_customers - First observed
metadata_get_resource_metadata - First observed
search_search
TDQS
Scored across 3 tools
The three tools have clearly distinct purposes: discovering customer IDs, retrieving resource metadata, and executing queries. There is no overlap, though the generic name 'search_search' is slightly vague.
All names use snake_case, but the pattern is inconsistent: 'customers_list_accessible_customers' and 'metadata_get_resource_metadata' include a resource prefix and redundant object, while 'search_search' repeats the verb and omits any prefix.
Three tools is quite thin for the vast Google Ads API, but the search tool is broad enough to cover many query use cases. It's borderline under-scoped for the domain.
The surface is read-only and lacks any mutation, creation, or deletion operations, plus no customer detail retrieval beyond listing IDs. These are significant gaps for a general Google Ads server.
Maintenance
Related MCP Connectors
Google Ads MCP server — manage campaigns, keywords, and metrics.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Hosted Google Ads MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Meta Ads and Google Ads MCP server: 250+ tools for Claude, ChatGPT, Cursor and Codex.
Related MCP Servers
- AlicenseAqualityFmaintenanceA read-write MCP server for managing Google Ads campaigns, ad groups, keywords, and ads via natural language.122-
- FlicenseNot gradedqualityDmaintenanceA Google Ads API MCP server that enables searching and listing accessible customers via natural language queries.2-
- AlicenseNot gradedqualityCmaintenanceMCP server for managing Google Ads campaigns through the official Google Ads API, covering accounts, campaigns, budgets, keywords, search terms, and keyword ideas. It provides tools for both reading and mutating live ads data, such as pausing campaigns, updating budgets, and adding keywords.MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for Google Ads API that enables LLMs to search and query Google Ads accounts, retrieve resource metadata, and generate keyword ideas.Apache 2.0