google-ads-mcp
OfficialGoogle Ads MCP サーバー
このリポジトリには、Google Ads API と連携する MCP サーバーのソースコードが含まれています。
ツール
このサーバーは Google Ads API を使用して、LLM や AI エージェントと連携するためのいくつかの ツール と リソース を提供します。
利用可能なツール
search: Google Ads アカウントに関する情報を取得します。get_resource_metadata: Google Ads API リソースタイプ(例: "campaign")に関するメタデータを取得します。これは、データの構造や、クエリ可能なフィールドを把握するのに役立ちます。list_accessible_customers: 呼び出しを認証しているユーザーが直接アクセスできる顧客の ID を返します。
ツールの設定と名前空間
Google Ads MCP サーバーは、tools_config.yaml を使用して、個々のツールやツールカテゴリ(名前空間)を選択的に有効化/無効化したり、それらの名前空間プレフィックスをカスタマイズしたりできます。
すべてのツールが有効化されたデフォルトの tools_config.yaml がパッケージにバンドルされているため、特別な設定をしなくてもサーバーはすぐに使用できます。インストールをカスタマイズする場合、サーバーは以下の順序で設定を解決します。
GOOGLE_ADS_MCP_TOOLS_CONFIG環境変数を介して設定された明示的なパス。カレントワーキングディレクトリにある
tools_config.yamlファイル。パッケージにバンドルされているデフォルトの
tools_config.yaml。
明示的に要求された設定ファイル(環境変数経由)が見つからない場合、または解決されたファイルが無効な場合、サーバーはエラーを発生させて起動に失敗します。
設定例:
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: true利用可能なリソース
discovery-document: Google Ads API のディスカバリドキュメントを取得します。Google Ads API の最新バージョンのディスカバリドキュメントを提供します。これには、リソース、メソッド、スキーマを含む API サーフェスが記述されています。ホスト LLM はこのリソースにアクセスして、Google Ads API の構造を理解し、利用可能な機能を発見する必要があります。metrics: Google Ads API でのレポートに利用可能な指標に関する情報を取得します。segments: Google Ads API でのレポートに利用可能なセグメントに関する情報を取得します。release-notes: Google Ads API の最新バージョンのリリースノートを取得します。
Related MCP server: gads
注意事項
MCP サーバーは、接続先のエージェントまたは LLM にデータを公開します。
技術的な問題がある場合は、GitHub 課題トラッカー をご利用ください。
使用状況データの収集を支援するため、API 呼び出しに追加のヘッダーが追加されている場合があります。このデータは製品の改善に使用されます。
セットアップ手順
セットアップには以下の手順が必要です。
Python を構成する。
デベロッパートークンを構成する。
プロジェクトで API を有効にする。
認証情報を構成する。
MCP クライアントを構成する。
Python の構成
pipx をインストール します。
デベロッパートークンの構成
デベロッパートークンの取得 手順に従います。
デベロッパートークンは、本番アカウントをクエリするには、少なくとも Explorer アクセス権 が必要です。新しいトークンは自動的に Explorer アクセス権にアップグレードされる場合があります。そうでない場合は、API センターから申請できます。詳細については、アクセスレベルに関するドキュメント を参照してください。
「デベロッパートークンはテストアカウントでの使用のみが承認されています」 というエラーが表示される場合、トークンがまだ本番アカウントへのアクセス権を持っていません。必要なアクセスレベルをリクエストする方法については、アクセスレベルに関するドキュメント を参照してください。
プロジェクトで API を有効にする
Google Cloud プロジェクトで以下の API を有効にするには、手順に従って ください。
認証情報の構成
オプション 1: FastMCP OAuth プロキシの使用
サーバーは、動的なユーザー認証のために FastMCP の OAuth プロキシ 機能をサポートしています。これは、サーバーをウェブサービスとして実行する場合に便利です。
有効にするには、以下の環境変数を設定します。
GOOGLE_ADS_MCP_OAUTH_CLIENT_ID: Google Cloud OAuth 2.0 クライアント ID。GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET: Google Cloud OAuth 2.0 クライアントシークレット。GOOGLE_ADS_MCP_BASE_URL: (オプション) サーバーにアクセス可能なベース URL(デフォルトはhttp://localhost:8080)。GOOGLE_ADS_MCP_JWT_SIGNING_KEY: (オプション) 複数のサーバーインスタンスまたはデプロイメント間で FastMCP JWT トークンに署名するために使用される秘密鍵。GOOGLE_ADS_MCP_STORAGE_TYPE: (オプション) OAuth 状態のストレージバックエンド(filetree、redis、firestore、またはmemory)。GOOGLE_ADS_MCP_STORAGE_PATH: (オプション)filetree永続ストレージのディレクトリパス。GOOGLE_ADS_MCP_STORAGE_REDIS_URL: (オプション)redis永続ストレージの Redis URL。GOOGLE_ADS_MCP_STORAGE_FIRESTORE_PROJECT: (オプション)firestore永続ストレージの Google Cloud プロジェクト。デフォルトは、アプリケーションデフォルト認証情報から推測されるプロジェクトになります。設定すると、GOOGLE_ADS_MCP_STORAGE_TYPEが設定されていなくてもfirestoreバックエンドが選択されます。GOOGLE_ADS_MCP_STORAGE_FIRESTORE_DATABASE: (オプション)firestore永続ストレージの Firestore データベース名。デフォルトは(default)です。GOOGLE_ADS_MCP_STORAGE_ENCRYPTION_KEY: (オプション) 保存された OAuth トークンの暗号化キー。GOOGLE_ADS_MCP_STORAGE_DISABLE_ENCRYPTION: (オプション)trueに設定すると、トークンの暗号化を無効にします。
redis および firestore バックエンドを使用するには、ストレージライブラリをサーバーと一緒にインストールする必要があります: それぞれ pip install py-key-value-aio[redis] および pip install google-ads-mcp[firestore] を実行します。
これが有効になると、MCP クライアントを介して API に認証できるようになります。
これらの変数が設定されると、サーバーは自動的に streamable-http トランスポート(SSE/HTTP)に切り替わり、stdio は使用されなくなります。
サーバーを別のプロセスとして実行し、MCP クライアントが SSE エンドポイント(例: http://localhost:8080/mcp)に接続するように設定する必要があります。
オプション 2: アプリケーションデフォルト認証情報を使用した認証情報の構成
アプリケーションデフォルト認証情報 (ADC) を構成します。認証情報が、Google Ads アカウントまたはプロパティにアクセスできるユーザーのものであることを確認してください。
認証情報には、Google Ads API スコープが含まれている必要があります:
https://www.googleapis.com/auth/adwordsOAuth クライアントの作成方法については、OAuth クライアントの管理 を参照してください。
役立つ可能性のある gcloud コマンドのサンプルをいくつか示します。
ユーザー認証情報と OAuth デスクトップまたはウェブクライアントを使用して ADC を設定します(クライアント JSON を
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_FILEサービスアカウントの権限借用を使用して ADC を設定します。
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
gcloud auth application-default コマンドが完了したら、コンソールに出力された次のメッセージ内の PATH_TO_CREDENTIALS_JSON ファイルの場所をコピーします。これは後の手順で必要になります。
Credentials saved to file: [PATH_TO_CREDENTIALS_JSON]オプション 3: Google Ads API Python クライアントライブラリを使用した認証情報の構成
手順に従って Google Ads API Python クライアントライブラリをセットアップおよび構成します。
すでにこれを行っていて、動作する google-ads.yaml がある場合は、このファイルを再利用できます。
utils.py ファイルで、get_googleads_client() を load_from_storage() メソッドを使用するように変更します。
MCP クライアントの構成
サーバーを MCP クライアントの構成に追加します。以下は、一般的なクライアントの例です。
Antigravity CLI / Antigravity Code Assist
Antigravity CLI または Antigravity Code Assist をインストールします。
サーバーを構成します。MCP サーバーのセットアップの詳細については、https://antigravity.google/docs/mcp のドキュメントを参照してください。
オプション 1: FastMCP OAuth プロキシの使用(Streamable HTTP)
サーバーを別のプロセスとして実行し、MCP クライアントが SSE エンドポイント(例:
http://localhost:8080/mcp)に接続するように設定できます。これにより、動的なユーザー認証に FastMCP の OAuth プロキシ 機能を使用することもできます。{ "mcpServers": { "google-ads-mcp": { "httpUrl":"http://localhost:8080/mcp", "env": { "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID", "GOOGLE_ADS_DEVELOPER_TOKEN": "YOUR_DEVELOPER_TOKEN" } } } }オプション 2: アプリケーションデフォルト認証情報方式
PATH_TO_CREDENTIALS_JSONを、前の手順でコピーしたパスに置き換えます。また、
envオブジェクトにGOOGLE_CLOUD_PROJECT属性を追加することをお勧めします。次の例のYOUR_PROJECT_IDを、Google Cloud プロジェクトの プロジェクト ID に置き換えます。{ "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" } } } }オプション 3: 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" } } } }
ログイン顧客 ID
マネージャーアカウントを介して顧客アカウントにアクセスする場合は、設定ファイルにマネージャーアカウントの顧客 ID を追加する必要があります。
詳細については、こちら を参照してください。
最終的なファイルは次のようになります:
{
"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"
}
}
}
}その他の MCP クライアント(Claude Code、Cursor、VS Code など)
mcpServers ブロックの形式は、すべての MCP クライアントで同じです。上記の構成を、お使いのクライアントの適切な設定ファイルに追加してください(例: Claude Code の場合は ~/.claude/settings.json、Cursor の場合は .cursor/mcp.json、Copilot を使用する VS Code の場合は .vscode/mcp.json)。
Google Cloud Platform へのデプロイ
この MCP サーバーをローカルでホストする代わりに、Google Cloud Run または他のクラウドベースのインフラストラクチャでホストすることもできます。これは、サーバーを複数のエージェント間で共有したり、ウェブサービスとして実行したりする場合に便利です。
これは、OAuth プロキシ(上記のオプション #1)を介した OAuth クライアント ID とクライアントシークレットのペアによる認証のみをサポートすることに注意してください。
前提条件
Google Cloud プロジェクト。
gcloudCLI がインストールされ、認証され、アクティブなプロジェクトが設定されていること。gcloud config set project YOUR_PROJECT_ID
ステップ 1: Docker イメージのビルドとプッシュ
Cloud Build を使用すると、Docker をローカルにインストールしなくても、イメージをビルドして Artifact Registry にプッシュできます。
Artifact Registry にリポジトリを作成します:
gcloud artifacts repositories create mcp-servers --repository-format=docker --location=us-central1イメージをビルドして送信します:
gcloud builds submit --tag us-central1-docker.pkg.dev/YOUR_PROJECT_ID/mcp-servers/google-ads-mcp:latest .YOUR_PROJECT_IDを Google Cloud プロジェクト ID に置き換えます。
ステップ 2: Google Cloud Run へのデプロイ
必要な環境変数を必ず設定してください:
GOOGLE_PROJECT_ID: Google Cloud プロジェクト ID。GOOGLE_ADS_DEVELOPER_TOKEN: MCP サーバーが使用するデベロッパートークン(上記参照)。GOOGLE_ADS_MCP_OAUTH_CLIENT_ID: MCP サーバーが使用する OAuth クライアント ID。GOOGLE_ADS_MCP_OAUTH_CLIENT_SECRET: MCP サーバーが使用する OAuth クライアントシークレット。GOOGLE_ADS_MCP_BASE_URL: MCP サーバーにアクセス可能なベース URL。初回デプロイ後に Google Cloud Run によって自動的に割り当てられます。デプロイ後に環境変数を更新できます。GOOGLE_ADS_MCP_JWT_SIGNING_KEY: (本番環境推奨)Cloud Run インスタンス間で永続化する JWT 署名キー。GOOGLE_ADS_MCP_STORAGE_TYPE: (本番環境推奨)インスタンス間で OAuth トークンを永続化するストレージバックエンド。firestoreに設定してアプリケーションデフォルト認証情報で Firestore を使用します(VPC コネクタは不要)。redisに設定し、GOOGLE_ADS_MCP_STORAGE_REDIS_URLと併用することもできます。firestoreを使用するには、3 つの条件を満たす必要があります。1. 追加パッケージをインストールしてイメージをビルドする(Dockerfile をuv pip install --system .[firestore]に変更)。2. プロジェクトに Firestore データベースを作成する(自動プロビジョニングはされません)。3. Cloud Run サービスアカウントにroles/datastore.userロールを付与する。なお、エントリは自動的に期限切れになりません。ストレージは読み取り時に期限切れエントリをフィルタリングしますが、削除は行わず、expires_atは文字列として書き込まれるため、Firestore の TTL ポリシーでも収集できません。長期運用のデプロイでは、定期的なクリーンアップジョブを計画してください。Redis はエントリを自動的に期限切れにします。FASTMCP_HOST:0.0.0.0に設定すると、FastMCP がすべての 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"ステップ 3: MCP クライアントを構成する
デプロイ後、https://antigravity.google/docs/mcp のドキュメントを参照して MCP クライアント構成を更新し、Cloud Run URL を使用します。
{
"mcpServers": {
"google-ads-mcp": {
"httpUrl": "https://your-cloud-run-url.a.run.app/mcp"
}
}
}試してみる
MCP クライアントを起動します。利用可能なサーバー一覧に google-ads-mcp が表示されるはずです。
以下のサンプルプロンプトから始めてみてください:
サーバーでできることを尋ねる:
what can the ads-mcp server do?顧客について尋ねる:
what customers do I have access to?キャンペーンについて尋ねる:
How many active campaigns do I have?How is my campaign performance this week?
顧客 ID に関する注意
エージェントは、ほとんどのプロンプトで顧客 ID を必要とします。複数の顧客間を行き来する場合は、プロンプトに顧客 ID を含めると簡単です。
How many active campaigns do I have for customer id 1234567890貢献
貢献大歓迎です!貢献ガイド をご覧ください。
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