Skip to main content
Glama
ZLeventer

google-ads-mcp

gads_list_assets

List all Google Ads account-level assets such as sitelinks, callouts, structured snippets, images, and call extensions. Filter by asset type to review or manage specific asset categories.

Instructions

List account-level assets: sitelinks, callouts, structured snippets, images, call extensions, and more. Filter by asset type.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
customer_idNoOverride GOOGLE_ADS_CUSTOMER_ID for this call
asset_typeNoFilter by asset type: SITELINK, CALLOUT, STRUCTURED_SNIPPET, IMAGE, CALL, etc.
limitNo

Implementation Reference

  • src/index.ts:151-156 (registration)
    Registration of the 'gads_list_assets' tool on the MCP server with description, schema, and handler.
    server.tool(
      "gads_list_assets",
      "List account-level assets: sitelinks, callouts, structured snippets, images, call extensions, and more. Filter by asset type.",
      listAssetsSchema,
      async (args) => { try { return ok(await listAssets(args)); } catch (e) { return err(e); } }
    );
  • Input schema for listAssets: optional customer_id, asset_type filter, and limit (default 100, max 10000).
    export const listAssetsSchema = {
      customer_id: z.string().optional().describe("Override GOOGLE_ADS_CUSTOMER_ID for this call"),
      asset_type: z.string().optional().describe("Filter by asset type: SITELINK, CALLOUT, STRUCTURED_SNIPPET, IMAGE, CALL, etc."),
      limit: z.number().int().positive().max(10000).default(100),
    };
  • Handler function that queries Google Ads API for account-level assets (sitelinks, callouts, images, etc.) with optional type filter.
    export async function listAssets(args: z.infer<z.ZodObject<typeof listAssetsSchema>>) {
      const customer = getCustomer(args.customer_id);
      const typeClause = args.asset_type ? `WHERE asset.type = '${args.asset_type}'` : "";
      const rows = await customer.query(`
        SELECT
          asset.id,
          asset.name,
          asset.type,
          asset.final_urls,
          asset.sitelink_asset.link_text,
          asset.sitelink_asset.description1,
          asset.sitelink_asset.description2,
          asset.callout_asset.callout_text,
          asset.structured_snippet_asset.header,
          asset.structured_snippet_asset.values,
          asset.image_asset.full_size.url,
          asset.policy_summary.approval_status
        FROM asset
        ${typeClause}
        ORDER BY asset.name
        LIMIT ${args.limit}
      `);
      return { rowCount: rows.length, rows };
    }
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It only says the tool lists assets and can filter by type, but omits details like pagination behavior, return format, data freshness, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, clear sentence. It front-loads the verb and resource. Could be slightly longer to include usage guidance without being wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and sibling tools like gads_campaign_assets, the description provides the basic purpose but lacks supplementary info like default behavior when no filter is applied or expected output structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (all three parameters have descriptions), so the description adds little beyond the schema. It mentions filtering by asset type, but that is already in the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists account-level assets, provides examples (sitelinks, callouts, etc.), and the 'account-level' distinction sets it apart from the sibling gads_campaign_assets, which presumably deals with campaign-level assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for account-level assets, which implicitly differentiates from campaign-level tools, but it does not explicitly state when to use this tool over alternatives or provide exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ZLeventer/google-ads-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server