Skip to main content
Glama
lucagalvani

google-ads-agent

by lucagalvani

apply_proposal

Apply an approved proposal to Google Ads, executing the exact change a human has explicitly authorized. Rejects unattended runs to ensure human oversight.

Instructions

Execute a previously recorded proposal from the generic mutate tool — the exact call a human is now explicitly approving, rather than the agent re-deciding on its own to act on a propose-only finding. Refused when this run is unattended (ADS_AGENT_UNATTENDED=1): applying a proposal is precisely the human step the propose tier exists to require, and a scheduled run must not be able to supply that itself. Re-reads current field values before writing, the same as mutate().

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dry_runNo
proposal_idYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.4/5.0
Behavior5/5

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

The annotations only declare readOnlyHint=false and destructiveHint=false, but the description adds substantial behavioral disclosure: the tool is refused in unattended runs, it re-reads current field values before writing (same as mutate), and it executes the precise call a human approved rather than an agent reinterpretation. It also names the exact environment variable governing the refusal. This goes well beyond the annotations without contradicting them.

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

Conciseness5/5

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

Three sentences, each carrying distinct value: purpose, refusal condition, and read-before-write behavior. It is front-loaded with the core action and contains zero filler or repetition of schema/annotation content.

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

Completeness4/5

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

With an output schema present, return values need no explanation, and the description covers purpose, usage boundaries, a critical refusal path, and a concurrency-relevant behavior. The main gap is dry_run semantics and what happens on failure (e.g., already-applied or invalid proposal). For a two-parameter tool this is close to complete.

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 description coverage is 0%, so the description must carry the parameter meaning. It gives proposal_id meaningful context (a proposal previously recorded by mutate — the exact call being approved), but says nothing about dry_run, whose behavior and purpose are entirely unexplained. Partial compensation for a required parameter, but a complete gap for the optional one.

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?

States a specific verb and resource: "Execute a previously recorded proposal from the generic mutate tool." It distinguishes itself from the generic mutate tool, list_proposals, and dismiss_proposal by framing apply_proposal as the exact human-approved action rather than an agent re-decision. The first sentence alone fully differentiates this tool from its siblings.

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

Usage Guidelines4/5

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

Provides explicit when-to-use context: apply a proposal only when a human is explicitly approving it, not when the agent is autonomously deciding to act on a propose-only finding. It also gives a concrete when-not condition with an environment variable check (ADS_AGENT_UNATTENDED=1). It does not name sibling alternatives like dismiss_proposal for the rejection case, which keeps it just short of a 5.

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