Growomat
Server Details
Build, edit and sync Google, Microsoft, Reddit and Meta ad campaigns from your assistant.
- Status
- Healthy
- Uptime
- 100.0% over 74 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 112 tools
Most tools have a genuinely distinct purpose and the descriptions are rich enough to steer selection, but several clusters overlap in ways that will cause misfires: create_asset vs upload_asset vs start_asset_upload/complete_asset_upload all produce assets, and get_conversion_status vs get_conversion_health vs get_conversion_report, plus the six get_competitor_* variants, require careful reading to choose between. get_own_ad_reading vs get_angle_gap vs get_angle_readout are also hard to separate without domain knowledge.
Names follow a strict verb_noun snake_case pattern throughout (list_campaigns, get_ad_group, update_keyword, delete_concept, attach_asset_to_ad), with a small, coherent set of verbs (list/get/create/update/delete/set/upload/preview/validate/trigger). No camelCase or style mixing anywhere in 112 tools.
112 tools is far beyond a usable surface, even allowing for a broad domain spanning campaigns, ads, assets, competitors, conversions, angles, budgets and syncs. Many tools are narrow (get_ad_asset, get_campaign_asset, get_brake_status) and could be folded into fewer parameterized tools or grouped into sub-servers, forcing an agent to navigate an oversized catalog on every turn.
Coverage is exceptional: full CRUD across campaigns, ad groups, ads, keywords, assets, businesses, angles, concepts, and conversion actions, plus lifecycle operations (confirm, sync, preview, validate, unlink), reporting, budget/brake control and competitor intelligence. Minor gaps remain, notably no update/delete for conversion sources (only create/list) and no equivalent for uploads like auction insights.
Available Tools
112 toolsaccount_summaryAccount summaryARead-onlyInspect
Return a single JSON document summarising the account: token info (including token.scheduling.timezones — the per-platform account timezone that ad schedules are interpreted in), visible Spaces, campaign list, per-resource counts, 30-day stats, and the most recent sync (last_sync) so you can tell whether the campaigns are actually live. Backed by parallel SDK calls — the cheapest way to ask 'what's going on with my account?' before deciding what else to do. The counts, campaigns/stats, and last_sync branches are Space-scoped; pass space_id to summarise a non-active Space without changing the session binding. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that it is backed by parallel SDK calls, clarifies the meaning of token.scheduling.timezones, and explains how last_sync indicates whether campaigns are live. It also states the Space-scoping behavior and the override semantics, adding significant context.
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, followed by details on output components and Space scoping. It is somewhat longer than strictly necessary, but each sentence adds essential context, so it remains efficient and well-structured.
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?
Given no output schema, the description enumerates the key sections of the returned document (token info, Spaces, campaigns, counts, stats, last_sync) and explains the scoping behavior. This makes it sufficiently complete for understanding the tool's output and usage without needing external references.
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 single parameter space_id is already fully described in the schema with 100% coverage, including its purpose, default behavior, and effect on session binding. The tool description reinforces this but does not add new meaning beyond the schema, so the 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 clearly states the tool returns a single JSON account summary with specific components (token info, Spaces, campaigns, counts, stats, last_sync). It gives the tool a distinct purpose among siblings, emphasizing it as the cheapest way to get an account overview.
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?
Explicitly recommends using this before deciding what else to do, framing it as a discovery/overview tool. It also provides clear guidance on Space scoping: how to switch via set_active_space or override with space_id, and notes that branches are Space-scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attach_asset_to_adAttach asset to adAInspect
Attach an existing asset to an ad (scope=AD, adId required) or an ad group (scope=AD_GROUP, adGroupId required) with a role (MARKETING_IMAGE, SQUARE_MARKETING_IMAGE, LOGO, LANDSCAPE_LOGO, PORTRAIT_MARKETING_IMAGE, YOUTUBE_VIDEO, VIDEO). This is the scope that actually serves images/video on Display, Performance Max and Video campaigns, and it puts the image on a single-image card (a chat card) that has none of its own. campaignId is derived from the ad/ad group when omitted. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AdAssetCreate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint=false and destructiveHint=false; the description adds real behavioral context — it creates or updates an asset link, returns the full created/updated object, derives campaignId, and is bounded by the active Space. The aside about single-image cards is opaque, and it doesn't warn whether an existing asset on the same slot is replaced.
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?
Front-loaded with the action and the two scope branches, then supporting detail; no filler sentences. The clause about single-image cards is the one piece that is hard to parse and could be trimmed.
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?
No output schema exists, and the description covers the return value ('full updated/created object'), the conditional parameter rules, and the Space scoping escape hatch. An agent has everything needed to call this correctly.
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%, but the description still adds information the schema cannot express: the conditional requirement of adId vs adGroupId keyed to scope, and the fact that campaignId is optional because it is derived. That is genuine semantic value beyond the structured fields.
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?
Specific verb (attach) plus resource (asset to ad/ad group), and it explicitly enumerates the two supported scopes with their required IDs. It also contrasts itself implicitly with the campaign-level sibling by stating this is the scope that actually serves images/video on Display, Performance Max and Video.
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?
Clear conditional guidance: scope=AD requires adId, scope=AD_GROUP requires adGroupId, and campaignId is derived when omitted. It also directs the agent to set_active_space or space_id for cross-Space writes. It never explicitly says when to prefer attach_asset_to_campaign instead, so it falls short of the 5 bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attach_asset_to_campaignAttach asset to campaignAInspect
Attach an existing asset to a campaign with a role (e.g. MARKETING_IMAGE, LOGO). Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the CampaignAssetCreate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, so the write nature is implied but the description adds that it returns the full updated/created object and describes Space scoping behavior. This goes beyond the annotations by clarifying the return value and override option.
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 succinct sentences cover the action, role examples, return value, and Space scoping, with zero redundancy. Every clause provides useful information.
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?
Given no output schema, the description compensates by stating the return type ('full updated/created object'). Space scoping is clearly explained. Nested objects are acknowledged with a pointer to the OpenAPI spec, which is acceptable since the most important behavioral and scoping details are covered.
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 schema provides enum values for role and a pattern for space_id, but the description enhances understanding by giving concrete role examples and explaining that space_id overrides the active Space for one call. The body schema says to see OpenAPI spec for nested shapes, which is reasonable since the core fields are already named.
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 ('attach') with a clear resource ('asset to a campaign') and adds role examples (MARKETING_IMAGE, LOGO). It differentiates from siblings like attach_asset_to_ad and detach_asset_from_campaign via the explicit 'campaign' scope.
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 states the tool is scoped to the active Space and directs users to set_active_space or pass space_id to override, providing clear context for when to use this versus other space-related tools. It doesn't explicitly mention alternatives like attach_asset_to_ad, but the naming makes the campaign vs ad distinction obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_syncCancel syncAInspect
Request cancellation of a running sync. Takes effect at the next campaign boundary; campaigns already pushed are not rolled back. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| sync_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false and destructiveHint=false, which already signal mutation and potential impact. The description adds valuable behavioral context: cancellation is not immediate (next campaign boundary), already-pushed campaigns are not rolled back, and it's scoped to the active Space. This goes beyond annotations but could mention what happens to the sync status or if cancellation can fail, so a 4 is appropriate.
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 sentences, front-loaded with the primary action, followed by critical behavioral notes and scoping clarification. Every sentence earns its place—no filler or redundancy.
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?
Given the tool's complexity (mutation with scoping behavior), the description covers the key aspects: how cancellation works, what it does not do (rollback), and how Space scoping is handled. It lacks an explicit return value description, but there is no output schema and the sync status can be verified via get_sync_status, so the description is largely complete. A 4 rather than 5 because it doesn't mention prerequisites like having a sync actively running or any error conditions.
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 50%: sync_id has no description in the schema, but the description clarifies that it targets a running sync. space_id has a detailed schema description, and the tool description reinforces how it overrides the active Space. The description adds meaning for sync_id beyond the schema, so it compensates for the coverage gap.
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 clearly states the verb ('Request cancellation') and resource ('a running sync'), and distinguishes this from sibling tools like trigger_sync and get_sync_status. It also specifies the cancellation is scoped to the active Space, which differentiates it from other sync-related operations.
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 explains when to use this tool versus alternatives: it mentions canceling a running sync, that it takes effect at the next campaign boundary, and that it's scoped to the active Space with a note to use set_active_space to switch or pass space_id to override. This provides clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_competitor_similarityCheck copy against competitorsARead-onlyInspect
Run the similarity check every ad save runs: is this copy too close to a tracked competitor's ad, or does it name one? Use before creating or updating ads to avoid a 409 COMPETITOR_SIMILARITY. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the SimilarityCheck schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
annotations only carry readOnlyHint=true, so the description does the heavy lifting: it reveals that this mirrors the save-time gate, names the downstream error code it prevents, and discloses Space scoping plus the per-call override. What it omits is the result shape (boolean verdict vs. list of matches) and what a 'too close' response contains.
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?
Three tight sentences, front-loaded with the core behavior, then the usage trigger, then the scoping caveat. No filler and nothing buried.
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 read-only preflight check with no output schema, the agent knows why to call it, when, and how to scope it. It lacks only what a response looks like and how to act on a positive similarity hit, which is a real but minor residual gap.
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% and space_id's semantics are already spelled out in the schema, so the description only restates it briefly. The description never mentions the nested businessId field or clarifies what texts accepts (single string vs. batch), leaving that entirely to the schema, so baseline 3 applies.
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?
States a specific action (run the similarity check), a specific resource (ad copy vs tracked competitor ads), and even the second failure mode it detects (naming a competitor). No sibling tool in the list performs competitor-copy similarity, and the description makes that scope unmistakable.
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?
Explicitly prescribes the timing — 'Use before creating or updating ads to avoid a 409 COMPETITOR_SIMILARITY' — which tells the agent exactly when to reach for it. It also routes space scoping to set_active_space versus the space_id override, but gives no 'when not to use' guidance or alternative tool for other preflight checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_asset_uploadComplete asset uploadAInspect
Finish a two-step upload after the PUT: Growomat reads the stored file's real type, size, width and height and marks the asset READY. Fails with UPLOAD_MISSING if nothing has been uploaded yet, and marks the asset FAILED if the bytes are not an accepted image. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_id | Yes | The asset_id start_asset_upload returned. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false; the description goes well beyond that by disclosing the state transitions (READY on success, FAILED on invalid image) and the UPLOAD_MISSING failure mode. It stops short of describing idempotency or whether a FAILED asset can be retried, which are relevant for a completion step.
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?
Three sentences, all front-loaded: the action and sequencing first, then failure modes, then Space scoping. No filler and nothing an agent needs is buried.
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?
No output schema exists, yet the description explains what the call determines (type, size, width, height) and what result state is set, so an agent knows what to expect on return. Combined with 100% schema coverage, nothing material 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?
Schema coverage is 100%, so baseline is 3. The description restates that asset_id scoping comes from the active Space and that space_id overrides it for one call, but this largely duplicates the schema text rather than adding new syntactic or format detail.
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?
States a specific verb and resource ('finish a two-step upload', 'marks the asset READY') and positions itself precisely in the upload sequence relative to start_asset_upload and upload_asset. An agent can distinguish it from all siblings without opening the schema.
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?
Explicitly says to call it after the PUT, and names the alternative path for Space scoping (set_active_space vs. passing space_id). It does not state any when-not conditions, but the prerequisites for the call are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_campaignConfirm draft campaignAInspect
Confirm a DRAFT campaign: moves it to PAUSED. A draft is never synced and no other change can take a campaign out of DRAFT — this is the one way, with the app's own checks (refused while the campaign builder is still writing it, or while a required question is unanswered; answer those in the app). Nothing reaches a platform until trigger_sync, and it stays paused there until you set status ENABLED and sync again. Returns the campaign. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_id | Yes | The draft campaign to confirm. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the state transition (DRAFT to PAUSED), refusal conditions tied to app-side checks, the fact that nothing reaches a platform until trigger_sync, and the subsequent pause behavior. It also states that the campaign is returned and explains Space scoping, which is substantial behavioral context for a non-destructive mutation.
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 action and state transition, then layers in refusal conditions, sync implications, return behavior, and Space scoping. Every sentence carries operational value and there is no redundant filler.
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 mutation tool with no output schema, the description covers the important state change, refusal conditions, downstream sync behavior, return value, and Space scoping. Combined with complete parameter descriptions and annotations, an agent has enough context to invoke it correctly.
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 description coverage is 100%, so the schema already documents both campaign_id and space_id. The description reinforces that campaign_id refers to a draft campaign and notes the space_id override, but it adds little technical meaning beyond what the schema provides.
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 specific verb and resource: "Confirm a DRAFT campaign: moves it to PAUSED." It also distinguishes the action from other campaign changes by explaining that no other change can take a campaign out of DRAFT and that this is the one way to do so.
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 gives explicit when-to-use guidance for draft campaigns and when-not conditions: confirmation is refused while the campaign builder is still writing or while a required question is unanswered. It also clarifies the downstream path, noting that nothing reaches a platform until trigger_sync and that the campaign stays paused until status is set to ENABLED and synced again.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_competitor_library_accountConfirm library accountAInspect
Confirm that a library account belongs to a competitor; Growomat starts reading its ads. Only call this once the user has agreed the match is right. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the IdentityConfirm schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a mutation and not destructive. The description adds meaningful behavior beyond annotations: it triggers ad reading and requires prior user agreement, though it does not cover reversibility or error behavior.
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 effect is front-loaded, followed by the call precondition and scoping note. Every sentence carries useful information with no redundancy.
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 mutating confirm action with a nested body, the description covers purpose, precondition, effect, and Space scoping. It leaves minor gaps around rejection guidance and result/error behavior, but the schema carries the field-level detail.
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 description coverage is 100%, so the schema already documents competitor_id, body, and the space_id override. The description reinforces Space scoping but adds no new detail about the nested IdentityConfirm body or its required fields.
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 specific verb and resource: confirming that a library account belongs to a competitor. It also names the immediate outcome, that Growomat starts reading its ads, which lets an agent distinguish it from discovery and rejection siblings.
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 gives a clear prerequisite: only call once the user has agreed the match is right. It also explains the Space scoping and points to set_active_space for switching, but it does not explicitly route to reject_competitor_library_account when the match is wrong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_own_ad_readingConfirm what the business's ads argueAInspect
Turn readings into angle stamps the user agreed to: each item names an active ad and, to correct the reading, an angleType from the closed vocabulary. The ad is stamped with provenance user and counts in angle results from then on. Ask the user first; confirm only ads they agreed to. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the OwnReadingConfirm schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes | The business id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the write/non-destructive profile is known. The description adds meaningful context beyond that: the ad is stamped with provenance 'user' and will 'count in angle results from then on' — a persistent side effect the agent needs to know. This is substantive behavioral disclosure.
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 core action is front-loaded, followed by effect, user-agreement caution, and Space scoping. Every sentence carries a distinct piece of information with little waste, though the density of domain jargon slightly reduces readability.
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 nested-body mutation tool with no output schema, the description covers action, side effect, usage precondition, and Space scoping — the essentials an agent needs to call it correctly. It does not explain what a successful confirmation returns, but with no output schema that gap is minor.
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% at the top level, but the nested items fields (adId, angleType) carry no schema descriptions. The description compensates by explaining adId names an active ad and angleType comes 'from the closed vocabulary' to correct the reading, adding semantic meaning beyond the bare schema. It does not enumerate the vocabulary values, keeping it just shy of a 5.
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 specific action — turning readings into angle stamps on active ads — and distinguishes it from the read-side sibling get_own_ad_reading. The domain jargon ('readings', 'angle stamps') is somewhat opaque, but the verb+resource+effect is clear enough for an agent to identify it as the write/confirmation counterpart.
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?
'Ask the user first; confirm only ads they agreed to' gives an explicit precondition for use, which is the key gating behavior. It also points to set_active_space and the space_id override for scoping. It stops short of naming when a different confirmation tool applies, but the core when-to-use is well covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_adCreate adAInspect
Create a new ad inside an ad group. A search ad reads headlinePart1–3 and description/description2. A single-image card (type OPENAI_CHAT_CARD, a chat card) reads headlinePart1 as its title (3–50 characters) and description as its body (up to 100) — or _native[platformId].postTitle / postBody when you want the card to read differently — finalUrl as its destination, and needs one image of at least 640 × 640: upload_asset, then attach_asset_to_ad with role MARKETING_IMAGE (or set creative.imageUrl). headlinePart2 is not needed for a card. validate_export names anything a platform would refuse; preview_campaign shows the card as it will be sent. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AdCreate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only but non-destructive mutation. The description adds meaningful behavior beyond that: the image must be at least 640 × 640, an image can come from attach_asset_to_ad or creative.imageUrl, validate_export surfaces platform refusals, and the tool returns the full created object. It does not cover permissions, rate limits, or duplicate-ad behavior, so not a 5.
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?
Purpose is front-loaded and the dense paragraph conveys a lot without obvious filler. However, the card-format rules are packed into a long em-dash-heavy run-on, and a short structured breakdown by format would be more scannable for an agent.
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 complex nested-schema mutation with no output schema, the description covers return values, required image workflow, validation/preview, and active-Space scoping. It only documents search ads and OPENAI_CHAT_CARD in detail despite an enum of 19 ad formats, leaving agents to infer handling for VIDEO_AD, REDDIT_*, META_*, LINKEDIN_*, etc.
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%, so the baseline is 3. The description substantially exceeds that by explaining which fields each format reads: search ads consume headlinePart1–3 and description/description2; OPENAI_CHAT_CARD uses headlinePart1 as a 3–50 character title, description as a body up to 100, and _native[platformId].postTitle/postBody as an alternate copy path. That is real semantic meaning not present in the schema.
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?
Opens with a specific verb and resource: 'Create a new ad inside an ad group.' This clearly distinguishes it from update_ad and create_ad_group, and the agent knows exactly what operation is being performed without reading the schema.
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?
Explicitly routes the agent to upload_asset + attach_asset_to_ad before creating a card, and tells it to use validate_export to catch platform refusals and preview_campaign to see the card as sent. It gives clear workflow context and alternatives, though it does not state when-not to use this tool (e.g., use update_ad for existing ads).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ad_groupCreate ad groupAInspect
Create a new ad group under a campaign. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AdGroupCreate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a non-read-only, non-destructive write. The description adds useful context beyond them: the call returns the full created object and is scoped to the active Space with a per-call override. It does not cover failure modes, duplicate-name behavior, or validation rules.
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?
Three short sentences, all front-loaded with the operation first, then return behavior, then scoping. No filler or redundancy.
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 two-parameter mutation tool with fully documented schema and safety annotations, the description covers purpose, return shape, and space scoping. A note on required campaign existence or error behavior would close the remaining gap.
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 description coverage is 100%, including detailed body fields and the space_id override semantics, so the schema does the heavy lifting. The description only echoes the space_id option and adds no syntax or constraint detail beyond the schema, matching the baseline 3.
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 gives a specific verb and resource ('Create a new ad group') and states the parent relationship ('under a campaign'), which separates it from update_ad_group or create_campaign. It does not explicitly name the nearest siblings (update_ad_group, create_ad) to rule them out.
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 clearly explains the space-scoping choice: use set_active_space to change sessions or pass space_id for a one-call override. It stops short of saying when to use create versus update, or what prerequisites (e.g. an existing campaign) must be met.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_angleCreate angleAInspect
Create an angle — a claim a set of ads argues, scoped to one business. angleType must be a registry id from get_creative_vocabulary. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AngleCreate schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful non-obvious behavior by explaining that the operation is scoped to the active Space and can be overridden with space_id. It also explains that angleType is not arbitrary but a registry id from a vocabulary tool, which goes beyond the 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 compact and front-loaded: purpose, vocabulary requirement, and Space-scoping behavior are all stated in three efficient sentences with no filler.
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?
An agent gets enough to construct a valid request: the business scoping, the angleType source, and the Space-handling semantics. A small gap is not saying what happens on invalid or duplicate data, but that is not essential for basic 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 schema includes both top-level parameters, but the description adds real semantics for body.angleType — it must come from get_creative_vocabulary. It also clarifies businessId as the business scope and reinforces the meaning of space_id.
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 defines a specific verb and resource — create an angle — and explains what an angle is: 'a claim a set of ads argues, scoped to one business.' This distinguishes it from other create_* tools like create_concept or create_asset.
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 provides clear prerequisites and setup context: angleType must come from a registry via get_creative_vocabulary, and the call is scoped to the active Space. It does not explicitly list when not to use this tool, but the definition is specific enough for basic selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_assetCreate assetAInspect
Create an asset (image, logo, video). By reference: body.url is kept as a pointer and fetched when a sync needs the bytes, so it must stay reachable. By bytes: body.data (base64) — or body.url with body.store true — stores the file in Growomat; upload_asset is the simpler door for that. Every response carries previewUrl, a link you can open. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AssetCreate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-read-only, non-destructive write. The description adds real behavior the annotations can't: the URL must stay reachable because it is fetched lazily on sync, store=true snapshots expiring links, every response carries previewUrl, and the full object is returned. That is substantive disclosure beyond structured fields.
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?
Dense but front-loaded: the core create statement and mode split come first, then response and scoping notes. Every sentence carries information, though the phrasing is packed and slightly elliptical ('upload_asset is the simpler door for that').
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 nested-body mutation tool with no output schema, it covers the essential things an agent needs: creation modes, return shape (previewUrl, full object), and Space scoping. It leaves error/failure handling and the optional field set to the schema but nothing critical 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?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema by explaining how url, data and store interact (pointer vs stored bytes) and the ephemeral-URL failure mode. Not a 5 because it repeats somewhat and omits any framing of the remaining optional fields.
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?
Opens with a specific verb and resource plus the concrete asset kinds (image, logo, video), and immediately distinguishes itself from the sibling upload_asset. An agent can tell create_asset apart from upload_asset/update_asset without opening a schema.
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?
Explicitly lays out the two operating modes: by-reference (body.url kept as a pointer) versus by-bytes (body.data base64, or url with store=true). It names the alternative ('upload_asset is the simpler door for that') and explains override behavior via space_id vs set_active_space.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_businessCreate businessAInspect
Register a new business: its name and website, plus optional description, target groups, SEO keywords, key pages (sitelinks) and a brand voice profile. The optional brand object is the business's brand voice profile — tone dials (formality, energy), voiceNotes, promises and bannedPhrases — and governs all generated ad and social copy for this business. Returns the full created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the BusinessCreate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only but non-destructive write operation. The description adds that it returns the full created object and that the brand profile governs generated ad and social copy, along with Space scoping details; it does not cover auth requirements or duplicate/failure behavior.
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 action and fields, then covers the brand profile, return behavior, and Space scoping. The sentences are compact and each adds useful information.
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 create tool with a complex nested body but full schema coverage, the description does enough: it names required name/website, summarizes optional fields, explains brand behavior, states the return shape, and documents Space scoping. Minor gaps around auth, duplicate handling, and advanced fields remain but are not critical 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?
Schema description coverage is 100%, so the schema already carries most parameter meaning. The description adds useful context for key pages as sitelinks and explains the brand profile's role, but it omits fields such as status, categoryId, logoUrl, and logoSource.
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 and resource, 'Register a new business', and immediately lists the core fields it accepts. This clearly separates it from retrieval tools like get_business or list_businesses and mutation tools like update_business.
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 explains the Space scoping behavior and names set_active_space as the way to switch, plus the space_id one-call override. It does not explicitly say when to use this versus update_business or how duplicate businesses are handled, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaignCreate campaignAInspect
Create a new campaign. It runs only on the platforms named in body._platformBudgets, which is required. budget is daily, in the platform account's currency (list_connections); some platforms set a per-currency daily minimum, which validate_export names. Platform-only settings go in body._native, keyed by platform id — the NativeExtensions schema in the OpenAPI spec lists each platform's keys: for example a lifetime budget (budgetKind LIFETIME, which can never become daily once pushed and needs a fixed bid: biddingStrategy MANUAL_CPC with biddingStrategy.cpcBid, or a cpcBid on each ad group), the bidding type, or the delivery surfaces. A campaign created as DRAFT is held back until confirm_campaign. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the CampaignCreate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is not read-only and not destructive. The description goes far beyond: pushes are irreversible in one direction (a LIFETIME budget can never become daily), DRAFT campaigns are held until confirm_campaign, and the call is scoped to the active Space. It also states it returns the full created/updated object.
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?
Front-loads what it does and which field is required, then layers constraints. It is a single dense paragraph with heavy nested parentheticals (lifetime budget example, space scoping) that slow parsing, but no sentence is truly expendable.
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 complex create with nested objects and no output schema, it covers the required fields, currency semantics, platform-specific extension handling, draft lifecycle, and Space scoping, while deferring shape details to the OpenAPI spec. Nothing an agent needs to invoke it correctly 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?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: _platformBudgets is required and only listed, switched-on platforms run; budget is a daily figure in the platform account's currency; _native is keyed by platform id and carries platform-only keys. The lifetime-budget example (budgetKind LIFETIME requiring MANUAL_CPC plus cpcBid) is genuinely non-obvious guidance.
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?
States a specific verb and resource (create a new campaign) plus its defining constraint: it only runs on platforms listed in body._platformBudgets. It implicitly distinguishes itself from update_campaign, preview_campaign and confirm_campaign by describing the DRAFT-until-confirmed lifecycle, so an agent can pick it without opening a schema.
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?
Routes the agent to concrete siblings for supporting facts: list_connections for currency, validate_export for per-currency minimums, set_active_space for scope, confirm_campaign for draft release, and set_ad_schedule/set_geo_targeting as preferred helpers. It gives clear context but stops short of saying when NOT to create directly (e.g. preview first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_conceptCreate conceptAInspect
Create a concept under an angle. attributes are registry ids from get_creative_vocabulary. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the ConceptCreate schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only write (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds genuine behavioral context: the mutation is bound to the current session's active Space, are not an explicit target, and attribute values depend on the creative vocabulary registry. No contradiction with the annotations; the description adds detail beyond the annotation baseline.
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?
Three compact sentences, each earning its place: creation target, attribute-format dependency, and scoping mechanism. The scoping constraint is clearly packed into the sentence with the fallback tool named. No fluff, no repetition of schema content verbatim.
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 tool with a nested body and full schema coverage, the description covers the essential operational context: where the concept is created (under an angle), where attribute values come from, and how Space scope is resolved. The only meaningful gap is the absence of an output/response statement — but there is no output schema — and the assumption that the referenced angle must already exist is probabilistic. Overall it's complete enough for an agent to call it reasonably.
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 schema already documents 100% of parameters (body and space_id, with types and patterns), so the baseline is 3. The description adds value beyond the schema by revealing that the array of attribute strings must be valid registry IDs from get_creative_vocabulary — something the body schema does not explain. It also clarifies the space_id override semantics at a higher level in combination with set_active_space.
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?
'Creates a concept under an angle' is a specific verb+resource+placement statement, so the agent can tell this apart from create_angle (creates the angle itself) and update_concept (modifies). The resource hierarchy (concept under angle) is explicit, which is the core signal an agent needs to select this tool. It doesn't name a sibling directly, but the verb+object combination is concrete enough to disambiguate.
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?
Provides clear operational guidance: it points to set_active_space for switching scoping and says space_id overrides the bound Space for one call — exactly what the agent needs to know before invoking. It also names a prerequisite source, get_creative_vocabulary, for attribute registry ids. It stops short of explicitly stating when an alternative (e.g., update_concept) should be preferred, but the selection context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_conversion_actionCreate conversion actionAInspect
Create a conversion action — the thing an uploaded conversion is counted against. Pass body with at least { name, type, category }. The action is created locally; exporting it to an ad platform (which assigns the remote id and the tag snippet) happens through campaign sync. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Conversion action payload — { name, type, category, ... }. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-destructive operation. The description adds valuable behavioral context beyond annotations: the action is created locally and only gains a remote id and tag snippet through sync, and it is scoped to the active Space with an override option via space_id. This informs the agent about side effects and state, going beyond the basic mutation flags.
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 three sentences, front-loaded with the primary purpose, and every sentence earns its place by explaining key concepts (local creation, sync, space scoping). There is no redundancy or fluff, making it highly concise and well-structured.
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?
Given the nested body object and no output schema, the description adequately explains the tool's role, local creation vs export, and space override behavior. It does not describe the return value, but this is not required since no output schema is present. The context provided is sufficient for correct tool invocation, though it could mention what happens on success (e.g., returns the newly created action) to be fully complete.
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%, so the schema already documents all parameters with descriptions. The description only repeats the requirement for body's minimum fields ('at least { name, type, category }') which is also present in the body description, and adds no unique parameter-level detail. Baseline 3 is appropriate because the schema handles the heavy lifting.
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 specific verb ('Create') and resource ('a conversion action'), defines it as 'the thing an uploaded conversion is counted against', and distinguishes it from sibling tools like create_conversion_source and upload_offline_conversion by explaining that creation is local and exporting happens through campaign sync. This makes the tool's purpose unambiguous and clearly 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?
The description gives clear workflow context: 'created locally' and 'exporting ... happens through campaign sync', indicating when to use this tool within a larger process. It also explains space scoping and points to set_active_space as an alternative for switching spaces. However, it does not explicitly state when not to use this tool versus other create_* tools, though the distinction is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_conversion_sourceConnect a conversion sourceAInspect
Connect a revenue/conversion source to the active Space so it feeds measured conversions back to your connected ad platforms. Pass body as { type: 'stripe'|'webhook'|'hubspot'|'salesforce'|'ga4', config?: {...}, accountRef? }. Idempotent per type by default. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Source payload — { type, config?, accountRef? }. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint=false annotation, the description reveals idempotency per type by default and the scoping behavior, adding meaningful behavioral context. It does not mention auth or rate limits, but the disclosed traits materially help an agent predict behavior.
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?
Three sentences with no fluff: the first states purpose, the second prescribes the body shape, and the third covers idempotency and scoping. Each sentence carries essential information.
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?
Given the moderate complexity (nested body, space scoping, idempotency), the description covers the main behavioral and payload aspects. It lacks explicit error/response details, but the absence of an output schema makes that less critical. Overall, it is sufficient 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 schema provides basic field descriptions, but the tool description goes further by enumerating the concrete type values (stripe|webhook|hubspot|salesforce|ga4), clarifying config/accountRef as optional, and explaining the space_id override semantics. This substantially augments the schema information.
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 clearly states the action 'Connect a revenue/conversion source to the active Space' and explains its purpose (feeds measured conversions back to ad platforms). This distinguishes it from sibling tools like create_conversion_action, which target conversion actions rather than sources.
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 provides clear context on scoping: it mentions the active Space, the set_active_space sibling tool for switching, and the space_id override for one call. However, it does not explicitly list alternative tools or when-not-to-use conditions, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_keywordCreate keywordAInspect
Add a keyword to an ad group. On a platform without keywords (a chat platform), positive keywords are sent as plain-language context hints — write them as the questions people ask — and negatives are dropped; validate_export says so. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the KeywordCreate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare this is a non-read-only, non-destructive write. The description adds real behavioral context beyond that: platform-dependent mutation semantics where negative keywords are silently dropped, the fact that the full updated/created object is returned, and how the active-Space binding affects where the write lands.
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?
Three sentences, action first, then platform caveat, then return behavior and scoping. Dense but every clause carries information; the middle sentence is slightly compressed in a way that takes a re-read.
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 create tool with annotations covering the safety profile, no output schema, and a fully documented nested body schema, the description covers the remaining agent-relevant unknowns: platform-dependent behavior and Space scoping. Anything further (match type rules, bid semantics) is legitimately deferred to the OpenAPI spec.
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%, so the baseline would be 3, but the description adds interpretive meaning for `body.text` (on chat platforms write keywords as the questions people ask) and clarifies the positive/negative distinction tied to `isNegative`. The `space_id` explanation largely restates the schema's own description, so it is not a full 5.
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?
States a specific verb and resource ("Add a keyword to an ad group") that maps cleanly against siblings like update_keyword, delete_keyword, and list_keywords. It does not explicitly name a sibling it is not, so it stops short of full differentiation, but the operation is unambiguous.
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 gives conditional guidance (on platforms without keywords, positives become plain-language context hints and negatives are dropped), points to validate_export as the authority for that behavior, and explains the Space scoping with set_active_space as the alternative and space_id as the per-call override. That is explicit when/how-to-route guidance rather than implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_adDelete adADestructiveInspect
Delete an ad. Permanently deletes the resource. Irreversible. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful context beyond annotations: it states 'Permanently deletes the resource. Irreversible.' and explains the Space scoping behavior. The annotations already mark destructiveHint=true, so the description's value is in reinforcing the permanence and providing the scoping detail.
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 tightly written: three short sentences that each carry essential information. No filler, and the most important fact (permanent deletion) is front-loaded.
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 simple deletion tool with annotations and only two parameters, the description fully covers purpose, risk, and the active-Space behavior. There is no output schema expected, so no missing return information. The description is sufficient to invoke the tool correctly.
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 schema already provides a detailed description for space_id, and the description reinforces its behavior and default. However, ad_id has no description in the schema and the description doesn't clarify its format or requirements beyond being required. With 50% schema coverage, the description partially compensates but could go further.
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 begins with a specific verb and resource ('Delete an ad'), clearly distinguishing it from sibling tools like delete_ad_group or delete_campaign. It also states the scope and the permanent nature, removing ambiguity.
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 clearly ties usage to the active Space, explicitly telling the user how to switch (set_active_space) or override per-call (space_id). This is helpful context, though it doesn't explicitly mention when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_ad_groupDelete ad groupADestructiveInspect
Delete an ad group. By default the call fails with a 409 when the ad group still has dependent ads or keywords — pass cascade=true to delete them in the same request. Permanently deletes the resource. Irreversible. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| cascade | No | If true, also delete dependent ads and keywords. Default false. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| ad_group_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description discloses critical behavioral traits: the 409 failure on dependent resources, cascade behavior, permanent and irreversible deletion, and active Space scoping. This adds significant context that annotations alone do not provide.
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 three sentences, each adding essential information: the core action, the cascade-caused 409 behavior, and the permanence/scoping context. There is no redundancy or filler, and the main action is front-loaded.
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 deletion tool with no output schema, the description covers all critical operational aspects: dependent-resource handling with cascade, irreversibility, and Space scoping. It is complete enough for agents to use safely and correctly without additional external knowledge.
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 description enhances schema parameter meaning by explaining that cascade=true deletes dependents in the same request, and space_id overrides the active Space for one call. It also implies ad_group_id as the target resource from the purpose, compensating for the schema's missing description for that parameter.
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 the specific verb 'Delete' and clearly identifies the resource as 'ad group', distinguishing it from sibling delete tools for other resources. It also states the primary behavior outright without ambiguity.
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 explicitly explains when to use the cascade parameter (to delete dependent ads/keywords in the same request) and the default 409 behavior when dependents exist. It also names set_active_space as an alternative for switching spaces and offers space_id as an override, providing clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_angleDelete angleADestructiveInspect
Delete an angle. Its concepts are deleted with it; ads keep their stamp (dangling but queryable). Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| angle_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already mark destructiveHint=true, the description goes beyond that by disclosing the cascade deletion of concepts and the unusual side effect that ads retain a dangling-but-queryable stamp. It also explains Space scoping behavior and the override mechanism, which annotations do not cover.
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?
Three sentences pack in the core action, destructive consequences, side effects, and space-scoping rule without any fluff. The most important information is front-loaded, and every sentence carries meaningful guidance.
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 delete tool with no output schema, this description covers all critical context: what is deleted, what is affected, what persists, and how to target the right Space. An agent has enough information to safely invoke the tool and understand its consequences.
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 schema covers space_id well with its own description, and the tool description reinforces the Space-scoping semantics. However, angle_id is undocumented in both the schema and the description, leaving the agent to infer its meaning from the parameter name alone. This is acceptable but leaves a small gap.
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 clearly states the action and resource: 'Delete an angle.' It also distinguishes itself from related angle tools by noting the cascade behavior ('concepts are deleted with it') and with a specific verb, so an agent can tell it apart from create_angle, update_angle, and get_angle.
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 gives explicit context for the Space scoping, telling the agent to see set_active_space to switch spaces or pass space_id to override for this call. It does not discuss when not to use the tool, but for a destructive delete this guidance is less critical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_assetDelete assetADestructiveInspect
Delete an asset. Permanently deletes the resource. Irreversible. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include destructiveHint=true and readOnlyHint=false, but the description adds crucial behavioral details: 'Permanently deletes the resource. Irreversible.' This goes beyond the generic destructive flag by specifying permanence and irreversibility. It also clarifies Space scoping and override, adding significant context beyond the annotations. No contradiction.
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 three sentences long, front-loaded with the primary action, then consequences, then scoping. Every sentence adds value with no redundancy or fluff. It is concise, well-structured, and highly readable.
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?
Given the tool's simplicity (2 params, no output schema, no nested objects), the description adequately covers purpose, consequences, and space scoping. It does not mention return values or error conditions, but these are not critical for a straightforward deletion tool and are not required by the output schema. The description is complete enough for an agent to use the tool correctly.
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 description coverage is 50% (only space_id has a description). The tool description mentions 'pass space_id to override' and 'set_active_space to switch', which reinforces the space_id parameter's semantics but does not add much beyond the schema's description. asset_id remains undocumented in both, though its meaning is clear from the tool name. The description partially compensates for the coverage gap but not fully.
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 clearly states the tool's function: 'Delete an asset. Permanently deletes the resource.' It uses a specific verb and resource, distinguishing it from other delete_* sibling tools. The addition of 'Irreversible' clarifies the destructive nature, making the purpose unambiguous.
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 provides clear context on how to scope the deletion ('Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call'), which is important for correct usage. However, it does not explicitly mention when to use this tool over alternatives (e.g., other delete tools) or when not to use it, though the resource name makes this reasonably implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_businessDelete businessADestructiveInspect
Delete a business. Fails with 409 if any campaign still references it — delete or reassign those campaigns first; no cascade is offered. Permanently deletes the resource. Irreversible. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond destructiveHint=true, the description discloses the 409 failure on references, irreversibility, permanence, and Space scoping with override behavior. These are non-obvious behavioral traits that annotations alone don't capture, and there is no contradiction.
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 two sentences, front-loaded with the core action and packed with essential constraints (409, no cascade, irreversible, scope). Every sentence earns its place with no filler.
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 destructive delete tool with 2 params and no output schema, it covers prerequisites, error handling, permanence, and scope override. The only potential missing item is auth/permissions, but that's not expected given no annotations mention it and the constraints are thorough.
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 covers space_id with a detailed description, but business_id has no description in the schema. The description only restates the space_id override concept and doesn't add new meaning for business_id. With 50% schema coverage, it meets the baseline but doesn't add value beyond the schema.
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?
Starts with 'Delete a business' — a specific verb+resource. Distinguishes from sibling delete_* tools by mentioning the campaign-reference constraint and Space scoping, making it clear this targets business entities only.
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?
Provides a clear precondition: campaigns referencing the business must be deleted/reassigned first, and notes no cascade is offered. Explains Space scoping with a pointer to set_active_space. Does not explicitly mention an alternative like update_business for non-destructive changes, so it's not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_campaignDelete campaignADestructiveInspect
Delete a campaign. Permanently deletes the resource. Irreversible. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already mark this as destructive, the description adds 'Permanently deletes the resource. Irreversible.' which reinforces the finality. It also reveals that the operation is scoped to the active Space, a behavioral trait not present in 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?
Two sentences, front-loaded with the core action, and every word adds value. No filler or repetition.
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 simple delete operation with two parameters and no output schema, the description covers permanence, irreversibility, and space scoping adequately. It doesn't cover error cases or side effects, but for a low-complexity destructive tool, this is sufficient.
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 only 50% (space_id has a description, campaign_id does not). The description adds context for space_id by explaining when to use the override, but campaign_id semantics are left implicit. The tool name and purpose make campaign_id obvious, but the description doesn't explicitly clarify its format or requirements.
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 starts with 'Delete a campaign' which is a specific verb+resource pair, clearly distinguishing it from other delete tools for ads, assets, etc. It also clarifies the scope of deletion, making the purpose unambiguous.
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 provides clear context on how to control the target resource via Space scoping, mentioning set_active_space and the space_id override. It doesn't explicitly name alternatives, but the Space guidance is helpful for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_conceptDelete conceptADestructiveInspect
Delete a concept. Ads keep their stamp. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| concept_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnly=false, and the description does not contradict that. It adds useful non-obvious behavior beyond annotations: deleted concepts leave ads' stamps intact, and the operation respects the active Space or can be overridden for a single call.
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 short, front-loaded with the main action, and every sentence earns its place. It states what happens, the side effect, and the relevant scoping behavior without bloat.
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?
Given the destructive annotation, simple two-parameter schema, and absence of an output schema, the description provides enough context for correct invocation: it names the action, the side effect, the Space scoping, and the override mechanism. The only minor gap is no explicit format or semantics for concept_id, but the tool name makes it clear.
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 description coverage is 50%, so the schema fully documents only space_id. The description reinforces the space_id override behavior but does not add much meaning for concept_id, though that parameter is self-evident from the tool name and is the required identifier.
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: 'Delete a concept.' This cleanly distinguishes it from other delete_* siblings in the tool list, and the side-effect note ('Ads keep their stamp') adds domain-specific clarity about what the deletion does not affect.
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 clearly conveys the operative context: the operation is scoped to the active Space and tells the agent how to change or override that Space via set_active_space or space_id. It does not explicitly list when not to use this tool versus other delete_* tools, but the resource is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_conversion_actionDelete conversion actionADestructiveInspect
Delete a conversion action. Permanently deletes the resource. Irreversible. Refuses with a conflict and names the campaigns when a campaign bids on this action — deleting it would change how that campaign spends. Pass force to delete anyway. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Delete even when campaigns bid on this action. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| conversion_action_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description adds significant detail: 'Permanently deletes the resource. Irreversible.' It also discloses the conflict behavior (refuses and names campaigns) and the force override, plus Space scoping behavior. This goes far beyond annotation basics.
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?
Three sentences, front-loaded with the primary action. Each sentence adds distinct value: irreversibility, conflict handling, and scope override. No redundant or filler content.
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 destructive tool with no output schema, the description covers all critical aspects: what is deleted, irreversibility, failure conditions, override mechanism, and space scoping. It is complete for the tool's complexity.
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 67% (conversion_action_id lacks description). The description explains force ('Pass force to delete anyway') and space_id ('pass space_id to override for this one call') in meaningful context. conversion_action_id is left implicit, but it is the required resource identifier and is obvious from the tool name.
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 opens with a specific verb+resource: 'Delete a conversion action.' It clearly distinguishes this from sibling tools like create_conversion_action, update_conversion_action, and get/list_conversion_action. It also adds irreversibility, making the purpose unmistakable.
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 provides clear context on when to use this tool (to permanently delete a conversion action) and explains the conflict scenario when campaigns bid on the action. It mentions set_active_space as an alternative for scope switching, but does not explicitly name alternate tools for deletion or when not to use. Still, the usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_keywordDelete keywordADestructiveInspect
Delete a keyword. Permanently deletes the resource. Irreversible. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| keyword_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set destructiveHint=true and readOnlyHint=false, but the description adds 'Irreversible' and 'Permanently deletes the resource,' clarifying the consequences. It also discloses the space scoping behavior, which is not in 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 three short sentences, front-loaded with the action and consequences, followed by scoping details. Every sentence adds value without redundancy.
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 simple delete operation with two parameters, the description covers purpose, irreversibility, and space scoping. It omits return values or error handling, but given the absence of an output schema and the tool's simplicity, this is acceptable. The destructive annotation plus the irreversibility warning provide a complete safety profile.
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 schema covers space_id with a description, and the description reinforces its use for overriding the active Space. However, keyword_id has no schema description beyond its name, and the description does not elaborate on it, leaving a gap for the required parameter.
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 clearly states 'Delete a keyword' and emphasizes 'Permanently deletes the resource.' This uses a specific verb and resource, distinguishing it from sibling delete tools like delete_ad and delete_campaign.
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 provides explicit scoping guidance: 'Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.' This tells the agent how to target the correct space and when to use set_active_space vs the space_id parameter, which is practical guidance beyond just identifying the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detach_asset_from_adDetach asset from adBInspect
Detach an asset from an ad / ad group. Permanently deletes the resource. Irreversible. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| ad_asset_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims the operation is 'Permanently deletes the resource' and 'Irreversible', but the annotations declare destructiveHint=false. This is a direct contradiction (Annotation Contradiction). The description's behavioral transparency is undermined because the structured metadata disagrees; no credit can be given for disclosure when it conflicts 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 two concise sentences, front-loaded with the core action and followed by essential caveats about permanence and scoping. Every clause adds value without redundancy. Well-structured and easy to parse.
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?
The description covers purpose, scoping, and irreversibility, but there are notable gaps: no mention of return value or side effects beyond deletion, no prerequisites (e.g., asset must be attached), and the ambiguity of 'deletes the resource' remains unresolved. With no output schema and contradictory annotations, the description should be more complete.
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 schema covers space_id with a detailed description, which is reflected in the description's mention of the override behavior. However, ad_asset_id (the required parameter) is not described in the schema or the description, and schema coverage is only 50%. The description adds some value by explaining the space scoping, but does not compensate for the missing ad_asset_id semantics.
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 clearly states the action: 'Detach an asset from an ad / ad group' and distinguishes it from sibling tools like detach_asset_from_campaign. However, the clause 'Permanently deletes the resource' is ambiguous—it could refer to the association or the asset itself, which slightly clouds the purpose.
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 provides useful scoping guidance: it mentions the active Space, points to set_active_space for switching, and notes that space_id can override for a single call. It does not explicitly contrast with detach_asset_from_campaign or state when to use this over other detachment tools, so it falls 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.
detach_asset_from_campaignDetach asset from campaignCInspect
Detach an asset from a campaign. Permanently deletes the resource. Irreversible. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_asset_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'Permanently deletes the resource. Irreversible.', while annotations set destructiveHint=false and readOnlyHint=false. This is a direct contradiction: the description clearly indicates a destructive, irreversible action, but the annotations suggest it is not destructive. This is a serious inconsistency.
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 relatively short but includes redundant and contradictory phrases like 'Permanently deletes the resource. Irreversible.' These do not add value beyond the core purpose and could confuse users. The structure is front-loaded with the main action but then detracts with misleading details.
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?
The tool has no output schema, and the description does not explain return values or error behavior. The destructive nature is contradicted by annotations, and the required parameter campaign_asset_id is not described. While the Space scoping info is useful, the overall description is incomplete for a mutation tool with these gaps.
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 description mentions space_id, adding context about overriding the active Space, which complements the schema's description. However, the required campaign_asset_id parameter has no description in either the schema or the tool description, and its meaning is only implied by the tool name. Schema coverage is 50%, and the description only partially compensates.
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 clearly states the action 'Detach an asset from a campaign', distinguishing it from the sibling tool detach_asset_from_ad. However, the follow-up 'Permanently deletes the resource. Irreversible.' introduces ambiguity about whether the asset itself or the association is deleted, which could mislead.
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 provides context about Space scoping and how to override it via space_id, referencing set_active_space. However, it does not mention when to use this tool versus detach_asset_from_ad or other alternatives, and lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_competitor_library_accountsFind library accountsAInspect
Search each public ad library for the accounts that match a competitor, with evidence (do their ads point at the competitor's website, does the name match, is it verified). Nothing is read until one is confirmed. Uses one monthly library lookup unless today's result is cached. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Search again instead of using today's cached result. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare readOnlyHint=false and destructiveHint=false), the description discloses quota consumption ('one monthly library lookup'), caching ('unless today's result is cached'), and confirmation gating ('Nothing is read until one is confirmed'). It does not explain the non-read-only nature implied by the annotation or any permission requirements.
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 four sentences, front-loaded with the core purpose and evidence criteria. Every sentence adds value: the evidence factors, the confirmation gating, the quota/caching cost, and the space scoping. No waste.
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?
Given no output schema, the description covers what the tool does, how it evaluates matches, its side effects (lookup quota, caching), and session scoping. It does not describe the return format (e.g., list shape, evidence fields) but the evidence parenthetical implies useful output; completeness is strong but not exhaustive.
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%, so the baseline is 3. The description adds context for space_id (override vs set_active_space) but does not mention the force parameter or its cache-bypass behavior beyond a general caching note; the schema already documents all parameters.
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 specific verb (search) and resource (public ad library accounts matching a competitor), and the evidence criteria (website match, name match, verification) clearly distinguish it from sibling tools like list_competitors or list_competitor_ads.
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 gives clear usage context: scoped to the active Space, with an option to override via space_id or use set_active_space. However, it does not explicitly state when not to use this tool or name the confirmation sibling (confirm_competitor_library_account) as the required next step, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_active_spaceGet active spaceARead-onlyInspect
Report the MCP server's current active Space binding. Returns { active_space_id, source, name?, role?, type?, campaign_count? }. source is 'env' (set at start-up via GROWOMAT_SPACE_ID), 'set_active_space' (changed at runtime), or 'default' (unbound — the BE falls back to the caller's Personal Space). No API round-trip when nothing is bound.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description goes beyond by disclosing the source field values ('env', 'set_active_space', 'default'), the fallback to the caller's Personal Space, and the no-API-round-trip behavior when unbound. This is rich behavioral context.
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?
Three sentences with no fluff. The first sentence states the purpose, the second lists return fields and source values, and the third covers the no-round-trip edge case. 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 parameterless getter with no output schema, the description fully documents the return shape, source values, and the unbound fallback behavior. It is complete for an AI agent to invoke and interpret results correctly.
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 has zero parameters, so the schema already covers 100% of parameter meaning. The description does not need to compensate, and the baseline of 4 applies. It does explain the return object, which is relevant to the tool's semantics.
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 clearly states the tool reports the MCP server's current active Space binding, with a specific verb+resource and a detailed return object. This distinguishes it from siblings like set_active_space and list_spaces.
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?
Clear context as a read-only getter for the active space, with source semantics explained. No explicit when-not or alternative mentioned, but the obvious counterpart is set_active_space, so the usage is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adGet adARead-onlyInspect
Fetch one ad by id. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the important behavioral trait that the tool is scoped to the active Space and can be overridden via space_id. This adds meaningful context, though it does not describe return format or error handling.
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 two sentences, front-loaded with the core action, and every word earns its place. No redundancy or filler.
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 simple single-resource fetch, the description covers the key scoping nuance and override mechanism. Without an output schema, it could mention what is returned, but the tool's behavior is straightforward enough that this is a minor gap.
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 description clarifies that ad_id is the identifier used for fetching, but the schema already fully documents space_id (50% coverage). The description partially compensates for the missing ad_id documentation but does not add constraints or format details.
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 the specific verb 'Fetch' and identifies the resource as 'one ad by id', which clearly distinguishes it from list_ads or other get_* tools. It also mentions the Space scoping, a defining characteristic of this tool.
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 provides clear context on how the tool uses the active Space and explains the set_active_space and space_id override options. It does not explicitly mention alternative tools or when not to use it, but the purpose is self-evident for fetching a single ad by id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_assetGet ad assetARead-onlyInspect
Fetch one ad-asset binding by id. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| ad_asset_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the important behavioral detail that the fetch is scoped to the active Space and can be overridden with space_id, which is beyond the readOnlyHint annotation. 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?
Two concise sentences, with the main action stated first and then the scoping context. No fluff or redundant information.
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 simple get-by-id tool with no output schema, the description covers the essential functionality and the key space-scoping constraint. It omits return values or error cases, but those are less critical for a fetch operation.
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 schema already thoroughly documents space_id, but ad_asset_id has no description in the schema. The description clarifies that the tool fetches 'by id', giving ad_asset_id a role, but does not add format or type details. With 50% schema coverage, the description provides only marginal extra meaning.
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 the specific verb 'Fetch' with the resource 'ad-asset binding' and identifies the id parameter, clearly distinguishing it from sibling tools like get_asset, get_ad, and list_ad_assets.
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 provides explicit guidance on space scoping, telling the user to see set_active_space to switch or pass space_id to override. It does not explicitly mention alternatives to this tool, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_groupGet ad groupARead-onlyInspect
Fetch one ad group by id. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| ad_group_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds behavioral detail about Space scoping—how the active Space context works and how to override it via space_id—which is not encoded in the annotation. This is useful context beyond the structured data.
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 a single sentence, front-loaded with the core action ('Fetch one ad group by id'), followed by scoping instruction. Every word earns its place, with no redundant or vague phrasing.
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 simple get tool, the description covers purpose, scoping, and override mechanism. No output schema exists, but the return value (the ad group) is implied by the name and description. It does not mention error behavior or not-found cases, but that is not critical for a basic read operation.
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 schema describes space_id in detail (50% coverage), and the description adds that ad_group_id is the lookup key ('by id'). However, it does not add significant meaning beyond the schema; the space_id override is already well-documented in the schema. The description gives minimal extra parameter guidance for ad_group_id.
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 opens with 'Fetch one ad group by id,' clearly specifying the verb (fetch), resource (ad group), and granularity (one by id). This distinguishes it from list_ad_groups, which lists multiple ad groups, and from get_ad or get_campaign, which target different resources.
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 scoping to the active Space, points to set_active_space to switch, and mentions the space_id override for a single call. This gives clear usage context and names an alternative tool for changing scope, though it does not explicitly contrast with list_ad_groups or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_angleGet angleARead-onlyInspect
Fetch one angle by id. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| angle_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true. The description adds useful behavioral context beyond that: it is scoped to the active Space, the Space can be overridden per-call, and set_active_space changes that binding. No contradiction.
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 sentences, no filler. The primary action is front-loaded and the Space behavior is explained efficiently.
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 simple read-one-by-id tool with annotations indicating read-only behavior, this definition covers the key invocation concerns: which id to pass, Space scoping, and per-call override. No output schema is required to make the call correctly.
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 50%. The space_id parameter already has a thorough schema description, and the prose reinforces its override behavior. The angle_id parameter is only implied by 'by id' but is not separately described; this is adequate for a simple id lookup.
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 and resource: 'Fetch one angle by id.' This distinguishes it from list_ and other get_ helpers such as get_angle_preflight and get_angle_readout, though it doesn't explicitly name those siblings.
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 clearly explains the active Space scoping and tells the agent to use set_active_space to switch, or pass space_id to override for the call. It does not explicitly contrast with list_angles or related getters, but the by-id framing makes the basic usage obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_angle_gapGet angle gapARead-onlyInspect
Which claims the tracked competitors lead with compared with the business's own active ads, as counts of ads (never spend): their ads shown in the last days days against the business's ads active now. coverage says how many of the business's active ads are confirmed (stamped), read (a provisional reading of the copy) or unknown. The verdict names the angle most competitors lead with that none of the business's known ads argue; it is null when withheld says the comparison cannot be made yet (own_ads_unread: call get_own_ad_reading and offer to confirm it; too_few_competitors: fewer than two competitors have classified ads; no_active_ads). When verdict.basis is mixed, say 'as far as we can read them'. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window for their ads, in days. Default 30. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes | The business id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already covers safety, yet the description adds substantial behavior: metrics are ad counts 'never spend', the two sides of the comparison use asymmetric windows (their last `days` vs. own ads active now), coverage has three states (stamped/read/unknown), and verdict.basis=mixed requires a hedging phrase in the reply. That is exactly the extra context annotations cannot carry.
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 core comparison is front-loaded in sentence one and every subsequent sentence carries information an agent needs (coverage states, null causes, phrasing rule, scope). The third sentence is overloaded with nested parentheticals and could be split, costing it the top mark.
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?
With no output schema, the description takes on the burden of explaining returns and does so: it defines the coverage field, the verdict field, its null/withheld semantics, and verdict.basis. Combined with the Space scoping note and remediation path, an agent has everything needed to call and interpret this tool.
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%, so the baseline is 3; the description earns above that by clarifying that `days` applies only to competitor ads while the business's side is 'active now', a semantic asymmetry the schema does not spell out. space_id is only restated in general terms (override for one call), which the schema already says.
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 specific comparison: competitor ad angles vs. the business's own active ads, explicitly in ad counts and not spend. The verb+resource are clear, though the opening sentence is convoluted ('Which claims the tracked competitors lead with compared with...'), and it never names a sibling such as get_angle_readout or get_competitor_coverage as the alternative, so differentiation has to be inferred.
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 gives concrete branching guidance: when verdict is null, the withheld reason tells the agent what to do (own_ads_unread → call get_own_ad_reading and offer to confirm it), and it enumerates the other withholding causes. It also covers the Space-scoping decision (use active Space vs. pass space_id). What's missing is any statement of when to reach for this tool versus adjacent analysis tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_angle_preflightGet angle pre-flightARead-onlyInspect
BEFORE spending: what can this account's budget actually resolve? Simulates the real stopping rule on the account's own observed spend, CPC and CVR and returns a P20-P80 weeks-to-verdict RANGE for the candidate angle count — never a single week. An unresolvable plan comes back as advice (fewer angles, the clicks-basis alternative with its caveat, or conversion tracking as the real fix), not refusal. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| count | Yes | Candidate angle count. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint present, the description adds substantial non-obvious behavior: it always returns a probabilistic range rather than a single value, and unresolvable plans come back as advice, not refusal or an error. This is the kind of nuance an agent cannot safely infer from the schema or annotation alone.
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 compact and front-loads the most important usage signal: 'BEFORE spending.' Each sentence carries distinct information: the purpose, the return shape, the failure-mode behavior, and the scoping mechanism. There is no redundant or filler content.
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?
Even without an output schema, the description covers the return type, its variability, the failure/advice behavior, and how to control scope — which is all an agent needs to invoke and interpret the result correctly. The tool's complexity is low, and this description fully compensates for the absence of structured output definitions.
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 documents both parameters completely, including the meaning of count and the scoping behavior of space_id. The description reinforces this with 'candidate angle count' and 'override for this one call,' but adds little semantic value beyond what the schema already states.
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 concrete purpose: it simulates the budget-based stopping rule on the account's observed spend, CPC, and CVR, and returns a P20-P80 weeks-to-verdict range for a candidate angle count. The 'BEFORE spending' framing and 'never a single week' caveat make its function distinct from simple read tools like get_angle or get_angle_readout.
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 opening 'BEFORE spending' is a clear usage trigger, and the description gives concrete scoping guidance: use the active Space or pass space_id to override. It does not explicitly name alternatives like get_angle_readout or state when NOT to use the tool, so some inference is still required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_angle_readoutGet angle read-outARead-onlyInspect
Results read at the ANGLE level — the unit where enough money flowed to teach anything. Per business, each angle's plain decision state (collecting | ahead | decided | no_difference), P(best), expected monthly loss of promoting the leader, delivery flags (skewed/starved and divergent platform mix — part of a lead can be delivery, not merit), the last recorded state transition, and estimator provenance. Never shows confidence that does not exist. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| window | No | Look-back window. Default 90d. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | No | Restrict to one business. | |
| platform_id | No | Restrict to one connected platform. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, and the description agrees without contradiction. It adds meaningful behavioral context by noting that delivery flags can mean part of the reported answer is driven by supply, not merit, and by stating that it never shows confidence that does doesn't actually exist. This goes beyond what the readOnlyHint annotation alone provides.
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 most important idea is front-loaded with one phrase: 'Results read at the ANGLE level.' Then the description describes what fields to expect and the space-scoping caveat. Some of the phrasing is inventive but non-essential, so it is not maximally concise, yet every sentence carries real purpose.
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?
Given that there is no output schema, the description provides a solid overview of the return composition and scoping behavior. It leaves minor gaps about pagination and whether empty results are possible, but for a read-only query tool the current level of detail is sufficient for a knowledgeable agent to recognize and call it correctly.
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?
All four parameters are documented in the schema with descriptions, so the schema coverage is 100% and the baseline of 3 is appropriate. The description mostly reinforces the space_id override behavior already described in the schema. Neither it substantially adds new parameter-level meaning, nor does it need to.
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 clearly states the tool returns angle-level results and enumerates exactly what is included: decision state, P(best), expected monthly loss, delivery flags, last state transition, and estimator provenance. This is specific about the resource and what it does. It does not explicitly contrast with siblings like get_angle or list_angles, so it does not fully earn a 5.
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 implies this is the right tool when you need angle-level read values, and it gives clear context about scoping to the active Space or overriding space_id for a single call. However, it never states when not to use this tool or which sibling tool to prefer in which situation. That key decision remains unstated, so the usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_answer_briefGet answer briefARead-onlyInspect
A structured brief for writing ORIGINAL copy that argues a competitor's angle: angle type, the shape of their offer, the hook pattern. It never contains the competitor's words; write the copy in the business's own voice. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AnswerBrief schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds genuinely non-obvious behavior: the brief deliberately excludes verbatim competitor text, which shapes how the caller should use the result, and it explains scoping/precedence between the session-bound active Space and a per-call space_id override. It does not describe the size or structure of the returned brief beyond a field list.
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?
Three tightly packed sentences, each doing distinct work: what the brief contains, how to use it, and how Space scoping resolves. Zero filler and the most decision-relevant content (original-copy constraint) is front-loaded.
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?
With no output schema, the description carries the burden of describing the return value and does so adequately by enumerating the brief's components. The nested body object is the main gap — an agent gets no hint about which identifiers are required or how they combine to select a brief. Space-override semantics are fully covered.
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%, so the baseline is 3. The description does add real meaning for space_id by explaining the override-vs-session precedence and default source, which goes beyond the schema text. However, the four selector fields inside the required body (businessId, adId, competitorId, angleType) — the ones that determine which brief is produced and whether it is mandatory — get no mention at all.
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 concrete deliverable — a structured brief containing angle type, the shape of a competitor's offer, and the hook pattern — rather than restating the name. It clearly frames the output as an input for drafting original copy, which separates it from data-returning siblings like get_angle_readout or get_competitor_offers. It stops short of naming any sibling explicitly, so an agent must infer the boundary.
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 gives a clear use context ('for writing ORIGINAL copy that argues a competitor's angle') and a hard constraint (never reuse competitor wording; write in the business's voice). It also documents the Space-selection behavior and names set_active_space as the alternative for changing scope. It does not state when to prefer it over get_creative_vocabulary or get_angle_gap, so the exclusion side is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assetGet assetARead-onlyInspect
Fetch one asset by id. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds that the operation is scoped to the active Space with an optional override via space_id. This is useful behavioral context beyond the read-only flag, but it does not disclose error handling or return format.
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, with the primary action in the first and scoping behavior in the second. No fluff or redundant content.
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 simple getter with two parameters and no output schema, the description covers the key operational aspects: what it fetches, the space scope, and the override mechanism. It lacks explicit return-value information, but that is not necessary for a straightforward read of an asset.
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 schema provides a detailed description for space_id, but asset_id remains undocumented. The description's 'by id' hints at the asset_id parameter without adding format details; the parameter name itself is self-explanatory. With 50% schema coverage, the description adds limited semantic value beyond what is already in the schema.
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 opens with 'Fetch one asset by id', which uses a specific verb ('Fetch') and resource ('asset') and clearly distinguishes it from list_assets and other getters. The additional scoping mention further clarifies the exact operation.
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 explains the tool's scope ('Scoped to the active Space') and directs users to set_active_space to switch, or to pass space_id for a one-off override. This provides clear context for space handling, though it does not explicitly name an alternative for fetching multiple assets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_authenticated_token_infoGet authenticated token infoARead-onlyInspect
Return the owner, plan, and scope set of the API token currently in use, plus scheduling.timezones — the per-platform connected-account timezone, keyed by platform id, that ad-schedule hours are interpreted in. Cheap, no side effects — useful as a connection check and to learn your scheduling timezone before setting ad schedules.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true, and the description adds 'Cheap, no side effects' plus the semantic role of scheduling.timezones. This goes beyond the annotation by explaining behavior and use implications.
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 sentences: the first front-loads the return values, the second adds cost and usage. Every word earns its place; no redundancy or filler.
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?
Given zero parameters and no output schema, the description fully specifies what is returned (owner, plan, scope, scheduling.timezones) and when to use it. It is self-contained and leaves no critical gaps.
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 has zero parameters and the input schema is empty (100% coverage). Baseline 4 applies, and the description adds return-value semantics, which is more than sufficient for a parameterless tool.
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 specific verb and resource: 'Return the owner, plan, and scope set of the API token currently in use'. It clearly distinguishes this from sibling getters by focusing on the token itself rather than platform entities.
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?
Provides clear usage contexts: 'useful as a connection check and to learn your scheduling timezone before setting ad schedules'. It does not explicitly exclude alternatives, but none apply given the token-focused scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_brake_statusGet Emergency Brake statusARead-onlyInspect
Read the Emergency Brake state on its own: whether it is armed, whether it is engaged right now, the events it has recorded (each with the budget crossed, the spend measured, and the exact campaigns paused), and which levels the user has overruled for the current month. Cheap to poll, no side effects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, but the description adds value by explicitly stating 'no side effects' and 'cheap to poll', which informs the agent that frequent calls are safe. It also details the specific data returned (events with budget crossed, spend measured, campaigns paused), giving a clear behavioral picture beyond the annotation.
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 a single, well-structured sentence that front-loads the core purpose ('Read the Emergency Brake state on its own') and packs additional detail into each clause without redundancy. Every piece of information serves a purpose, making it concise yet comprehensive.
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?
Despite the lack of an output schema, the description fully explains what the tool returns: armed status, engagement status, recorded events with details, and overridden levels. It also adds operational context ('cheap to poll, no side effects'). For a simple read-only tool with no inputs, this is complete.
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 has zero parameters and the schema is empty, so the description does not need to explain parameter meaning. Per the calibration guide, a tool with 0 params receives a baseline of 4. The description appropriately focuses on the output rather than inputs.
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 the specific verb 'Read' and clearly identifies the resource as the Emergency Brake state, enumerating exactly what it returns (armed, engaged, events, overrides). This distinguishes it from the sibling tool 'release_brake', which is an action tool.
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 phrase 'on its own' indicates this is a standalone status-check tool, and 'Cheap to poll, no side effects' implies it can be called frequently for monitoring. However, it does not explicitly name alternatives or state when not to use it, so it falls 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.
get_budgetGet budgetARead-onlyInspect
Read the account's budget and the state of its Emergency Brake: the configured amount and period, the derived daily/monthly caps, the currency, whether the brake is armed, and whether it is currently engaged (and which campaigns it paused). Read-only. Scoped to the active Space.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation is reinforced and expanded by the description, which details exactly what is returned (budget config, caps, currency, brake state, paused campaigns). It also discloses the scope constraint (active Space). This adds meaningful behavior beyond the annotation alone.
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 four short sentences with a clear front-loaded verb and resource. The long list of return values is necessary and organized with colons and commas, avoiding redundancy. The 'Read-only' phrase is slightly redundant with the annotation but still brief.
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?
Even without an output schema, the description enumerates all the data the tool returns, including budget, caps, currency, and brake engagement details. It also specifies the active Space scoping. For a getter with no parameters, this is fully sufficient to understand behavior.
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 has zero parameters, so schema coverage is trivially 100%. The description's reference to the active Space is a contextual scoping, not a parameter. With no parameters, the baseline score of 4 applies.
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 clearly states the tool reads the account's budget and Emergency Brake state, listing specific attributes. However, it does not explicitly distinguish itself from the sibling get_brake_status, which likely covers the brake-state portion. The verb and resource are specific, but sibling differentiation is absent.
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 notes the operation is read-only and scoped to the active Space, providing clear context for when to invoke it. It doesn't mention alternatives or exclusions, such as using get_brake_status for brake-only queries. Thus it offers clear context but no explicit alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_businessGet businessARead-onlyInspect
Fetch one business by id, including its brand voice profile (tone dials, promises, banned phrases) when set. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful behavior: the inclusion of brand voice profile when set, scoping to the active Space, and the one-call override via space_id. It does not contradict annotations and provides context beyond the structured data.
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 sentences, front-loaded with the core action and details, with no fluff. Every clause adds value: what is fetched, what is included when set, scoping, and how to override.
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 single-get read-only tool with no output schema, the description adequately hints at return contents (business plus brand voice profile) and explains the Space scoping. It does not mention error cases (e.g., not found), but the tool's simplicity and readOnlyHint keep this from being a major gap.
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 description reinforces the space_id override meaning already present in the schema, but business_id has no schema description and the description only says 'by id' without format or type guidance. With 50% schema coverage, the description partially compensates but leaves business_id vague.
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?
Description uses a specific verb ('Fetch one business by id') and identifies the resource (business) with a clear scope (single vs. list). It also distinguishes from siblings like list_businesses and update_business by emphasizing the read-only retrieval of a single entity and the optional brand voice profile.
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 clearly states the active-Space scoping and directs the user to set_active_space for switching or pass space_id to override. This gives actionable context on when to use the tool, though it does not explicitly name an alternative for fetching all businesses (list_businesses).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignGet campaignARead-onlyInspect
Fetch one campaign by id. Returns the full campaign object. adScheduleStructured is the canonical weekly schedule (always present when a schedule is set) and adScheduleStructured.timezone is the effective IANA zone; adSchedule echoes the legacy enum when one was used. adScheduleUseSearcherTimeZone (Microsoft only) indicates the schedule is interpreted in the searcher's local time. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_id | Yes | Campaign id (as returned by list_campaigns). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behavioral nuances: adScheduleStructured is canonical, adSchedule is a legacy echo, timezone semantics, and the Microsoft-only searcher timezone flag. It also clarifies that scoping defaults to the active Space and can be overridden, which is essential operational knowledge.
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 well-structured, front-loaded with the core purpose, and uses subsequent sentences for schedule field clarifications and scoping. It is slightly dense with adSchedule technical details, but each sentence contributes meaningful information and there is no fluff.
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?
With no output schema, the description takes on the burden of explaining return value nuances. It thoroughly covers the tricky adSchedule fields, timezone behavior, and Space scoping, leaving little ambiguity for the agent. The only omission is error/not-found behavior, but that is not critical for a get-by-id tool.
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 for parameters is 100%, with detailed descriptions for both campaign_id and space_id. The tool description does not add new parameter-level semantics beyond what the schema already states; it merely restates the scoping override concept. This meets the baseline for full schema coverage.
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 opens with a specific verb and resource: "Fetch one campaign by id." It clearly differentiates from sibling tools like list_campaigns and get_campaign_asset by focusing on a single campaign object retrieval. The mention of returning "the full campaign object" further reinforces its singular scope.
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 explains the active Space scoping and explicitly points to set_active_space and the optional space_id override for one-off calls. It does not explicitly contrast with list_campaigns, but the context implies use cases for fetching a single known campaign.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaign_assetGet campaign assetARead-onlyInspect
Fetch one campaign-asset link. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_asset_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation, and the description adds meaningful context about Space scoping and the space_id override behavior. This goes beyond the annotation without contradicting it, though it does not detail return format or error cases.
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 two sentences, front-loaded with the action, and succinctly explains the scoping override. Every sentence serves a purpose with no waste.
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 simple read operation, the description covers the essential aspects: what is fetched, the scope, and how to override. The presence of readOnlyHint and clear purpose makes the tool self-contained without needing to explain return values or side effects.
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 schema covers space_id in detail, and the description reinforces its override purpose. However, campaign_asset_id is only implicitly defined by the phrase 'one campaign-asset link' and lacks any schema description. With 50% schema coverage, the description partially compensates but leaves the required parameter undefined.
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 opens with 'Fetch one campaign-asset link,' which uses a specific verb and resource, clearly distinguishing this from listing tools like list_campaign_assets or getting the asset itself via get_asset. The scope to a single item is explicit and matches the singular tool name.
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 provides clear context on Space scoping and how to override with space_id or switch via set_active_space. It does not explicitly mention when not to use this tool or name alternatives, but the singular 'one' implies use for individual fetches rather than lists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_competitorGet competitorARead-onlyInspect
One competitor with its confirmed ad library accounts and summary. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description adds real behavior beyond that by noting the accounts returned are only *confirmed* library accounts and that reads are scoped to the active Space session binding. The override semantics are conveyed, though the description does not cover failure behavior for an unknown competitor_id.
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 compact sentences, front-loaded with what is returned and followed by the scoping caveat. The scoping sentence largely restates the space_id schema description, which is mild redundancy but not enough to warrant trimming.
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 simple two-parameter read tool with no output schema, the description tells the agent what the result contains (competitor, confirmed ad library accounts, summary) and how the Space context is resolved. Nothing essential to calling it correctly 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?
Schema description coverage is 100% and the space_id field already spells out the override-versus-session default in more detail than the description does. The description adds no meaning to competitor_id beyond what the schema states, so baseline 3 applies.
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 the resource precisely — a single competitor returned with its confirmed ad library accounts and a summary — which lets an agent distinguish it from list_competitors (plural) in the sibling set. The verb is implicit ('one competitor with...') rather than an explicit 'get', but the singular scope is unambiguous.
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?
Usage guidance is limited to Space scoping: read the active Space, use set_active_space to switch, or pass space_id as a one-call override. There is no guidance on when to choose this over list_competitors, get_competitor_coverage, or get_competitor_auction, so the retrieval-singular use case is only implied by the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_competitor_allowanceGet competitor allowanceARead-onlyInspect
How many competitors the plan tracks per business, how many are tracked, and the monthly ad library lookup allowance. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | No | The business id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description needn't explain safety. It adds valuable context beyond annotations: the tool is scoped to the active Space, and space_id overrides that binding for this one call without changing the session. No contradictions.
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 sentences with zero waste. The first front-loads exactly what is returned, and the second immediately covers the Space scoping and alternative.
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 read-only tool with no output schema, the description adequately conveys the return values and the Space-scoping behavior. It leaves a minor gap: with zero required parameters, it does not clarify how optional business_id behaves (e.g., omitted means all businesses or a default).
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%, so both parameters are fully documented. The description reinforces the space_id override semantics (matching the schema) but adds no new meaning for business_id, so baseline 3 applies when the schema does the heavy lifting.
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 exactly what the tool reports: per-business competitor tracking limits, current tracked count, and the monthly ad library lookup allowance. It distinguishes itself from siblings like get_competitor and list_competitors by focusing on plan quotas/allowances rather than entity data, though it doesn't use an explicit verb.
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 clearly explains Space scoping and explicitly names set_active_space as the alternative for switching, plus the space_id override for a single call. It does not say when to prefer this over adjacent read tools such as get_competitor_coverage or account_summary, but provides clear context for the Space dimension.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_competitor_auctionGet competitor auction dataARead-onlyInspect
Where a competitor meets the business in its OWN auctions, per connected platform: overlap rate, how often they rank above, outranking share, top-of-page rates, a 13-week trend, and the business's impression share lost to rank. A platform with no auction data says why instead of returning zeros. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint; the description adds non-obvious behavior — a platform with no auction data explains why rather than returning zeros, preventing an agent from misreading empty results as a competitive gap. It also discloses Space scoping and the per-call override. It does not cover data freshness or sync prerequisites.
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?
Front-loaded with the resource and its metric list, then behavior, then scoping. The metric enumeration is dense but each item tells the agent what it will get; no filler sentences.
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?
With no output schema, the description carries the burden of describing returns and does so by naming the metric groups. The zero-result behavior note is a meaningful completeness win. Remaining gap is how to obtain a valid competitor_id and whether data depends on a recent sync.
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%, so both parameters are documented in structured fields and the baseline applies. The description's space_id override sentence mostly restates the schema, and it adds nothing about competitor_id — e.g., that IDs come from list_competitors.
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?
States a specific verb+resource (competitor auction data) and enumerates the exact metrics returned: overlap rate, outranking share, top-of-page rates, 13-week trend, impression share lost to rank. This clearly separates it from sibling read tools like get_competitor_coverage or get_competitor_offers, though it never names those siblings explicitly.
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?
Imparts clear context (auction/competitive overlap per platform) and gives actionable scoping guidance, naming set_active_space for switching and explaining the space_id one-call override. It stops short of stating when to prefer this over adjacent competitor tools such as get_competitor_coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_competitor_coverageGet competitor coverageARead-onlyInspect
Which public ad library covers each connected ad platform and for which regions, which platforms have no public library at all, and where auction data comes from. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes | The business id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description's added value is the Space-scoping behavior: reads are confined to the active Space and space_id overrides for a single call only. It adds nothing about freshness/latency of coverage data, permissions, or result shape beyond the conceptual list of what the tool reports.
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 sentences, no filler, with the core 'what data' clause front-loaded and the scoping caveat placed second. The first sentence is a dense three-part list, which is efficient but slightly hard to parse on a first read.
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 two-parameter read-only lookup with no output schema, the description effectively pre-describes the return content by naming the three coverage questions it answers. The only real gap is the opaque business_id, which matters because coverage is presumably per-business.
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%, so both parameters are documented structurally and space_id even explains the override semantics. The description only restates the space_id override and says nothing about business_id beyond what the schema offers ('The business id.'), leaving unclear whether that is the advertiser's business or a competitor's.
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 enumerates the exact content returned: which public ad library covers each connected platform by region, which platforms lack a library, and the source of auction data. That is a specific resource shape distinguishable from siblings like get_competitor_allowance or get_competitor_auction. It never explicitly contrasts itself with those siblings, which keeps it off a 5.
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 gives a real usage rule for Space scoping and points to set_active_space as the switching mechanism, plus the space_id one-call override. It never says when to call this versus the other competitor data tools (get_competitor_auction, find_competitor_library_accounts), so selection between siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_competitor_offersGet competitor offersARead-onlyInspect
Prices, discounts, trials, guarantees and deadlines in a competitor's active ads, each quoted, plus the headline offer and how it changed. Library data shows what a competitor published, never what worked. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds meaningful context beyond that: the data provenance warning ('shows what a competitor published, never what worked') and the fact that offers are returned quoted with change history. It doesn't cover pagination or volume limits, keeping it below 5.
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?
Three tight sentences, front-loaded with what is returned before the provenance caveat and Space scoping. No filler, though the Space sentence is somewhat dense.
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?
No output schema exists, and the description explicitly characterizes the return shape (quoted offer elements, headline offer, change history), so an agent knows what it gets. With annotations covering safety and full schema coverage, nothing essential 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?
Schema coverage is 100%, so both parameters are already documented, including the space_id override semantics. The description echoes the Space behavior but adds no new detail on competitor_id. Baseline 3 applies.
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?
States the resource precisely - offer elements (prices, discounts, trials, guarantees, deadlines) extracted from a competitor's active ads, with quotes and the headline offer. The caveat that library data shows what was published, not what worked helps distinguish it from performance-oriented siblings like get_performance_stats. However, it never names list_competitor_ads, leaving the closest sibling undifferentiated.
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 Space scoping guidance is clear (uses active Space, switch via set_active_space, or override with space_id). But there is no explicit when-to-use vs list_competitor_ads or get_competitor, and the 'never what worked' note is interpretive caution rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conceptGet conceptARead-onlyInspect
Fetch one concept by id. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| concept_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with the readOnlyHint=true annotation, which is good. Beyond that annotation, it adds an important behavioral fact: the fetch is bound to the active Space unless space_id is supplied, plus the override allows reading another Space without changing the session binding.
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 tight sentences put the primary action first, then a single sentence covers Space-scoping, switching, and the per-call override. There is no filler or redundant restating.
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 simple single-fetch operation with two parameters and no nested objects, the description covers the required concept_id, the consequential Space-scoping, and the override path. An agent has everything necessary to invoke it correctly, despite the lack of an output schema.
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 schema fully documents space_id but leaves concept_id as a bare string; '...by id' in the description adds some meaning, clarifying that concept_id is the lookup key. It does not give any formatting or type guidance beyond that, so it's helpful but not comprehensive.
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 opens with 'Fetch one concept by id,' which states a specific verb, a clear resource, and the primary lookup criterion. This decisively distinguishes it from list_concepts, create_concept, update_concept, and delete_concept, even without naming 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?
It clearly says the tool reads a concept in the active Space and points to set_active_space as the way to switch Spaces, with space_id as an optional one-call bypass. It gives solid context for when to call this vs. switching Spaces, although it doesn't explicitly name list_concepts as an alternative for multi-concept fetches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversion_actionGet conversion actionARead-onlyInspect
Fetch one conversion action by id. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| conversion_action_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds behavioral context by explaining the tool is scoped to the active Space and that space_id can override this for one call. This clarifies the dependency on session state, which is valuable beyond the read-only hint.
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 two concise sentences, front-loaded with the primary action and followed by necessary scoping context. No wasted words, every sentence contributes 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 simple get tool with readOnlyHint and no output schema, the description covers the core purpose, scoping, and override mechanism. It doesn't mention return format or error cases, but these are reasonably inferred for a fetch-by-id operation, and the description is sufficient for an agent to select and invoke the tool.
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 schema covers space_id in detail, but conversion_action_id has no description. The description adds clarity by indicating the tool fetches by id, and mentions space_id override, but does not fully compensate for the missing conversion_action_id format or constraints. Schema coverage is 50%, so the description provides only marginal added meaning.
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 clearly states the action: 'Fetch one conversion action by id.' This is a specific verb (fetch) with a specific resource (conversion action) and scope (by id), differentiating it from list_conversion_actions and other get_* tools. The resource and operation are unambiguous.
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 provides context on space scoping and points to set_active_space for switching, with an option to override per call. It implies this tool is for fetching a single known ID rather than listing all, though it doesn't explicitly mention list_conversion_actions as an alternative for browsing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversion_healthGet conversion loop healthARead-onlyInspect
Return conversion-loop health for the active Space — per-source match rate, uploads accepted vs partial-failure, last-event age, and issue codes (NO_SOURCE_CONNECTED, LOW_MATCH_RATE, CLICK_ID_LOOP_BROKEN, CONSENT_MISSING_EEA, ACTION_NOT_PRIMARY, DEV_TOKEN_NOT_ENABLED), plus the trust line (how many real customers worth how much, matched at what rate). The 'is the loop working / how confident' check. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true, and the description does not contradict that. It adds valuable behavioral context beyond the annotation by detailing what the tool returns, including specific issue codes, and by explaining the active-Space scoping and override mechanism.
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 primary action and then packs relevant detail into three sentences. The list of issue codes is extensive but useful for an agent deciding to use the tool. Each sentence earns its place, though the first sentence is somewhat dense.
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?
With no output schema, the description carries the burden of explaining return values, and it does so thoroughly: match rate, upload failures, last-event age, issue codes, and trust line. It also covers scoping and override. It doesn't mention error cases or return format explicitly, but it's complete enough for selecting and invoking the tool.
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% for the single optional space_id parameter, and the schema description already explains the default and override behavior. The tool description repeats this but doesn't add significant new meaning beyond the schema, so the baseline of 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+resource ('Return conversion-loop health for the active Space') and clearly enumerates the exact outputs (per-source match rate, uploads accepted vs partial-failure, last-event age, issue codes, trust line). This distinguishes it from sibling tools like get_conversion_status or get_conversion_report by focusing on health/diagnostic state.
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 identifies the use case as 'The "is the loop working / how confident" check', giving clear context for when to invoke it. It also explains scoping behavior and points to set_active_space as a related tool, though it doesn't explicitly mention alternatives to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversion_reportGet conversion value reportARead-onlyInspect
Return a value-aware conversion report over the configured window — conversions, conversion value, and ROAS (online + offline), so bidding toward Target ROAS can be verified. Pass query-param filters (period, platformId, dates) as keyword arguments — see /api/v1/reports/stats in the OpenAPI spec. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already establishes safety; the description adds useful behavioral context about the active Space scoping and the ability to override it. However, it does not explain the return format or pagination behavior, so it does not fully disclose all behavioral traits.
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 three concise sentences with the primary function front-loaded, followed by filter usage and scope details. Every sentence adds value and there is no redundant wording.
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 read-only report tool with no output schema, the description covers purpose, filters, and scope, and points to the OpenAPI spec for further details. It is sufficient for an agent to invoke correctly, though a brief note on response structure would have made it more complete.
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?
Although the schema covers space_id with a description, the description goes further by naming additional query-param filters (period, platformId, dates) that can be passed as keyword arguments, which is especially valuable because additionalProperties=true and these filters are not in the schema. This adds meaning beyond the structured schema.
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 clearly states the tool returns a 'value-aware conversion report' with specific metrics (conversions, conversion value, ROAS) and the purpose of verifying Target ROAS bidding. This distinguishes it from other report/stat tools like get_performance_stats by focusing on conversion value and ROAS.
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 provides clear context for when to use the tool ('so bidding toward Target ROAS can be verified') and describes scope handling via set_active_space or space_id override. It does not explicitly name alternative tools or exclusions, but the guidance is sufficient for basic selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversion_statusGet offline-conversion statusARead-onlyInspect
Return offline-conversion upload status for the active Space — total count, last upload time, total value, and the most recent uploads — optionally filtered to a single campaign's conversion actions via campaign_id. The cheapest way to verify that the offline conversions you report are actually landing. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. | |
| action_ids | No | Comma-separated conversion-action ids to filter by (alternative to campaign_id). | |
| campaign_id | No | Filter to this campaign's conversion actions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnlyHint=true, and the description consistently describes a read operation. It adds useful behavioral context beyond the annotation: the result scope (active Space), the override behavior via space_id, and the return categories. No contradictions found, and it helps an agent know what to expect from the call.
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?
Three sentences, each earning its place: the first states the core functionality and return content, the second gives the primary use case, and the third clarifies scoping and override behavior. Information is front-loaded and there is no filler.
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?
The description covers the operation, return categories, filtering options, and active Space behavior, which is sufficient for a read-only tool with three optional parameters and no output schema. It doesn't specify exact response shape or limits for 'most recent uploads,' but it gives an agent enough to invoke it correctly.
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 description coverage is 100%, so the schema already documents all three parameters well. The description reinforces the campaign_id filter and space_id override semantics, but does not add substantial meaning beyond what the schema already states. Baseline 3 is appropriate here.
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 ('Return offline-conversion upload status for the active Space') and enumerates the exact data returned: total count, last upload time, total value, and most recent uploads. This clearly distinguishes it from sibling tools like get_conversion_report or get_conversion_health, which serve different purposes.
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 explains when to use the tool: 'The cheapest way to verify that the offline conversions you report are actually landing.' It also gives practical scoping guidance, referencing set_active_space and space_id override. It does not explicitly exclude alternatives like get_conversion_report, but the purpose and cost framing provide sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_creative_vocabularyGet creative vocabularyARead-onlyInspect
The closed creative vocabulary the angle plane runs on: angle types (the claims ads argue), concept attributes (wording mechanisms) and business categories. Versioned and append-only — tag with these exact ids; free text is never accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that the vocabulary is versioned and append-only, which meaningfully informs an agent that new entries may appear and existing ones are not replaced. It does not describe response shape, but for a read-only vocabulary lookup that is acceptable.
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 compact, front-loaded with the resource definition, and every phrase earns its place. The second sentence adds behavioral and usage guidance without padding.
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?
Given a single optional parameter, no output schema, and a safe read-only annotation, the description gives enough for an agent to select and invoke the tool appropriately. It does not spell out the exact response fields, but the tagging instruction implies the needed output well enough for this simple retrieval tool.
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 only parameter, space_id, is fully described in the schema with behavior for defaults and overrides, and schema coverage is 100%. The description itself adds nothing about parameters, but the schema already carries that burden.
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 clearly identifies the resource: the closed creative vocabulary used by the angle plane, listing angle types, concept attributes, and business categories. It is specific enough to distinguish from tools like get_angle or list_angles, though it phrases the purpose as a definition rather than an explicit 'returns/gets' statement.
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 gives a concrete usage rule: tag with exact ids from this vocabulary and never use free text. It does not name sibling alternatives or state explicitly when not to use the tool, but the tagging instruction makes the practical context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_keywordGet keywordARead-onlyInspect
Fetch one keyword by id. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| keyword_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint: true, and the description adds valuable behavioral context: the operation is scoped to the active Space and can be overridden with space_id. This goes beyond the annotation's simple safety hint and explains a session-dependent behavior.
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 two sentences, with the first sentence giving a clear, front-loaded purpose and the second adding scoping behavior. No unnecessary words or repetition.
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 simple read tool with readOnlyHint and no output schema, the description covers the core purpose and the space-scoping nuance. It omits details like not-found behavior or return format, but these are not critical given the tool's simplicity and the existing annotations.
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 schema already thoroughly describes space_id, but keyword_id has no description. The description adds minimal meaning by stating 'by id', which implies keyword_id is the identifier. With 50% schema coverage, the description does not fully compensate for the undocumented keyword_id parameter.
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 'Fetch one keyword by id' clearly identifies the action (fetch), the resource (one keyword), and the retrieval mechanism (by id), distinguishing it from list_keywords and other get_* tools. It also adds scoping context, making the purpose unambiguous.
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 states the tool is scoped to the active Space and explicitly directs users to set_active_space for switching or pass space_id to override per call. This provides clear context for use, though it does not explicitly contrast with list_keywords for fetching multiple keywords.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_briefingGet the latest briefingARead-onlyInspect
What the growth manager last wrote in a briefing for the active Space: the period it covers, its words as the Space's members read them, and the changes it prepared with their status. Returns 404 NO_BRIEFING when none has been written yet. Read-only. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already covers the safety profile, so the description's 'Read-only' restates it, but it adds genuinely new behavior: the 404 NO_BRIEFING empty-state signal and the Space-scoping/override semantics. It stops short of saying how a stale briefing is represented or whether the response is cached.
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?
One dense paragraph, front-loaded with what is returned before the edge cases and scoping rules. Every clause carries information, though the 'Read-only' sentence is redundant with the annotation and could be dropped.
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?
With no output schema, the description compensates by describing the return payload's three components and the error case, which is what an agent needs. The only missing piece is disambiguation from get_answer_brief in a very large sibling set.
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 description coverage is 100% and the single space_id parameter is fully documented there, including the pattern and session-binding behavior. The description's 'pass space_id to override for this one call' merely echoes the schema, so baseline 3 is right.
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 resource (the growth manager's latest briefing) and enumerates its contents — covering period, text, and prepared changes with status. That is far more concrete than the title. It does not, however, distinguish itself from the similarly named sibling get_answer_brief, which an agent could easily confuse with it.
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 gives clear usage context: read the briefing for the active Space, use set_active_space to switch, or pass space_id for a one-off override, and expect 404 NO_BRIEFING when nothing exists. The one gap is that no alternative tool is excluded — get_answer_brief is never mentioned as the thing to use for a different kind of brief.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_own_ad_readingGet what the business's ads argueARead-onlyInspect
The business's active ads grouped by the angle each argues: confirmed stamps, provisional readings of the copy (never written to the ad, never counted in angle results until a person confirms them) and ads that could not be read yet. Show the readings to the user before confirming any. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes | The business id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint, the description discloses important behavior: provisional readings are never written to the ad and are not counted in angle results until a person confirms them. It also explains the confirmation workflow and Space scoping, which are meaningful operational details for an agent.
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 behavior, followed by a clear user-facing instruction and then scope guidance. Every sentence earns its place, and the parenthetical clarifies rather than bloats.
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 read-only tool with two parameters and no output schema, the description gives enough context about the grouped return categories and the confirmation workflow. It could say more about pagination or exact response shape, but nothing critical is missing 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?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description reinforces that business_id selects the business and that space_id overrides the active Space for one call, but adds little syntax or semantic detail beyond the schema.
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 clearly identifies the resource and result: active ads grouped by the angle each argues, including confirmed, provisional, and unreadable readings. It is specific enough for an agent to distinguish this from a plain ad list, though it does not explicitly name a sibling tool or state the verb as directly as it could.
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 gives a clear workflow instruction: show readings to the user before confirming any. It also explains Space scoping and points to set_active_space or the space_id override. It does not explicitly state when to prefer this over list_ads or get_ad, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_performance_statsGet performance statsARead-onlyInspect
Return aggregated performance stats (impressions, clicks, conversions, spend) over the configured window. Pass query-param filters as keyword arguments — see /api/v1/reports/stats in the OpenAPI spec for the full filter set. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide readOnlyHint=true, so the read-only behavior is already declared. The description adds valuable context: the data is over a 'configured window', filters are passed as query params, and the operation is scoped to the active Space. This goes beyond annotations by explaining the scoping mechanism and the nature of the returned aggregates.
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 three sentences, each serving a distinct purpose: stating the return value, explaining filter usage, and clarifying Space scoping. There is no redundant text or filler. It is compact, front-loaded with the core action, and every sentence 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?
The tool has no output schema, so the description partially covers the return fields by listing impressions, clicks, conversions, and spend. It also provides the endpoint reference for more details. It doesn't specify the response structure (e.g., array vs object), but given the readOnly annotation and the mention of the spec, it is reasonably complete for an agent to invoke correctly. A minor gap is the meaning of 'configured window', which is left unexplained.
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 schema defines space_id with a clear description and allows additional properties, but doesn't explain that additionalProperties correspond to query-param filters. The description explicitly states to pass query-param filters as keyword arguments and references the OpenAPI spec for the full set. This significantly enriches the parameter semantics beyond the schema alone.
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 clearly states the tool returns aggregated performance stats (impressions, clicks, conversions, spend) over a configured window. This specific verb+resource+scope distinguishes it from sibling getters like get_ad or get_campaign, which fetch individual entities. The mention of 'aggregated' and 'performance stats' makes the purpose unambiguous.
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 explains how to use query-param filters via keyword arguments and points to the OpenAPI spec for the full filter set. It also clarifies the Space scoping and how to override it with space_id or by using set_active_space. While it doesn't explicitly name alternative tools to use instead, the context is clear that this is the tool for aggregated stats and not for single-object data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sync_statusGet sync statusARead-onlyInspect
Return a sync's status, per-campaign progress, totals, and structured errors. Use effectiveStatus: queued/in_progress (keep polling), stalled (no activity for over ten minutes; it is closed automatically, and a new sync is blocked until then), completed, partial (some campaigns failed), failed, cancelled — the last four are terminal. Failed/partial campaigns carry structured detail in progress.campaignDetails[].errorDetails (Google policyName/fieldPath/trigger, Microsoft PartialErrors) plus a string in .error, and every failure counted in totals.errors is listed in errors. An ad the platform is still reviewing is NOT a failure: it appears in warnings with code PLATFORM_REVIEW_PENDING, the sync stays completed, and the next sync after the review sends it — do not edit or recreate the ad. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| sync_id | Yes | The syncId returned by trigger_sync. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Consistent with readOnlyHint=true and adds substantial context beyond annotations: stalled syncs auto-close and block new syncs, the four terminal statuses, where detailed provider errors live (progress.campaignDetails[].errorDetails, errors, totals.errors), and that PLATFORM_REVIEW_PENDING is a warning, not a failure, with an explicit do-not-edit instruction.
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?
Front-loaded with the return payload, then status semantics, then error shapes, then Space scoping – a sensible order. It is dense and long, and the PLATFORM_REVIEW_PENDING guidance sits slightly outside the stated purpose, but nearly every sentence carries actionable information.
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 read-only polling tool with a fully-described 2-param schema and no output schema, the description covers return shape, status lifecycle, error locations, and Space scoping. An agent has everything needed to call it and interpret the result.
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 description coverage is 100%, so both sync_id (from trigger_sync) and space_id (one-call override that does not rebind the session) are already fully documented in the schema. The description reinforces the space-override behavior but adds no new syntax or format semantics. Baseline 3 applies.
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?
States a specific verb (return), resource (a sync's status) and enumerates exactly what comes back: status, per-campaign progress, totals, structured errors. This is clearly distinguishable from list_syncs (enumerating syncs) and cancel_sync (mutating one).
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?
Explicitly tells the agent which effectiveStatus values mean 'keep polling' vs which are terminal, and routes to set_active_space / space_id for cross-Space reads. It stops short of naming sibling alternatives like list_syncs or trigger_sync, so it's clear context but not a full when/when-not decision tree.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ad_assetsList ad assetsARead-onlyInspect
List asset-to-ad / ad-group attachments. Exactly one of ad_id / ad_group_id / campaign_id is required (campaign_id returns every ad-level binding in the campaign). Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Filter by role (e.g. MARKETING_IMAGE, LOGO, YOUTUBE_VIDEO). | |
| ad_id | No | Restrict to bindings for this ad. | |
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| ad_group_id | No | Restrict to bindings for this ad group. | |
| campaign_id | No | All ad/ad-group bindings across this campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description does not contradict this. The description adds valuable behavioral context: the mutually exclusive required IDs (a constraint not reflected in the schema's required list), the Space scoping behavior, and how campaign_id expands the scope. It does not mention pagination or return format, but given the annotation coverage, the added context is significant.
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 two sentences long, front-loaded with the core purpose, then the critical constraint, then the scoping behavior. Every clause earns its place with no filler or redundancy. It is highly scannable and efficient.
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 7-parameter tool with no output schema, the description gives the essential selection rules and scoping mechanism. The main gap is that it does not describe what the response items look like (e.g., whether each binding includes full asset objects or just IDs), but this is not strictly required without an output schema. The description is sufficient for an agent to decide when to call the tool and set up valid parameters.
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 description coverage is 100%, so the schema already documents each parameter. The description adds essential semantic value beyond the schema by stating the 'exactly one of ad_id / ad_group_id / campaign_id' mutual-exclusion rule, which the schema does not encode. It also clarifies the space_id override behavior. This elevates it above the baseline 3 for high schema coverage.
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 clearly states the tool 'List asset-to-ad / ad-group attachments', which is a specific verb+resource that distinguishes it from sibling tools like list_assets (which lists assets themselves) and list_campaign_assets. The added detail about campaign_id returning 'every ad-level binding' further disambiguates its scope.
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 the core usage constraint: 'Exactly one of ad_id / ad_group_id / campaign_id is required', and explains the behavior for campaign_id. It also directs users to set_active_space for switching spaces or passing space_id to override. However, it does not explicitly contrast with list_assets or say 'use this instead of X when you need bindings' — the distinction is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ad_groupsList ad groupsARead-onlyInspect
List ad groups across visible campaigns, or in one campaign with campaign_id. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_id | No | Only return the ad groups of this campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description adds genuinely new behavioral context: results are scoped to the active Space session binding, and space_id overrides it for this call only without mutating the session. Only pagination/return-format detail (beyond what schema and meta.nextCursor already imply) is absent.
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 dense sentences with zero waste; the primary scope rule comes first, followed by the Space-override mechanics. Nothing is repeated verbatim from the schema.
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 read-only list tool with fully documented parameters and no output schema, the description covers scope, session behavior, and override path—enough to invoke correctly. Return shape and pagination handling are only indirectly covered via the cursor parameter.
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%, so limit, cursor, space_id and campaign_id are all documented in structured data. The description adds only a light usage hint that campaign_id narrows to one campaign, which the schema already states — 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?
States a specific verb+resource ("List ad groups") and defines scope precisely: all visible campaigns, or narrowed to one via campaign_id. This distinguishes it from get_ad_group (singular) implicitly, though it never names a sibling explicitly.
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?
Explains how to narrow scope with campaign_id and where the data comes from (the active Space), and names the alternative mechanism for changing scope — set_active_space — or the per-call space_id override. Clear context, but no explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_adsList adsARead-onlyInspect
List ads across visible campaigns. Pass campaign_id or ad_group_id to scope the result server-side (recommended — otherwise the whole Space is returned and can overflow the response budget). Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| ad_group_id | No | Only return ads in this ad group (server-side scope). | |
| campaign_id | No | Only return ads in this campaign (server-side scope). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds valuable behavioral context: the risk of response overflow when unscoped, the 'visible campaigns' filter, and the active Space scoping semantics with override capability. This goes beyond the annotation without contradiction.
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 sentences, front-loaded with the core purpose, and every clause earns its place: the first sentence defines the action, the second explains scoping and overflow risk. No redundancy or filler.
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?
Given the tool's read-only nature, 100% schema coverage for parameters, and absence of an output schema, the description sufficiently covers scoping, response size risk, and Space behavior. Minor gaps include the unspecified interaction when both campaign_id and ad_group_id are provided, but overall it is complete enough for selection and 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 schema provides 100% coverage for all five parameters, so the baseline is 3. The description adds meaning by explaining the recommended use of campaign_id or ad_group_id and the consequence of omitting them, which is not fully captured in the schema's individual parameter descriptions.
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 clearly states 'List ads across visible campaigns' with a specific verb and resource, distinguishing itself from sibling tools like get_ad, list_ad_groups, and list_campaigns by focusing on the ads collection. The mention of scoping options adds further precision.
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?
Explicitly recommends passing campaign_id or ad_group_id to scope results server-side and warns that omitting them returns the whole Space, which can overflow the response budget. It also instructs users on managing the active Space via set_active_space and the space_id override, providing clear context but no explicit comparison to alternative list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_anglesList anglesARead-onlyInspect
List the angles (claims your ads argue) in the active Space. An angle is business-scoped and is the unit results are decided at. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| angle_type | No | Only return angles of this registry type (see get_creative_vocabulary). | |
| business_id | No | Only return angles for this business. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: output is scoped to the active Space, the scope can be locally overridden with space_id, and angles are business-scoped with results decided at the angle level. No behavior contradicts the annotation.
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 sentences, roughly 45 words, with the action and scope front-loaded in the first sentence; the second sentence gives the override semantics. Every clause earns its place — the domain definition, the scope binding, and the alternative path are all present with zero filler.
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-required-parameter, read-only list tool with 100% schema coverage, nothing needed for a correct call is missing: pagination mechanics live informatively in the cursor parameter explicitly referencing meta.nextCursor, return limits are in the schema, and scope override is in the description. The output schema is absent but unnecessary here since list endpoints of this shape have self-evident returns.
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% — all five optional parameters have type, range, pattern, and description, including defaults and max for limit and pagination for cursor. The description adds only indirect context (angle is business-scoped, which makes business_id semantically coherent) but no parameter-specific detail, so the baseline of 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?
States a specific verb plus resource in the very first clause — list the angles — and immediately defines what an angle is (claims your ads argue) plus its scoping trait (business-scoped, the unit results are decided at). This clearly separates it from sibling list tools like list_ads or list_concepts, and its plural verb distinguishes it from the singular get_angle.
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?
Gives explicit operational context: the tool reads from the active Space and tells the agent exactly how to redirect — set_active_space to switch or pass space_id to override for just this one call. It does not explicitly name an alternative tool for retrieving a single angle, but the list/get verb contrast and the sibling set make that distinction natural rather than ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assetsList assetsARead-onlyInspect
List assets owned by this token's user. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is known. The description adds the ownership and space-scoping behavior, including the override capability, but doesn't detail pagination or return format.
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 compact sentences that front-load the tool's purpose and include only essential scoping guidance.
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?
The description, schema, and annotations together cover the tool's purpose, scoping, and safety. The lack of output schema is fine for a simple list operation, and pagination is documented in the schema.
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 schema has 100% coverage for all three parameters, so the description doesn't need to add parameter details. It does reinforce the space_id semantics by explaining the active Space concept, but no additional meaning beyond the schema.
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 clearly states it lists assets owned by the token's user, with a specific scope (active Space). This distinguishes it from sibling list tools like list_ad_assets or list_campaign_assets.
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 explains scoping to the active Space and points to set_active_space for switching, plus offers space_id override for a single call. This is clear context for when/how to use, though it doesn't explicitly contrast with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_businessesList businessesARead-onlyInspect
List the businesses in this account. A business is what the user is growing (a school, a course, a SaaS product, a local service) — its name, website, what it does, who it is for, and its key pages. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares the tool safe, and the description adds valuable behavioral context: the scoping to active Space and the ability to override with space_id. It also clarifies the entity definition, which helps set expectations for the data returned. No contradictions 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 two sentences, front-loaded with the core purpose, and every clause earns its place. It defines the domain, explains scoping, and references the alternative approach in a compact, readable manner.
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 simple read-only list tool with strong annotations and full schema coverage, the description is complete. It explains the domain concept (business), scoping behavior, and override option. No output schema is present, but the return value is implied by the list action and pagination schema. No additional context is needed.
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 schema already covers all parameters (100% coverage), setting a baseline of 3. The description adds semantic value by explaining the 'space_id' override mechanism and its relationship to set_active_space, which goes beyond the schema's technical description. It also links the pagination parameters to typical list behavior implicitly.
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 the specific verb 'List' and clearly identifies the resource as 'businesses', with a clarifying definition of what a business is in this context (school, course, SaaS product, etc.). It also distinguishes itself from sibling list tools by focusing on the 'business' entity and notes the scoping to active Space, which is a unique aspect.
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 provides clear usage context by explaining that the list is scoped to the active Space and explicitly instructs to 'see set_active_space to switch, or pass space_id to override'. While it doesn't explicitly mention alternatives like get_business, the context is sufficient for a list tool, and the scoping guidance is practical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaign_assetsList campaign assetsARead-onlyInspect
List asset-to-campaign attachments. At least one of campaign_id / asset_id is required. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| asset_id | No | Restrict to attachments for this asset. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_id | No | Restrict to attachments for this campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses non-obvious behavioral constraints: a mandatory filter (at least one of campaign_id/asset_id), default scoping to the active Space, and the ability to override with space_id for a single call. These are essential operational details not implied by the annotation alone.
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 two sentences with the primary action front-loaded. Every clause contributes a distinct piece of information: the action, the required filter, and Space scoping. No redundant or filler words.
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?
The description covers the essential context: the action, required filter, Space scoping, and override. With 5 well-documented parameters and no output schema, it is mostly complete. A minor gap is that it doesn't describe the return structure or pagination behavior beyond the schema's cursor description, but this is not critical for a list operation.
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 schema already covers all parameters with 100% description coverage, so the baseline is 3. The description adds the crucial cross-parameter constraint that campaign_id or asset_id must be present, which is not reflected in the schema's required field list, and clarifies the space_id override behavior. This adds meaningful value beyond the schema.
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 clearly states the specific action ('List asset-to-campaign attachments') and the exact resource relationship, distinguishing it from sibling tools like list_assets and list_ad_assets. The verb 'list' and the resource 'asset-to-campaign attachments' are unambiguous.
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 provides explicit context for when to use the tool: at least one of campaign_id/asset_id is required, and it explains Space scoping with a reference to set_active_space and the space_id override. While it doesn't explicitly name alternative tools for different attachment types, the context is sufficient for an informed agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaignsList campaignsARead-onlyInspect
List campaigns visible to this token. Returns an array of campaign objects with fields like id, name, type, budget, status, languages, locations. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds useful behavioral context: results are fed by token visibility, and results are restricted to the active Space unless overridden. It also hints at return fields, though pagination specifics are left to the schema.
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 information-dense sentences pack in the action, scope, return fields, and optional override. Nothing is redundant; every clause 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?
The description completes the picture for a list tool: it tells what is returned, the scope constraints, and how to adjust scope. Given the schema already documents pagination parameters and there is no output schema, this is sufficiently complete.
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%, so the parameters are already fully described. The description reinforces the space_id parameter's behavior (override for one call) but adds no new detail about limit or cursor, meriting the baseline score of 3.
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 clearly states the action ('List campaigns'), the scope ('visible to this token'), and the returned data shape (array with id, name, type, budget, etc.). It effectively distinguishes from sibling tools like get_campaign and list_campaign_assets by focusing on the campaign objects themselves and Space scoping.
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?
Provides clear context on Space scoping: how the active Space is used, that set_active_space can change it, and that space_id can override one call. However, it does not explicitly reference alternatives (e.g., use get_campaign for a single campaign) or when-not-to-use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_competitor_adsList competitor adsARead-onlyInspect
The ads a competitor published in the public ad libraries, active first, each with its library, dates, angle type and the offers in its copy. Library data shows what a competitor published, never what worked. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| source_id | No | One library. | |
| angle_type | No | An angle type id from get_creative_vocabulary. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile with readOnlyHint=true, so the description is free to add genuinely new context: default ordering ('active first'), the per-ad payload fields, the epistemic caveat that library data shows publication not performance, and how space scoping behaves for this call. It omits pagination/default-limit behavior, which matters at a 500 max.
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?
Three front-loaded sentences with no filler: purpose and payload first, the interpretive caveat second, the scoping mechanics last. Each sentence carries distinct information an agent needs, including the return shape, which matters since there is no output schema.
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?
With no output schema, the description correctly spends words on what each ad returns and the ordering. It is nearly complete for a read-only list tool, with the main residual gap being pagination and how limit interacts with the 'active first' ordering.
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?
At 67% schema description coverage, the schema already documents space_id, source_id, angle_type and competitor_id. The description reinforces the space_id override semantics but adds nothing for limit, status, or source_id ('One library.' is opaque in both places). Baseline 3 is appropriate — the description neither compensates for the gaps nor contradicts the schema.
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?
Names a specific resource with scope: ads a competitor published in public ad libraries, including what each record carries (library, dates, angle type, offers in copy). It implicitly separates itself from get_competitor_offers by noting offers come from the ad copy, but it never names a sibling tool as an alternative, so it falls short of a 5.
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?
Gives a clear interpretive constraint ('library data shows what a competitor published, never what worked') that tells the agent when this data is and isn't appropriate. It also resolves the space ambiguity by naming set_active_space as the switching mechanism versus the space_id per-call override. No explicit when-not-to-use guidance against related competitor tools like get_competitor_coverage or get_competitor_auction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_competitorsList competitorsARead-onlyInspect
The competitors of one business: tracked, suggested (with the evidence for each suggestion) and dismissed. A tracked competitor carries a summary: matched ad libraries, active ads, the angle it leads with, and its auction overlap where the user's own ad account reports one. Library data shows what a competitor published, never what worked. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Only this status. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes | The business id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=true; the description adds substantive context beyond that — what a tracked competitor record carries (matched ad libraries, active ads, leading angle, auction overlap where available) and the interpretive limit of library data. It does not mention pagination or result ordering, which for a list tool this size is the remaining gap.
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?
Three sentences, front-loaded with the resource and scope, then the payload shape, then the scoping override. Dense but every clause carries information; the status/evidence detail could be tightened slightly without loss.
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?
There is no output schema, and the description partially compensates by describing what a tracked competitor record contains and by warning about the meaning of library data. Sufficient for an agent to select and call it correctly; a note on result volume or ordering would close the last gap.
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%, so baseline is 3, but the description genuinely adds semantic weight: it explains that 'suggested' entries come with per-suggestion evidence and that 'tracked' entries carry a summary payload, telling the agent what each enum value yields rather than just what it filters on. space_id semantics are left to the schema, which already handles them well.
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?
Names the resource (competitors of one business) and the exact scope of the result set — tracked, suggested with evidence, and dismissed. This distinguishes it from get_competitor (singular fetch), suggest_competitors (generation) and track_competitor (mutation) among the siblings without needing to open any schema.
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?
Explicitly states the Space scoping rule and routes the agent to set_active_space or the space_id override, and adds a real usage caveat: library data reflects what a competitor published, not what worked, so the agent knows not to treat it as performance truth. It stops short of naming when to prefer get_competitor or get_competitor_auction over this list call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_conceptsList conceptsARead-onlyInspect
List concepts (ways of making an angle's claim) in the active Space. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| angle_id | No | Only return concepts of this angle. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
ReadOnlyHint is already true, and the description adds relevant behavior beyond it: results are scoped to the active Space, and a Space override applies only to this one call. This clarifies the session-scope behavior without contradicting the annotation.
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 compact and front-loaded with the key meaning of the resource, then quickly explains the scoping behavior. Each sentence earns its place and there is no redundant wording.
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 simple read-only list with fully documented parameters, the description is essentially sufficient. It does not restate return shape, but pagination via cursor is documented in the schema and read-only behavior is provided by the annotation.
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 description coverage is 100%, so every parameter is already documented clearly in the input schema. The description merely echoes the space_id override concept; it does not add meaningful new parameter context beyond what the schema provides.
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 specific verb and resource: 'List concepts,' and defines what a concept is within this system ('ways of making an angle's claim'). This clearly differentiates the tool from related list operations and makes its domain obvious.
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 gives crisp context for when to use this tool and how to control its scope: use set_active_space to switch spaces or pass space_id to override for a single call. It does not explicitly name exclusions or alternative tools for individual lookups, but that is easily inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_connectionsList ad platform connectionsARead-onlyInspect
List the ad platforms Growomat delivers to and whether this account has connected each one: connected, ready (connected AND an ad account chosen — what trigger_sync needs), the ad account's id, name, currency and time zone, and connection health. Call it before building a campaign: a platform that is not ready cannot be synced to, and budgets are judged in the account's currency (some platforms set a per-currency daily minimum). Connecting a platform happens in the app. Connections belong to the account, not the Space.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already covers the safety profile, but the description adds substantive context: the definition of 'ready' (connected AND an ad account chosen), that currency determines budget validation and per-currency daily minimums, that connecting happens in the app rather than through this tool, and that connections are account-scoped, not Space-scoped. That last point heads off a real scope misunderstanding.
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?
Front-loaded with purpose and actionable guidance, and the enumeration of returned fields earns its place because there is no output schema. It is dense — the currency/minimum and account-scope remarks are packed into single clauses — but nothing is redundant.
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?
With no output schema and no parameters, the description carries the full explanatory burden and does so: it enumerates return fields, defines the readiness semantics that gate trigger_sync, and clarifies the scope of connections. An agent has everything it needs to call it and interpret the result.
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 no parameters, so the baseline is 4; nothing in the schema needs semantic elaboration. The description does not need to compensate for any parameter gaps.
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?
States a specific verb and resource ('List the ad platforms Growomat delivers to') plus the exact per-platform verdicts returned: connected, ready, ad account id/name/currency/time zone, connection health. This is clearly distinguished from siblings like account_summary or list_spaces, which cover different resources.
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?
Gives an explicit trigger ('Call it before building a campaign') and a concrete consequence ('a platform that is not ready cannot be synced to'), tying it to trigger_sync. It lacks an explicit when-not-to-use or a named alternative, which keeps it 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.
list_conversion_actionsList conversion actionsARead-onlyInspect
List the conversion actions in the active Space — what this account counts as a conversion, and how each one is configured (type, category, value settings, lookback windows). Use before uploading a conversion so it lands on the right action. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows to return (default 50, max 200). | |
| cursor | No | Opaque cursor from a previous page's meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds behavioral context about space scoping—that it's scoped to the active Space and can be overridden with space_id—which goes beyond annotations. It doesn't mention pagination, but the schema covers limit/cursor.
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 two sentences, front-loaded with purpose, and every sentence earns its place. No redundancy or fluff.
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 listing tool with no output schema and simple optional parameters, the description provides a clear picture of purpose, usage context, and scoping. It could explicitly mention pagination behavior, but the schema already documents limit and cursor, making it sufficiently complete.
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?
All parameters (limit, cursor, space_id) have descriptions in the schema, providing 100% coverage. The description adds no new parameter semantics beyond restating the space_id override behavior already documented in the schema, so 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 clearly states the tool lists conversion actions in the active Space and describes the configuration details returned (type, category, value settings, lookback windows). This specific verb+resource+scope distinguishes it from siblings like get_conversion_action or list_conversion_sources.
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 says 'Use before uploading a conversion so it lands on the right action' and provides scoping guidance, referencing set_active_space and the space_id override. This gives clear when-to-use context and mentions alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_conversion_sourcesList conversion sourcesARead-onlyInspect
List the revenue/conversion sources connected to the active Space (Stripe, HubSpot, Salesforce, GA4, generic webhook) with their type, status, and config. Use to see which sources are feeding real conversions into Smart Bidding. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, and the description adds useful behavioral context beyond that: it clarifies the scope (active Space), the optional override via space_id, and what is returned. No contradictions with annotations; the description does not need to state read-only because the annotation covers it.
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 three sentences, front-loaded with the core purpose, then the use case, then scope/override instructions. Every sentence adds value with no fluff or repetition of the title/schema.
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 simple read-only list tool with one optional parameter and no output schema, the description covers all needed context: what it lists, example source types, returned fields, how scope works, and how to change scope. It is complete and self-sufficient for an agent to invoke correctly.
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 description coverage is 100%: the only parameter (space_id) is thoroughly described in the schema, including its pattern and default behavior. The description mentions the same override behavior but adds no new parameter details beyond the schema, so 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 clearly states the tool lists conversion sources connected to the active Space, with a specific verb ('List') and resource ('revenue/conversion sources'), plus examples of source types and returned fields (type, status, config). It distinguishes itself from sibling tools like create_conversion_source and list_conversion_actions by focusing on reading existing sources.
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 explicitly tells the agent when to use the tool: 'Use to see which sources are feeding real conversions into Smart Bidding.' It also gives clear context about space scoping and directs to set_active_space for switching or to pass space_id for override. It does not mention explicit alternatives or when-not-to-use cases, but the guidance is sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_disapprovalsList disapprovalsARead-onlyInspect
List every ad and keyword your connected ad platforms are NOT serving — disapproved, limited, or area-of-interest-only — for the active Space, each with its review status and the structured reasons / affected markets behind the decision. The cheapest way to answer "why isn't this ad running?" without paging through every ad and keyword. An empty list means nothing is disapproved, not that the tool failed. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Restrict to one platform. Omit for all connected platforms. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=true, so the description carries most behavioral context. It adds valuable semantics: an empty list means nothing is disapproved, not a failure, and the result includes review status plus structured reasons/affected markets. This goes beyond the annotation and helps an agent interpret results correctly.
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 each sentence adds useful context. There is minor redundancy around active Space scoping appearing in both the first and last sentences, but overall it remains appropriately sized and readable.
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?
With no output schema, the description reasonably explains what the response contains: review status and structured reasons/affected markets. It also covers empty-list interpretation and Space scoping. It doesn't describe pagination or platform-specific edge cases, but for a read-only listing tool with two optional params, the coverage is solid.
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 description coverage is 100%, so both parameters are already well documented. The description reinforces space_id's override behavior and active Space scoping, but it adds little beyond what the schema already states and does not describe the platform parameter's behavior in detail.
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 ('List') and clearly defines the resource: ads and keywords that are NOT serving, including disapproved, limited, or area-of-interest-only items. It further distinguishes itself from sibling tools like list_ads and list_keywords by focusing on non-serving items with review status and structured reasons/affected markets.
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 identifies the best use case: answering 'why isn't this ad running?' without paging through every ad and keyword. It also clarifies active Space scoping and points to set_active_space or space_id to change scope, though it doesn't explicitly say when to use the broader list_ads/list_keywords tools instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_keywordsList keywordsARead-onlyInspect
List keywords across visible campaigns. Pass ad_group_id or campaign_id to scope the result server-side (recommended — otherwise the whole Space is returned and can overflow the response budget). Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| ad_group_id | No | Only return keywords in this ad group (server-side scope). | |
| campaign_id | No | Only return keywords in this campaign (server-side scope). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behaviors: the tool is scoped to the active Space by default, can return the whole Space if unscoped with a risk of overflowing the response budget, and supports per-call Space override via space_id. This adds meaningful context not derivable from annotations alone.
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 two sentences, front-loaded with the core purpose, and every clause contributes meaning (scoping recommendation, space behavior, override option). No redundant or filler content.
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 list tool with no output schema, it explains scoping, Space behavior, and potential overflow. It does not explicitly state the return structure (e.g., list of keyword objects with cursor), but this is somewhat covered by cursor schema referencing meta.nextCursor. Overall adequate for the complexity.
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 schema already provides 100% parameter descriptions, so the baseline is 3. The description adds value by explaining the 'server-side' scoping mechanism and the practical consequence of not using ad_group_id/campaign_id (overflow risk), which goes beyond the schema's individual field descriptions.
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 clearly states the tool 'List keywords across visible campaigns' with a specific verb and resource. It distinguishes itself from sibling tools like get_keyword or list_ads by naming the resource and mentioning scoping by ad_group_id/campaign_id.
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 provides clear usage context: recommends passing ad_group_id or campaign_id to scope results server-side and warns that omitting them may overflow the response budget. It also explains how to switch Space via set_active_space or override per call with space_id, but it does not explicitly contrast with alternatives like get_keyword.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_open_loopsList the open loopsARead-onlyInspect
The promises the growth manager still has to keep for the active Space, soonest first: each change it will report back on, and when. A loop leaves the list once the manager has reported on it. Read-only. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only behavior, and the description adds useful behavioral context beyond that: results are ordered soonest first, scoped to the active Space, and a loop leaves the list once the manager reports on it. It does not cover pagination or detailed return shape, but the key lifecycle behavior is disclosed.
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 short and front-loads the core concept, ordering, and scoping. It is generally efficient, though it repeats the read-only annotation and restates active-Space scoping in both the first and last sentences.
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?
With one fully documented parameter, a read-only annotation, and no output schema, the description gives enough context to call the tool correctly and understand the rough return: each change and when, soonest first. Minor omissions like pagination or exact response fields are acceptable for a simple list operation.
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 description coverage is 100%, so the single space_id parameter is already fully documented in the schema. The description mentions passing space_id as an override for this call, but adds no syntax or semantic detail beyond what the schema already provides.
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 specific resource and scope: open promises/loops for the active Space, ordered soonest first, with each change and its timing. It is clear enough to distinguish this from generic list tools, though it does not explicitly name a sibling alternative beyond set_active_space for switching context.
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?
Usage is implied by the concept of open promises and the lifecycle note that loops disappear once reported on. The description explains how to change or override the active Space, but it does not say when to use this tool versus related siblings such as get_latest_briefing or get_sync_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spacesList spacesARead-onlyInspect
List the Spaces (collaboration workspaces) the API token owner is a member of. A Space holds campaigns; most other tools are Space-scoped. Use a returned id with set_active_space to switch the active Space for subsequent calls, or pass it as space_id on individual calls.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful context by stating that only Spaces the API token owner is a member of are returned. It also explains the relationship between Spaces and campaigns, which aids understanding of the tool's role in the wider workflow.
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 three sentences long with no wasted words. Each sentence earns its place: the first states the core function, the second provides domain context, and the third gives practical usage instructions.
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?
Despite having no output schema, the description provides enough context for a zero-parameter list tool. It explains what Spaces are, how they relate to other tools, and how the returned id should be used, making the tool fully understandable.
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 has zero parameters, so the baseline is 4. The description adds no parameter-specific information because none exist, but it does explain how to use the output id, which is indirectly related to parameters in subsequent calls.
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 clearly states that the tool lists Spaces (collaboration workspaces) the API token owner is a member of, using a specific verb and resource. It also distinguishes the tool by explaining what a Space is and that most other tools are Space-scoped, which clarifies its unique role among siblings.
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 provides clear context for when to use the tool: to discover available Spaces for the token owner, then use the returned id with set_active_space or as space_id. It does not explicitly name an alternative tool, but the guidance is sufficient for a list operation with no direct sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_syncsList syncsARead-onlyInspect
List recent syncs for the active Space (most recent first), with their status and totals. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return. Default 50, max 200. | |
| cursor | No | Opaque pagination cursor returned by the previous page in meta.nextCursor. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares the operation as safe, and the description adds contextual behavior about the active Space scoping and the ability to override with space_id. This is useful but does not go beyond what the annotation and schema already imply. No contradictions found.
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 concise sentences that front-load the main purpose and scope, with no redundant information. 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?
Given the tool's simplicity and the presence of a 100%-covered schema, the description sufficiently covers the operation. It mentions the return contents (status and totals) and pagination is implied via the cursor parameter. However, there is no output schema, so a bit more detail on the return shape could be helpful, but it is not critical for this type of list tool.
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%, with each parameter described in the schema. The description adds no additional parameter semantics beyond what the schema provides, so the baseline of 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 clearly specifies the verb ('List'), the resource ('recent syncs'), the scope ('for the active Space'), and the ordering ('most recent first'). It also mentions the included data ('status and totals'), which distinguishes it from siblings like get_sync_status (single status) and trigger_sync (initiating a sync).
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 provides clear usage context: it is scoped to the active Space, and it explicitly points to set_active_space to switch spaces or space_id to override. It does not explicitly mention alternatives or exclusion criteria, but the scoping guidance is practical and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_campaignPreview campaign adsARead-onlyInspect
Preview how each ad of a campaign will render on every platform, compiled exactly as a sync would send it, plus whether each platform has the media it needs (byPlatform[platformId].ready and .missing). A search ad comes back as text; a post as post; a single-image card (a chat card, type OPENAI_CHAT_CARD) as card — title, body, destinationUrl and imageUrl, with a signed previewUrl you can open. A card format is ready once every ad has an image, its own or one attached with attach_asset_to_ad. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_id | Yes | The campaign to preview. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=true; the description goes well beyond by describing the return shape (byPlatform[platformId].ready and .missing), how each ad type is represented (text, post, card with title/body/destinationUrl/imageUrl and signed previewUrl), and the rule for when a card format is ready. It also discloses Space scoping semantics and how to override them, which is exactly the kind of context annotations cannot convey.
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?
Front-loaded with the core outcome (how each ad renders on every platform) before type-by-type detail and scoping. Dense rather than padded, though the em-dash-heavy enumeration of ad formats is the longest portion and could be tightened slightly.
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?
There is no output schema, so the description carries the burden of explaining return values, and it does: readiness flags, missing-media signals, per-type rendering, and signed preview URLs. Combined with Space-scoping guidance, an agent has everything needed to interpret the response and act on gaps.
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 description coverage is 100% and the single-line space_id description already explains the override behavior, so the description's Space discussion largely restates the schema. campaign_id is not elaborated beyond 'the campaign to preview', which the schema already says. Baseline 3 is appropriate when the schema does the work.
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?
States a specific verb (preview) and resource (campaign ads) and immediately specifies scope: rendering per platform, compiled exactly as a sync would send it. It is clearly distinct from get_campaign (fetch data) and preview_sync_plan (plan-level preview) because it names the per-ad, per-platform rendering output explicitly.
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?
Gives clear context for when to reach for it (checking per-platform rendering and media readiness before a sync) and points to the concrete remediation path 'attach_asset_to_ad' when media is missing. It does not explicitly contrast with the sibling preview_sync_plan, which is the main alternative an agent might confuse this with, so it falls 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.
preview_sync_planPreview sync planARead-onlyInspect
Dry run: compute what a sync would import / export / remove for the active Space, without executing. Use before trigger_sync to see the blast radius. Honours the same campaign_ids hard scope and force as trigger_sync, and returns a planHash you can pass to trigger_sync (plan_hash) to execute exactly this plan or fail on drift. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Preview re-export of in-scope campaigns even when unchanged. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| platforms | No | Platform ids to preview. Omit for all connected. | |
| campaign_ids | No | Hard scope: preview ONLY these campaigns (matches a scoped trigger_sync). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description reveals it returns a planHash that can be passed to trigger_sync to 'execute exactly this plan or fail on drift.' It also discloses that it honors the same campaign_ids hard scope and force as trigger_sync, adding behavioral context that is not in 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 three sentences, with the first sentence being a crisp definition. Each subsequent sentence adds unique value—one addresses usage/return behavior and another scoping—with no redundancy or filler.
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 4-parameter, no-output-schema dry-run tool, the description fully covers purpose, usage, behavioral contract, and scoping. It even explains how the planHash integrates with trigger_sync, making it complete for correct invocation and interpretation of the result.
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%, so parameters are already documented. The description adds cross-references like 'Honours the same campaign_ids hard scope and force as trigger_sync' and explains the space_id override behavior, providing extra meaning beyond the raw schema definitions.
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 opens with 'Dry run' and the specific verb 'compute what a sync would import / export / remove for the active Space, without executing.' This clearly distinguishes it from trigger_sync (which executes) and other sync-related tools, establishing a precise and unambiguous purpose.
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?
Explicit guidance is provided: 'Use before trigger_sync to see the blast radius.' It also explains scoping alternatives—'Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call'—so an agent knows exactly when and how to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_competitorRefresh competitorAInspect
Read a competitor's ad libraries now instead of at the next daily refresh. Uses one monthly library lookup. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The quota disclosure — 'Uses one monthly library lookup' — is exactly the kind of context annotations can't convey, and it explains why readOnlyHint is false despite the read-flavored verb. Space scoping behavior is also clarified. Missing: what happens if the lookup fails or the allowance is spent.
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?
Three short sentences, each carrying distinct information, with the primary action and the cost implication up front. No filler.
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 small two-parameter tool with no output schema, the description covers purpose, cost, and scoping well. It doesn't say what comes back after the refresh (refreshed ad payload, a trigger acknowledgment, or a job) or how failures surface, which matters for an agent deciding whether to read results immediately afterward.
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% and the space_id description in the schema is already thorough; the description essentially restates it rather than adding new meaning. competitor_id gets no added semantics beyond the schema's bare 'The competitor id.'
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?
States a specific verb and resource — pulling a competitor's ad libraries on demand rather than waiting for the daily refresh. This is clearly distinguishable from the read-only siblings like list_competitor_ads or get_competitor, since the point is triggering a fetch now.
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?
Explains exactly when to use it: when you need the data before the next scheduled refresh. Also gives the scoping alternative via set_active_space or a per-call space_id override. It doesn't mention what to do when the monthly allowance is exhausted (get_competitor_allowance), which would complete the guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reject_competitor_library_accountReject library accountAInspect
Say a library account is not this competitor. It stops being read and is never proposed again. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the IdentityReject schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is partly covered. The description adds meaningful behavioral detail beyond annotations by stating that the account stops being read and is never proposed again. It does not discuss reversibility or response behavior, but the key consequence is disclosed.
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 short, front-loaded, and every sentence earns its place. It states the action first, then the behavioral consequence, then the scoping rule. There is no redundant or filler text.
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 mutation tool with no output schema, the description covers the essential purpose, consequence, and Space scoping. The schema is fully described, so parameter details do not need to be repeated. It could be slightly more complete by explicitly contrasting with confirm_competitor_library_account, but the core context is present.
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 description coverage is 100%, so the schema already documents competitor_id, body, and space_id. The description mentions the space_id override, but mostly repeats what the schema already says and adds little about the nested body fields sourceId and ref. Baseline 3 is appropriate when the schema carries parameter semantics.
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 specific action on a specific resource: rejecting a library account as not being a given competitor. It also states the outcome, that the account stops being read and is never proposed again, which clearly distinguishes it from the confirm/track siblings. It does not explicitly name the sibling alternative, so it is clear but not maximally 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 gives clear usage context: use this when a library account is not the competitor. It also explains Space scoping and points to set_active_space or the space_id override for switching context. It does not explicitly say to use confirm_competitor_library_account in the opposite case, but the usage condition is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_brakeRelease the Emergency BrakeADestructiveInspect
Release an engaged Emergency Brake, re-enabling exactly the campaigns it paused (and only those still paused — a campaign the user changed since is left alone). mode='raise' re-arms the brake against the budget's current amount for the rest of the month; mode='resume' means the user knowingly overrules the budget, so that level stays disarmed until next month. Re-enables live campaigns and therefore resumes real ad spend — confirm intent first.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'raise' re-arms against the current budget this month; 'resume' overrules the budget for the rest of the month. | |
| scope | No | Brake scope: 'global' (default) or 'campaign:{id}'. | |
| event_id | No | Release a specific brake event. Defaults to the engaged event for `scope`. | |
| campaign_id | No | Release the campaign-level brake for this campaign instead of the account-level one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral traits beyond the annotations: it re-enables only still-paused campaigns, leaves campaigns the user changed alone, and explicitly states that it resumes real ad spend. The destructiveHint:true annotation is enhanced by explaining exactly what is affected and the financial consequence. 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?
Three sentences, each packing critical information: what the tool does, mode-specific behavior, and a warning about real ad spend. No filler, no repetition of schema data. Front-loaded with the essential action and scope.
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?
Given the tool's complexity (two modes, scope options, campaign-specific release) and the absence of an output schema, the description covers the core behavior, edge cases (campaigns changed by user), and the consequence (real ad spend). It fully equips an agent to decide when and how to invoke the tool.
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 description coverage is 100%, so the baseline is 3. The description adds value by explaining the semantics of the modes in a broader context (re-arming vs. overruling the budget), which enhances but does not fully duplicate the schema's enum descriptions. It also implies how scope, event_id, and campaign_id relate without restating them. A 4 is warranted for adding cross-parameter 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 begins with a specific verb ('release') and distinct resource ('Emergency Brake'), and clearly states the action's effect: re-enabling exactly the campaigns the brake paused. It differentiates from sibling tools by naming the two modes ('raise' vs 'resume') and by contrasting with brake-related tools like get_brake_status and set_budget.
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 explains when to use each mode: 'mode='raise' re-arms the brake against the budget's current amount for the rest of the month; mode='resume' means the user knowingly overrules the budget, so that level stays disarmed until next month.' It also warns to confirm intent first, which is a clear usage condition. This exceeds the baseline by providing mode-specific decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_active_spaceSet active spaceAInspect
Switch the MCP server's active Space. Subsequent tool calls (list_campaigns, create_ad, get_performance_stats, etc.) are scoped to the chosen Space. Validates membership against the token owner's Spaces list and surfaces NOT_A_MEMBER / SPACE_NOT_FOUND as isError results. Idempotent — re-setting to the current Space is a no-op.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | Yes | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by disclosing membership validation, error surfacing (NOT_A_MEMBER / SPACE_NOT_FOUND as isError), idempotency, and the global side effect of affecting subsequent calls. This is rich behavioral detail that the readOnlyHint/destructiveHint annotations do not capture.
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 three sentences, front-loaded with the core action, and each sentence earns its place by adding essential context (scope, validation, idempotency). No fluff or redundancy.
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 single-parameter setter with no output schema, the description fully covers the purpose, side effects, error behavior, and idempotency. It is complete enough for an agent to use correctly without additional context.
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% with a detailed description of space_id, so the tool description does not need to explain it. However, the schema's parameter description says 'Override the active Space for this one call,' which conflicts with the tool's purpose of persistently setting the active Space. The tool description does not correct this ambiguity, so it misses an opportunity to add clarity.
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 ('Switch') and resource ('active Space') and clearly differentiates from siblings like get_active_space and list_spaces by explaining that subsequent tool calls are scoped to the chosen Space. This precisely states what the tool does.
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 explains when to use it ('Subsequent tool calls... are scoped to the chosen Space'), which gives clear context for setting the active Space. It does not explicitly mention alternatives such as passing space_id per call, but the schema's parameter description covers that, so the lack of exclusion is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_ad_scheduleSet ad scheduleAInspect
Set a campaign's weekly ad schedule with friendly input and correct, platform-aware timezone handling — the easy front door over update_campaign's adSchedule. Pass HH:MM times, day shorthands (MON…SUN, WEEKDAYS, WEEKEND) and/or a preset. Windows may cross midnight (19:00->07:00) and are auto-split. timezone:'local' uses the searcher's local time on Microsoft (AdScheduleUseSearcherTimeZone); Google cannot localize per searcher, so pass an explicit IANA zone (e.g. 'Europe/Istanbul') to offset-bake the hours to that location relative to the account timezone. Use dry_run:true to preview the exact expanded schedule and any warnings WITHOUT mutating the campaign. Scoped to the active Space.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | No | A named schedule, expanded server-side. May be combined with windows to add to it. | |
| dry_run | No | If true, return the expanded schedule + warnings WITHOUT writing. Use to learn the exact result before committing. | |
| windows | No | Friendly windows. Each item: { days: ["MON".."SUN" | "WEEKDAYS" | "WEEKEND"], start: "HH:MM", end: "HH:MM", bidModifier?: 0.1-10 }. Minutes must be :00/:15/:30/:45. end may be "24:00"; an end at or before start crosses midnight and is auto-split. | |
| platform | No | Disambiguate timezone semantics when the campaign is linked to multiple platforms. Optional; inferred from the campaign's platform links otherwise. | |
| space_id | No | Override the active Space for this one call. | |
| timezone | No | 'local' (searcher-local on Microsoft; account-time + warning on Google), 'UTC', or an IANA zone like 'Europe/Rome'. Omit to use the account timezone. Explicit zones that differ from the account zone are offset-baked into the stored hours (with a DST caveat in the response). | |
| campaign_id | Yes | Campaign id (as returned by list_campaigns). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint:false, leaving the mutation aspect to the description. The description discloses critical behaviors: dry_run prevents mutation, windows crossing midnight are auto-split, timezone 'local' maps differently per platform, explicit IANA zones are offset-baked with a DST caveat, and the operation is scoped to the active Space. This goes well beyond the annotation and adds rich, non-obvious context.
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 a single dense paragraph but is well-structured: it front-loads the core purpose and value proposition, then explains input formats, timezone rules, and the dry_run safety net. Every sentence adds necessary detail for a tool of this complexity; there is no fluff or repetition.
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 tool with 7 parameters, no output schema, and complex platform-specific behavior, the description covers all essential aspects: input syntax (HH:MM, day shorthands), presets, window crossing midnight, timezone handling for each platform, dry_run behavior, and scoping. It does not specify the exact return format, but dry_run is described as returning the expanded schedule and warnings, which is sufficient for an agent to call it safely.
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%, so the baseline is 3. The description adds meaning beyond the schema by explaining the timezone semantics in detail (e.g., 'local' on Microsoft vs Google, offset-baking with DST caveat), the meaning of presets and window splitting, and the dry_run behavior. This elevates it above the baseline, though the schema already carries significant detail.
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 specific verb ('set') and resource ('campaign's weekly ad schedule'), and explicitly differentiates itself from the sibling update_campaign by calling itself 'the easy front door over update_campaign's adSchedule.' An agent can immediately tell this tool is a specialized, friendlier alternative.
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 gives clear when-to-use guidance ('easy front door over update_campaign's adSchedule'), explains platform-specific requirements (Microsoft vs Google timezone handling), and recommends dry_run:true for previewing without mutation. It also explains when to omit timezone and how to use presets. This is explicit and comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_budgetSet budgetAInspect
Set the account budget amount/period and arm or disarm the account-level Emergency Brake. The Emergency Brake is ON by default: when real month-to-date spend passes the budget, Growomat automatically pauses the affected campaigns and notifies the owner. Pass emergency_brake=false to disarm it (spending past the budget will then pause nothing). Raising global_budget re-arms a previously-spent brake for the rest of the month. Writes real configuration that can stop live campaigns — confirm intent before disarming.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Whether global_budget is a daily or monthly amount. Monthly is the default the product uses. | |
| currency | No | ISO 4217 currency code, e.g. EUR. | |
| global_budget | No | Budget amount, interpreted per `period`. Positive. | |
| emergency_brake | No | Arm (true) or disarm (false) the account-level Emergency Brake. Default is armed. | |
| alert_threshold_percent | No | Percent of budget (50-100) at which the approaching-the-limit warning fires. Default 90. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by explaining the Emergency Brake's automatic campaign-pausing behavior, the re-arming effect of raising global_budget, and the explicit warning that it writes real configuration that can stop live campaigns. This provides rich behavioral context not present in the readOnlyHint/destructiveHint flags.
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 five sentences, each carrying essential information: the core action, the default brake state, the disarm behavior, the re-arming nuance, and a safety warning. No filler or repetition, and the structure is logical.
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?
Despite lacking an output schema and having minimal annotations, the description covers the tool's key behaviors, side effects, and a critical warning. It addresses the five parameters indirectly through context and provides enough information for an agent to use the tool safely and correctly.
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?
With 100% schema coverage, the baseline is 3, but the description adds meaningful behavioral details for emergency_brake (default armed, consequence of disarming) and global_budget (raising it re-arms a spent brake). These insights go beyond the parameter descriptions in the schema, justifying a higher score.
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 explicitly states the tool's function: setting the account budget amount/period and arming/disarming the Emergency Brake. This clearly distinguishes it from siblings like get_budget and release_brake by naming the specific resources and actions.
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 provides clear context on when to use the tool, such as the Emergency Brake default state and the effect of passing emergency_brake=false. However, it does not explicitly mention alternatives like release_brake or when not to use this tool, so it lacks exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_geo_targetingSet geo targetingAInspect
Set a campaign's WHOLE geo-targeting set in one call — named areas and radius circles in a single include/exclude list, plus the campaign-level presence-vs-interest choice — the easy front door over update_campaign's geoTargets. Place names in include/exclude are resolved server-side (countries → geo registry → Google suggest); radius entries take lat/lng or an around place name (geocoded). Radius rows can only be INCLUDED (neither platform supports negative proximity — carve out places with an excluded area instead), and a set where every row is negative is rejected (ONLY_EXCLUSIONS). An empty set is legal: no geo criteria = ads can serve anywhere. locationIntent defaults to PRESENCE (people actually in the locations) — deliberately NOT the platforms' wider search-interest default. Use dry_run:true to get the resolved rows + the plain-language effective-targeting sentence (exactly what the UI shows) WITHOUT mutating the campaign. Scoped to the active Space.
| Name | Required | Description | Default |
|---|---|---|---|
| radii | No | Radius circles: { radius, unit?: 'km'|'mi', around?: place name (geocoded), lat?, lng?, name? }. "5km around Alexanderplatz" = { radius: 5, around: "Alexanderplatz" }. Radius is clamped to 1-500 at push. | |
| dry_run | No | If true, return the resolved rows + effective-targeting sentence WITHOUT writing. Use to verify resolution before committing. | |
| exclude | No | Areas to carve out of the included set — same shapes as include. "Germany except Bavaria" = include: ["Germany"], exclude: ["Bavaria"]. | |
| include | No | Areas to include: place names ("Germany", "Berlin") or { name, type?, countryCode? } objects. Resolved server-side. | |
| space_id | No | Override the active Space for this one call. | |
| geoTargets | No | Structured rows (see update_campaign.geoTargets). Alternative to include/exclude/radii — provide one form or the other. | |
| campaign_id | Yes | Campaign id (as returned by list_campaigns). | |
| locationIntent | No | Who counts as being in the targeted places. PRESENCE (the default) = people in — or regularly in — them. PRESENCE_OR_INTEREST = also people elsewhere who merely search about them (wider, much less qualified). Maps to Google geoTargetTypeSetting and Microsoft IntentOption. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the sparse annotation (readOnlyHint: false), the description discloses substantial behavioral traits: server-side resolution chain (countries → geo registry → Google suggest), radius clamping to 1-500, the restriction that radius rows can only be included, the ONLY_EXCLUSIONS rejection, the empty-set legal behavior, the locationIntent default of PRESENCE deliberately differing from platform defaults, and the dry_run mutation-free behavior. 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 dense but every sentence serves a purpose: defining the scope, explaining resolution, listing constraints, clarifying defaults, and introducing dry_run. It is front-loaded with the tool's purpose and then logically branches into behavioral details without redundancy.
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?
Given the tool has no output schema and moderate complexity (8 parameters, nested shapes for radii/geoTargets), the description covers all critical context: accepted input forms, server-side resolution, per-platform constraints, default values, mutation semantics, and the dry_run verification path. It leaves no obvious gap for an AI agent to misuse the tool.
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?
Although the schema already has 100% parameter coverage, the description adds substantial semantic value beyond field names: it explains the relation between include/exclude/radii, the 'around' place name geocoding, the '5km around Alexanderplatz' example, the clamp range, the dry_run return payload, and the meaning of locationIntent values. This goes well above the baseline.
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 opens with a specific verb and resource: 'Set a campaign's WHOLE geo-targeting set in one call'. It clearly enumerates what the tool does (named areas, radius circles, include/exclude list, presence-vs-interest choice) and explicitly distinguishes it from the sibling 'update_campaign's geoTargets' as the 'easy front door'.
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 positions the tool as the preferred alternative to update_campaign's geoTargets, gives concrete examples ('Germany except Bavaria'), explains when to use exclude rather than negative radii, notes the ONLY_EXCLUSIONS rejection, and states that an empty set is legal. It also explains when to use dry_run:true, providing clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_asset_uploadStart asset uploadAInspect
Start a two-step upload for a file you can PUT yourself (a script with the file on disk). Returns asset_id, upload_url, and the method and headers to PUT the bytes with; the asset is PROCESSING until complete_asset_upload. In a conversation, use upload_asset instead. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name in the library. | |
| type | No | What the asset is used as. Default IMAGE. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| file_name | Yes | The file's name. | |
| size_bytes | Yes | The file's size in bytes (10 MB at most). | |
| content_type | Yes | The file's type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give the agent the read/write safety profile, and the description adds real substance beyond them: the two-step nature, that the asset sits in PROCESSING until complete_asset_upload, and the exact return payload (asset_id, upload_url, method, headers). It stops short of the operational details a PUT flow usually needs — whether upload_url expires, what error surfaces when the PUT fails or the size/content-type limits are violated, and whether an abandoned upload must be cleaned up.
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?
Three sentences, zero filler: what it does and returns first, the alternative second, and the scoping rule last. The most decision-relevant fact (two-step, use upload_asset in conversation) is front-loaded.
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?
With no output schema, the description takes on the return-value burden and discharges it by naming the three returned fields and the required method/headers. For a two-step write tool the remaining gaps are modest: upload_url lifetime, failure handling, and cleanup of an abandoned upload are unstated, though none blocks a first correct call.
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%, with descriptions on all six properties including enum values and the 10 MB bound, so the schema carries parameter meaning on its own. The description restates only the space_id override behavior, which the schema already explains in fuller detail (pattern, default, GROWOMAT_SPACE_ID fallback). It adds no parameter guidance the schema lacks, so baseline 3 applies.
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?
States a specific verb and resource ('Start a two-step upload') plus the caller profile ('a file you can PUT yourself — a script with the file on disk'), which cleanly separates it from upload_asset and create_asset. It also names the lifecycle dependency on complete_asset_upload, so an agent understands this is step one, not the whole operation.
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?
Gives an explicit when-to-use condition (you have bytes on disk and can issue a PUT) and an explicit when-not/alternative ('In a conversation, use upload_asset instead'). It also names set_active_space as the way to change scope and explains the per-call space_id override, so routing and scoping decisions need no inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_competitorsSuggest competitorsAInspect
Build competitor suggestions from evidence Growomat already holds (auction data, an upload, search terms). Nothing is tracked until someone confirms it. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes | The business id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false / destructiveHint=false, so the description earns credit for clarifying that output is provisional suggestions and no tracking is created until confirmation — a material behavioral fact. It does not cover what happens on repeat calls or what the evidence payload looks like.
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?
Three short sentences, purpose first, then the confirmation caveat, then the scoping rule. No filler, and the most decision-relevant facts come earliest.
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 two-parameter tool with full schema coverage and annotations, the description covers purpose, persistence semantics, and workspace scoping. The only gap is the return shape, which matters slightly more here because there is no output schema.
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% and both parameters are fully documented in the schema, including the spc_ pattern and override semantics. The description's Space sentence largely restates the schema rather than adding new parameter meaning, so the baseline 3 applies.
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?
States a concrete verb and resource ('Build competitor suggestions') plus the evidence sources it draws from (auction data, uploads, search terms). The line 'Nothing is tracked until someone confirms it' implicitly separates it from track_competitor, but no sibling is named outright.
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?
Gives explicit operational context for Space scoping and names set_active_space as the alternative, with the space_id override as the one-call escape hatch. It does not, however, say when to reach for this versus find_competitor_library_accounts, check_competitor_similarity, or list_competitors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_competitorTrack competitorAInspect
Track a competitor of a business by website, ad library page link or name. Adding one IS the person's confirmation, so only call this when the user has chosen this competitor. Refused with 402 LIMIT_REACHED at the plan's per-business cap. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the CompetitorCreate schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses that this is a plan-capped operation that can be refused with 402 LIMIT_REACHED at the per-business cap, and that it is an additive write acting as the user's confirmation. That is exactly the operational context an agent needs before mutating state.
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?
Three tight sentences, each carrying distinct information: what it tracks and by which keys, the confirmation precondition, the failure mode, and the Space scoping. Nothing is repeated from the schema and the constraint most likely to cause misuse is placed early.
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 nested-body mutation with no output schema, the definition covers the two things that matter most: authorization/confirmation semantics and the plan-cap rejection path, plus Space binding. An agent can decide and call correctly without further probing.
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%, so the baseline is 3. The description adds value by naming the accepted identifier kinds (website/domain, page link, name) that map onto the nested body fields, and it clarifies that space_id is a one-call override rather than a session change — slightly reinforcing what the schema already states.
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?
States a specific verb and resource ("Track a competitor of a business") and enumerates the acceptable identifiers (website, ad library page link, name), which lets an agent pick it over list_competitors or get_competitor. It does not name sibling tools like suggest_competitors or untrack_competitor outright, so differentiation is inferential rather than explicit.
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?
"Adding one IS the person's confirmation, so only call this when the user has chosen this competitor" gives an explicit precondition plus an implied prohibition on speculative/autosuggest use. It also routes Space handling explicitly: use set_active_space to switch, or pass space_id to override for this one call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger_syncTrigger syncADestructiveInspect
Push the active Space's campaigns to your connected ad platforms and import remote changes. ASYNCHRONOUS: returns a syncId immediately with status 'started' (or 'nothing_to_sync'); the sync runs in the background. Poll get_sync_status with the syncId until its status is terminal (completed, partial, failed, or cancelled). Spends real ad budget and mutates external platforms. The platform connection is account-wide; the campaigns synced are the active Space's. Fails if a sync is already running in this Space. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Re-export in-scope campaigns even when nothing changed — re-runs the full tree + targeting/extensions/labels. Use to repair campaigns synced before a fix. For campaigns deleted in the ad platform, unlink_campaigns then sync. | |
| options | No | Per-entity toggles: includeAdGroups, includeKeywords, includeAds (all default true). | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| plan_hash | No | Bind execution to a plan you previewed: pass the planHash from preview_sync_plan and the sync runs only if the recomputed plan still matches (else SYNC_PLAN_DRIFT). Makes 'preview then sync' a real safety gate. | |
| platforms | No | Platform ids to sync, e.g. ["google-ads"]. Omit for all connected. | |
| campaign_ids | No | HARD scope: sync ONLY these campaigns, on every platform and phase (import/export/remove). Never silently widened — a plan that would touch a campaign outside this set is rejected (SYNC_SCOPE_EXCEEDED) unless confirm_full_space is set. Omit to plan the whole Space. Pair with preview_sync_plan to see the exact set first. | |
| confirm_full_space | No | Acknowledge a large blast radius. Required when an unscoped whole-Space sync would mutate more than 10 campaigns, or to override SYNC_SCOPE_EXCEEDED. Guards against a one-campaign request silently escalating to the whole Space. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations (destructiveHint=true) by stating it 'Spends real ad budget and mutates external platforms,' explaining the asynchronous flow with immediate syncId and status values, and noting that it fails if another sync is running. These are critical behavioral details not captured by structured fields.
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 dense but well-structured: it front-loads the primary action, then async behavior, side effects, failure mode, and scope overrides. Each sentence adds unique value, and it remains concise relative to the tool's complexity.
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?
Despite having no output schema, the description fully explains the return contract (syncId with status 'started' or 'nothing_to_sync'), the polling workflow including terminal statuses, the destructive side effects, and the scope semantics. This is sufficient for an agent to use the tool correctly, especially with rich sibling context.
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 description coverage is 100%, so the baseline is 3. The main description adds some context about space_id overriding the active Space, but the input schema already provides comprehensive per-parameter descriptions, including examples and caveats. No additional meaning is needed beyond the schema.
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 clearly states the tool's function: 'Push the active Space's campaigns to your connected ad platforms and import remote changes.' It uses specific verbs and identifies the resource, and the async behavior distinguishes it from siblings like cancel_sync and preview_sync_plan.
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 explicitly tells when to use the tool (to sync campaigns), when not to (fails if a sync is already running), and provides alternatives such as 'see set_active_space to switch' and 'pass space_id to override.' It also references get_sync_status for polling, giving clear operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_campaignsUnlink campaignsADestructiveInspect
Clear a platform link from the active Space's campaigns, keeping the local campaigns. With delete_remote=true, also removes the campaign on the ad platform (already-gone counts as success). Returns a per-id result map (already-unlinked ids report 'not_linked'). Unlink then trigger_sync to re-create campaigns cleanly on the platform. Mutates external platforms when delete_remote is set. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Platform id to unlink from, e.g. "microsoft-ads". | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_ids | No | Campaign ids to unlink. Omit to unlink every campaign linked to the platform. | |
| delete_remote | No | Also remove the campaign on the ad platform. Default false (only the local link is cleared). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, but the description adds essential context: 'Mutates external platforms when delete_remote is set' and 'already-gone counts as success' (idempotence). It also discloses return behavior ('per-id result map') and clarifies that local campaigns are kept. These details go beyond annotations and are crucial for safe invocation.
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 dense and mostly front-loaded, with the core action first. However, 'Mutates external platforms when delete_remote is set' is somewhat redundant with the earlier sentence about delete_remote. Still, every sentence carries useful information, and there is no fluff beyond minor repetition.
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?
Given no output schema, the description compensates by stating the return format ('per-id result map') and idempotent behavior. It covers purpose, mutation risk, space scoping, and a follow-up action (trigger_sync). This is exceptionally complete for a destructive tool with no output schema.
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?
Since schema coverage is 100%, the baseline is 3. The description enriches the semantics of delete_remote by noting 'already-gone counts as success', and clarifies space_id as an override for the active Space. While the schema already documents each parameter well, these behavioral details provide additional nuance, justifying a slight bump.
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 opens with a clear specific action: 'Clear a platform link from the active Space's campaigns, keeping the local campaigns.' This distinguishes it from delete_campaign (which removes campaigns entirely) and other sibling tools. The scope is explicit (active Space, per-campaign), and the verb 'unlink' matches the tool name.
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 gives a concrete workflow: 'Unlink then trigger_sync to re-create campaigns cleanly on the platform.' It also explains space-scoping behavior with set_active_space and space_id override. However, it doesn't explicitly contrast with delete_campaign or mention when not to use, but the context is clear enough for an agent to select appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
untrack_competitorUntrack competitorADestructiveInspect
Stop tracking a competitor and remove it from the business. Its library history leaves the account immediately. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds non-obvious detail: the removal is immediate and the competitor's library history leaves the account at once. That consequence (loss of accumulated history) is real context beyond the annotations. It still doesn't say whether the operation requires confirmation or can be undone, so not a 5.
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?
Three short sentences, destructive effect front-loaded before the scoping note. The final sentence largely repeats what the space_id schema description already says, so it isn't perfectly waste-free.
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 2-parameter destructive mutation with no output schema, the description covers impact, immediacy and Space scoping adequately. The main missing piece is reversibility/confirmation behavior, which matters for an irreversible destructive call.
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 description coverage is 100%, so both parameters are already documented, including the space_id override semantics the description restates. competitor_id gets no added meaning in the description (no hint about how to obtain it or its scoping). Baseline 3 applies when the schema carries the weight.
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?
Names a specific verb and resource ('Stop tracking a competitor') and states the concrete effect: 'remove it from the business' and its library history leaving the account. This is clearly the inverse of track_competitor in the sibling list, so an agent can disambiguate without opening a schema.
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 explains the Space scoping condition (active Space by default, space_id to override) which is genuinely actionable. However, it never says when to prefer this over an alternative, e.g. that track_competitor re-adds it, or that get_competitor/list_competitors are read-only paths for inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_adUpdate adBInspect
Partial update of an ad. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AdUpdate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| ad_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only and non-destructive. The description adds that the return value is the full updated object, but leaves out whether omitted body fields are preserved or cleared, and the phrase "updated/created" implies a possible upsert without confirming it. The schema's important note that _native replaces a platform's settings wholesale is not surfaced in the description.
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?
Three short sentences, front-loaded with the operation and return value before the scoping caveat. No filler; the only slight waste is the ambiguous "updated/created" pairing.
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 mutation tool with a large nested body and no output schema, the description covers the return shape and Space scoping, which is useful. It omits merge-versus-replace semantics for the body and for _native, and gives no hint about permission or validation behavior, leaving meaningful gaps for an agent composing an update.
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 description coverage is 67%, so the schema carries most of the burden and the baseline is 3. The description's "partial update" is the one semantic addition: it signals that only supplied fields change, which the schema does not state outright, but it adds no detail on ad_id, body contents, or the _native replacement behavior.
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?
States a specific verb and resource ("Partial update of an ad") and the qualifier "partial" meaningfully separates it from create_ad and update_ad_group. It does not explicitly name those siblings, so a 4 rather than 5.
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 gives real routing guidance for the Space dimension — switch with set_active_space or pass space_id for a one-off override — which is genuinely actionable. It says nothing about when to update versus create/replace an ad, or which fields are appropriate to change, so usage guidance is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ad_groupUpdate ad groupAInspect
Partial update of an ad group. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AdGroupUpdate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| ad_group_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds real context beyond that: the update is partial (unsent fields are preserved), the response is the full object, and the call is scoped to the active Space with a per-call override. The unexplained 'updated/created' wording leaves upsert behavior unclear, which keeps it below a 5.
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?
Three short sentences, front-loaded with the purpose, then the return value, then the scoping caveat. No filler or restatement of the tool name.
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 mutation tool with a nested, free-form body and no output schema, it covers purpose, response shape, and Space scoping adequately. It leaves ad_group_id undefined and does not resolve the create-vs-update ambiguity implied by 'created', which an agent calling a write tool would want to know.
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 67%, so the baseline is 3: space_id is already richly documented in the schema and the description merely repeats it, and ad_group_id has no description in either place. The description adds no detail about which body fields are updatable beyond what the nested schema already lists.
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?
States a specific verb and resource ('Partial update of an ad group') plus the return shape, so the agent knows it mutates an existing ad group rather than creating, deleting, or updating a campaign/ad/keyword. It does not explicitly contrast with sibling update_* tools, but the resource noun is unambiguous. The phrase 'updated/created' slightly blurs whether the call can create.
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 only usage guidance given is Space scoping: 'see set_active_space to switch, or pass space_id to override for this one call,' which usefully routes to a sibling. Nothing states prerequisites (the ad group must already exist), when to prefer update_ad_group over other update routes, or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_angleUpdate angleAInspect
Partially update an angle (name, status, angleType — registry ids only). Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Fields to change, matching the AngleUpdate schema. | |
| angle_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states that only some fields can be changed, restricts values to registry ids, and explains the active-space default and per-call override. This goes beyond the annotations (readOnlyHint false, destructiveHint false) by clarifying scoping and partial-update behavior.
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 tightly worded sentences. The action and fields are front-loaded, and the Space-scoping override is placed immediately after. No filler or redundant restating of schema details.
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 small partial-update tool, the description covers the core invocation context: what fields can be updated, registry-id restriction, active Space scoping, and the per-call override mechanism. It does not mention return values, but with no output schema present, that would be a larger gap if the operation were more complex.
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 description adds meaning to body and space_id (partial updates, registry ids, space override/default). However, it omits the businessId field from the list of updatable fields, and angle_id relies on its schema name for meaning. With 67% schema coverage, the description partially compensates but does not fully document every parameter.
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 and resource: 'Partially update an angle (name, status, angleType — registry ids only).' It clearly distinguishes itself from create/delete/get angle tools by emphasizing partial update semantics and enumerates the relevant fields.
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 explicitly scopes the operation to the active Space, directs the agent to set_active_space for switching, and offers space_id as a per-call override. It does not explicitly state when-not-to-use alternatives like create_angle or delete_angle, but the partial-update wording makes the primary use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_assetUpdate assetAInspect
Partial update of an asset (name, altText, tags, metadata, status, width, height). Identity-like fields (url, contentType, sizeBytes, source) are immutable post-creation. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AssetUpdate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| asset_id | Yes | ||
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false) already indicate a non-read-only, non-destructive write. The description adds significant context: partial update semantics, immutable identity-like fields, return type ('full updated/created object'), and active Space scoping. This goes beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each dense with useful information: the action, mutable/immutable fields, return behavior, and Space scoping. No filler or repetition. Front-loaded with the primary purpose.
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?
Given the tool has no output schema, the description appropriately states it 'Returns the full updated/created object.' It handles nested objects by referencing the OpenAPI spec, and covers the Space scoping nuance. This is sufficient for a moderate update operation with 3 parameters.
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 schema covers 67% of parameters, naming body fields but deferring nested shapes to the OpenAPI spec. The description adds value by enumerating the updatable fields and explicitly calling out identity-like fields as immutable, which prevents users from passing invalid parameters. This practical guidance exceeds the schema alone.
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?
Description opens with 'Partial update of an asset' and explicitly lists the mutable fields (name, altText, tags, metadata, status, width, height). This clearly differentiates it from create_asset, delete_asset, and get_asset. The immutable fields are named, further clarifying the scope.
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 provides concrete guidance on Space scoping: 'see set_active_space to switch, or pass space_id to override for this one call.' It also warns about immutable fields, preventing misuse. It does not explicitly contrast with sibling update tools, but the partial-update wording implies when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_businessUpdate businessAInspect
Partial update of a business. The optional brand object is the business's brand voice profile — tone dials (formality, energy), voiceNotes, promises and bannedPhrases — and governs all generated ad and social copy for this business. Returns the full updated object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the BusinessUpdate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a non-read-only, non-destructive mutation, so the bar is lower. The description adds that it returns the full updated object and that brand changes affect all generated ad and social copy, which is meaningful behavioral context beyond the annotations; it doesn't cover validation failures or permission requirements.
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?
Three sentences, front-loaded with the operation and scope, with no wasted phrasing. The brand explanation and Space override note are each directly actionable.
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 mutation with nested objects and no output schema, the description covers the return ('full updated object'), the Space scoping mechanism, and the most complex parameter group. Only error/validation behavior is left unaddressed, which is minor.
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 67% and the schema already documents the brand fields, tone dial ranges, and space_id in detail. The description reinforces the brand object's purpose but adds little beyond the schema for business_id or the body's other fields, so the baseline of 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?
States a specific verb and resource ('Partial update of a business') and immediately scopes it as partial rather than a create/delete, which distinguishes it from the create_business and delete_business siblings. The mention of the brand object and Space scoping adds concrete detail about what can be updated.
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 word 'partial' signals when to use this over create_business, and the Space sentence gives explicit routing: use set_active_space to switch, or pass space_id for a one-call override. It stops short of describing when-not to use it or any prerequisites for updating a business.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaignUpdate campaignAInspect
Partial update of a campaign — body fields are merged into the existing record. Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the CampaignUpdate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| campaign_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=false and destructiveHint=false, the description adds meaningful behavior: body fields are merged rather than replaced, and the full updated/created object is returned. It does not cover permissions, sync timing, or destructive edge cases at the top level, but it discloses the key mutation semantics.
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?
Three tight sentences, front-loaded with the operation semantics, then return behavior, then Space scoping. There is no redundant filler.
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 mutation tool with no output schema, the description explains the merge behavior, return value, and Space targeting context. It is largely complete, though it leaves specialized update tools unmentioned at the top level and does not describe campaign_id semantics.
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 schema has 67% description coverage and already documents many nested body fields in detail. The top-level description adds useful semantics for body merging and space_id override, though campaign_id is not described beyond its name and required status.
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 clearly states a specific verb and resource: partial update of a campaign, with merge semantics and the return shape. It does not explicitly distinguish this from create_campaign or specialized update helpers such as set_budget and set_geo_targeting, though the 'partial update' and 'existing record' wording implies the distinction.
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 gives precise guidance for Space scoping: use set_active_space to switch or pass space_id for this one call. However, it does not say when to use update_campaign instead of create_campaign, set_budget, set_geo_targeting, set_ad_schedule, or other sibling tools, so core usage guidance is mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_competitorUpdate competitorAInspect
Rename a competitor, change its domains, move it between tracked, dismissed and suggested, or change its brand terms (the words the copy check will not let generated copy use). Dismissing stops tracking and keeps it from being suggested again. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the CompetitorUpdate schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| competitor_id | Yes | The competitor id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly=false and destructive=false, so the description usefully fills in that this is a partial-field update (any field not sent stays as-is, implied by the field-by-field enumeration) and warns that 'remove takes a derived term out for good', flagging irreversibility that the annotations downplay. It doesn't mention permissions, validation errors, or whether name changes affect existing references.
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 sentences, both dense with information: the first enumerates the mutable surface, the second covers the side effect and scope override. No filler, and the most consequential fact (dismiss = stop tracking) is placed before the scoping note.
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 mutation tool with no output schema and full schema coverage, this is nearly complete: it says what can change, what a status change implies, and how the Space scoping resolves. The remaining gap is the absence of an explicit alternative route (untrack_competitor / track_competitor) among its many siblings.
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%, so the schema already defines all three parameters, including nested brandTerms with add/remove. The description adds real semantic value for mindshare – brand terms are 'the words the copy check will not let generated copy use' and removal is permanent – but does not describe the format expectations for domains or the competitor_id source. Baseline 3 applies when the schema does the heavy lifting.
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 precise verb (rename/change/move) plus the resource, and enumerates every mutable field: name, domains, tracked/dismissed/suggested status, and brand terms. It does not explicitly name the nearest siblings (untrack_competitor, track_competitor, refresh_competitor), leaving the boundary between 'set status=dismissed' and 'untrack_competitor' implicit.
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 clearly explains the effect of one key mode ('Dismissing stops tracking and keeps it from being suggested again') and gives explicit routing for the Space-scoping decision, pointing at set_active_space vs. passing space_id. Still missing an exclusion like when to prefer untrack_competitor over setting status, so it's clear guidance without complete alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_conceptUpdate conceptAInspect
Partially update a concept (name, attributes — registry ids only). Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Fields to change, matching the ConceptUpdate schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| concept_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint=false and destructiveHint=false, so the description carries the behavioral load. It adds non-obvious behavior: partial-update semantics (not full replacement), that attributes must be pre-registry ids (not arbitrary values), and that the Space binding affects which entity gets written. These are material behavioral facts that annotations do not provide. 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?
Two sentences with zero filler. The action and scope are front-loaded ('Partially update a concept'), and the second sentence delivers the scoping caveat plus two resolution paths (set_active_space or space_id) in highly compact prose. Nothing extraneous 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 mutating tool with no output schema, the description covers the essential decision inputs: which fields change, the partial-update nature, and the potentially surprising Space-scoping behavior that affects which Space gets changed. It doesn't describe return values or failure conditions (e.g., nonexistent concept id), but the guidance is enough to reliably invoke the tool.
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 description coverage is 67% and the description compensates meaningfully: it clarifies that 'attributes' takes only registry ids, that 'name' is one of the updatable fields, and that space_id functions as a one-call override of the session's active Space. The unused concept_id is left without description in both schema and description, but its role is fairly obvious for an update-by-id tool.
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 (update), resource (concept), and explicitly scopes the fields — 'name, attributes — registry ids only.' This clearly distinguishes it from the many other update_* tools (update_asset, update_angle, etc.) and from the create/delete/get_concept alternatives.
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 provides important contextual guidance: the operation is scoped to the active Space, tells the agent exactly how to switch (set_active_space) or how to override per-call (space_id). This is genuinely directional context for correct usage. However, it does not explicitly rule out when not to use it (e.g., 'use create for new concepts'), leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_conversion_actionUpdate conversion actionAInspect
Partial update of a conversion action (e.g. status, value settings, lookback window). Returns the full updated object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Fields to change; all optional. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| conversion_action_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint: false, destructiveHint: false), the description discloses that the update is partial (PATCH-like), that it returns the full updated object, and that it is Space-scoped with an override option. No contradictions 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?
Two sentences, front-loaded with the core purpose and return behavior; the second sentence efficiently handles Space scoping. No wasted words, every clause adds necessary information.
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?
Despite lacking an output schema, the description explicitly states the return value (full updated object) and explains Space scoping. It does not cover edge cases like validation limits (e.g., lookback window caps), but the schema descriptions for some fields provide partial coverage. Adequate for an agent to use the tool correctly in most cases.
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 67% (body and space_id have descriptions; conversion_action_id does not). The description adds examples of updatable fields (status, value settings, lookback window) and clarifies that body fields are optional, but it doesn't compensate for the undocumented conversion_action_id or detail all nested fields.
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 clearly states it performs a partial update of a conversion action, giving concrete examples (status, value settings, lookback window). It also distinguishes itself from siblings by noting it returns the full updated object, and the resource is unambiguous.
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?
Provides valuable context: the operation is scoped to the active Space, with explicit instructions on how to switch via set_active_space or override per call with space_id. It does not explicitly mention when to avoid using this tool or name alternatives like create/delete, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_keywordUpdate keywordAInspect
Partial update of a keyword (e.g. matchType, status). Returns the full updated/created object. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the KeywordUpdate schema. Fields below; see the OpenAPI spec for nested object shapes. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| keyword_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false, so the description usefully adds that this is a partial update (only supplied fields change), that the full object is returned, and how Space scoping applies. It lacks detail on failure behavior for an unknown keyword_id and leaves the 'created' wording unexplained, keeping it below a 5.
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?
Three short sentences, front-loaded with the action and partial-update semantics, followed by return value and scoping. No redundant restatement of the name or title; every sentence carries information an agent needs.
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 mutation tool with nested _native payloads and no output schema, the description covers partial-update semantics, the return shape, and Space scoping, which is the material an agent needs. Remaining gaps are edge cases (nonexistent keyword_id, whether 'created' implies upsert), so it is complete but not exhaustive.
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 67%: space_id is richly documented in-schema and body carries a KeywordUpdate description plus _native replace semantics, so the schema does most of the work. The description only adds example body fields (matchType, status) and says nothing about keyword_id or the partial-merge rule, so it does not compensate for the gap — baseline 3.
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?
States a specific verb+resource ("Partial update of a keyword") and gives example fields (matchType, status), which separates it from create_keyword/delete_keyword by verb alone. It doesn't explicitly name a sibling to choose between, and the phrase "updated/created object" slightly muddies whether this can create, so it falls short of a clean 5.
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 explains Space scoping (use set_active_space to switch, or pass space_id to override for this call), which is real usage context. However it never says when to use update_keyword versus create_keyword or get_keyword, and gives no prerequisites such as needing an existing keyword_id, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_assetUpload assetAInspect
Upload an image into the asset library so it can go on ads. Send the bytes base64-encoded in data (with an optional file_name), or a url to copy from — fetched once and stored, so a link that expires keeps working. JPEG, PNG, WebP or GIF up to 10 MB; Growomat reads the type, width and height from the file itself and counts it against the plan's storage. Returns the asset: url is its stable address (bind that), previewUrl a short-lived link you can open. Then attach it with attach_asset_to_ad (role MARKETING_IMAGE puts it on a card) or attach_asset_to_campaign. A chat card needs one image of at least 640 × 640. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A public http(s) URL to copy the image from. Send this or data. | |
| data | No | The image, base64-encoded (a data: URL is accepted). Send this or url. | |
| name | No | Display name in the library. | |
| tags | No | Free-form tags for finding the asset later. | |
| type | No | What the asset is used as. Default IMAGE. | |
| alt_text | No | Alternative text describing the image. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| file_name | No | The stored file's name (with data). Defaults to image. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/destructiveHint annotations: it discloses that a URL is fetched once and stored so expiring links keep working, that type/width/height are read from the file itself, that the image counts against the plan's storage quota, and that url is the stable address while previewUrl is short-lived. These are real operational consequences an agent would otherwise have to guess.
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?
Front-loaded with the core action and the two payload options before limits, return shape, and follow-up steps. Dense but almost every sentence carries information; the space-scoping sentence at the end is slightly tacked-on but still necessary.
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?
No output schema exists, yet the description explains the returned asset fields (url vs previewUrl) and their intended use, plus the constraints and next steps an agent needs. Missing only failure behavior such as duplicate names, quota exhaustion, or unsupported-format errors.
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%, so the baseline is 3, but the description adds meaning: file_name pairs with data, url is copied once rather than hot-linked, and space_id overrides the session binding for a single call. It says nothing about the IMAGE vs LOGO type enum, tags, or alt_text, so it does not cover the full surface.
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?
Specific verb and resource ('Upload an image into the asset library so it can go on ads') with scope and downstream use stated. It does not distinguish itself from close siblings like create_asset, start_asset_upload, or complete_asset_upload, which an agent could easily confuse with this one.
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?
Gives clear operating context: two mutually exclusive input paths (base64 data vs url), the 10 MB / JPEG-PNG-WebP-GIF envelope, the 640x640 minimum for chat cards, and the follow-up tools (attach_asset_to_ad with role MARKETING_IMAGE, or attach_asset_to_campaign). It does not state when to use this over create_asset or the multi-step start/complete_asset_upload flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_auction_insightsUpload auction insightsAInspect
Upload an Auction insights report exported from a platform's own interface, for a platform whose API does not share per-competitor auction data. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Request body matching the AuctionImport schema. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). Pass to read/write a different Space without changing the session binding. | |
| business_id | Yes | The business id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation-safety profile is covered. The description adds the Space scoping behavior, but for an upload tool it says nothing about accepted file format, what happens to previously uploaded data (merge vs. overwrite), or how duplicate/unparseable reports are handled — meaningful gaps that annotations do not fill.
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 sentences, no filler, with the core purpose and the Space-scoping caveat front-loaded. Every clause 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 mutation tool with a nested body and no output schema, the definition should say what a successful upload produces or replaces and what format the report text must be in. It covers scoping well but leaves the ingest contract and post-upload state ambiguous.
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 description coverage is 100%, so space_id and business_id semantics are already documented in the schema and the description merely echoes the space_id override. The nested body object (text, filename, platformId) is described only as "matching the AuctionImport schema," and the description adds no format guidance beyond the schema.
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 specific verb and resource ("Upload an Auction insights report") and narrows the niche to platforms whose API does not expose per-competitor auction data, which distinguishes it from the API-driven competitor tools. It does not name the sibling it replaces (e.g. get_competitor_auction or refresh_competitor), so the differentiation is implied rather than explicit.
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 gives a clear trigger condition — use this when the platform's API does not share per-competitor auction data — and handles the Space-scoping alternative by pointing at set_active_space or the space_id override. It does not state when not to use it (for example, when API-sourced auction data already exists), so a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_conversion_adjustmentUpload conversion adjustmentAInspect
Upload one or more conversion adjustments — RETRACTION (refund/churn/disqualified lead), RESTATEMENT (value correction: trial→paid, partial refund, downgrade), or ENHANCEMENT (attach hashed identifiers) — so a refunded/churned/upgraded deal stops teaching Smart Bidding the wrong lesson. Pass body as a single adjustment or { adjustments: [ { orderId, adjustmentType, conversionAction, value?, currency?, occurredAt } ] }. Identified by orderId. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Adjustment payload — a single adjustment or { adjustments: [...] }. | |
| space_id | No | Override the active Space for this one call. Defaults to the active Space set via set_active_space (or GROWOMAT_SPACE_ID on the server). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only readOnlyHint: false, so the description carries the transparency burden. It discloses the types of adjustments, the purpose (affecting Smart Bidding), the scoping behavior, and the payload structure. It does not mention potential side effects, failure modes, or idempotency, but the disclosed behavior is substantial and goes well beyond the 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?
Despite being a long single sentence, every segment adds value: adjustment types, business rationale, payload format, and scoping. The information is front-loaded with the core action and then expanded efficiently. No filler or redundant phrasing.
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?
The description covers purpose, usage context, scoping, and payload details comprehensively. Given there is no output schema, return values need not be described. Minor gaps include lack of explicit validation rules or required nested fields, but overall it is well-complete for a 2-parameter tool with nested objects.
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 schema only describes body as 'Adjustment payload' and space_id as an override. The description adds crucial semantics by detailing the body structure with required fields (orderId, adjustmentType, conversionAction) and optional ones (value, currency, occurredAt), and explaining the two accepted payload forms. This significantly surpasses the schema's terse descriptions.
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 clearly states 'Upload one or more conversion adjustments' and enumerates the specific types (RETRACTION, RESTATEMENT, ENHANCEMENT) with concrete examples. It distinguishes itself from sibling tools like upload_offline_conversion by focusing on adjustments to existing conversions rather than new conversions.
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 provides strong contextual use: 'so a refunded/churned/upgraded deal stops teaching Smart Bidding the wrong lesson.' It also explains the scoping behavior with set_active_space and space_id override. However, it does not explicitly mention when not to use this tool or compare it directly with alternatives like upload_offline_conversion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_offline_conversionUpload offline conversionAInspect
Upload one or more offline conversions (e.g. a booked call from your CRM) to the ad platform, closing the click-id attribution loop so the platform can credit the originating ad click. Pass body as a single conversion or { conversions: [ { gclid | msclkid, conversionAction (the conversion-action name, e.g. "Booked call"), occurredAt (ISO 8601), value?, currency?, orderId? } ] }. A gclid routes to Google Ads, an msclkid to Microsoft Advertising. Idempotent on orderId — re-uploading the same orderId is a no-op. Scoped to the active Space — see set_active_space to switch, or pass space_id to override for this one call.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Conversion payload — a single conversion object or { conversions: [...] }. | |
| space_id | No | Override the active Space for this one call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint=false annotation, the description discloses valuable behavior: idempotency on orderId, platform routing based on gclid vs msclkid, and scoping to the active Space with a space_id override. These are non-obvious behavioral traits an agent cannot infer from annotations or schema alone.
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 dense but well-structured, front-loading the purpose and payload shape before idempotency and scoping. Every sentence adds new information, with no filler or restatement of the title.
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 mutation tool with a nested body, the description covers payload structure, optional fields, routing behavior, idempotency, and Space scoping. It does not describe the response shape, but with no output schema and a clear invocation contract, nothing essential is missing for calling the tool correctly.
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?
Although schema coverage is 100%, the schema's body description is generic. The description adds the full payload shape, optional and required fields, ISO 8601 format, identifier semantics, and the space_id override behavior. This is a substantial semantic addition beyond the structured schema.
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 is specific and action-oriented: 'Upload one or more offline conversions' and explains the attribution-loop purpose clearly. It does not explicitly contrast the tool with sibling upload_conversion_adjustment or create_conversion_action, so it stops just short of full sibling differentiation.
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 gives a concrete when-to-use example (a booked call from the CRM) and clarifies the click-id attribution context. It does not explicitly say when not to use it or name alternative tools, but the usage context is clear enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_exportValidate campaign for exportARead-onlyInspect
Pre-flight a campaign before syncing: evaluates it against each connected platform's capability rules with zero platform calls and returns structured findings (blocked / unsupported / degraded / ok). valid: false means at least one platform will REFUSE this campaign — fix the named findings before trigger_sync instead of discovering the refusal in a failed sync. Pass platforms to check specific ones (a named platform is validated even when unconnected).
| Name | Required | Description | Default |
|---|---|---|---|
| platforms | No | Platform ids to validate against; defaults to every connected platform. | |
| campaign_id | Yes | The campaign to validate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint being present, the description adds significant behavioral detail: zero platform calls, severity levels (blocked/unsupported/degraded/ok), and the meaning of valid:false. It also explains behavior for unconnected platforms, going well beyond 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?
Three sentences, front-loaded with the core purpose, then consequence, then parameter tip. Every sentence earns its place with no redundancy or filler.
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?
The description covers the tool's purpose, output categories, and actionable outcome (valid:false means refusals). Despite no output schema, it provides enough context for an agent to understand what to expect and why to use it.
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%, providing baseline 3. The description adds nuance for the 'platforms' parameter (validated even when unconnected) and reinforces the default behavior, adding value beyond the schema. No new meaning for campaign_id, but the increment is justified.
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 ('pre-flight') and resource ('campaign') and clearly explains the tool evaluates campaigns against platform capability rules, returning structured findings. This distinguishes it from sibling tools like trigger_sync, which actually performs the sync.
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?
Explicitly states 'before syncing' and instructs to fix findings before trigger_sync, providing clear guidance on when to use the tool. However, it does not explicitly mention alternatives or when not to use it, so slightly short of the strongest guidance.
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
- Added
get_latest_briefing - Added
list_open_loops
3 tool updates
- Added
confirm_own_ad_reading - Changed
get_angle_gap1 field changed- changed
Input schema / properties / days / descriptionPrevious value: -"Look-back window in days. Default 90."New value: +"Look-back window for their ads, in days. Default 30."
- Added
get_own_ad_reading
19 tool updates
- Added
check_competitor_similarity - Added
confirm_competitor_library_account - Added
find_competitor_library_accounts - Added
get_angle_gap - Added
get_answer_brief - Added
get_competitor - Added
get_competitor_allowance - Added
get_competitor_auction - Added
get_competitor_coverage - Added
get_competitor_offers - Added
list_competitor_ads - Added
list_competitors - Added
refresh_competitor - Added
reject_competitor_library_account - Added
suggest_competitors - Added
track_competitor - Added
untrack_competitor - Added
update_competitor - Added
upload_auction_insights
18 tool updates
- Added
complete_asset_upload - Added
confirm_campaign - Changed
create_ad8 fields changed- added
Input schema / properties / body / properties / _nativeAdded value: +{ + "additionalProperties": true, + "description": "Platform-only settings, keyed by platform id (for example {\"openai-ads\": {\"budgetKind\": \"LIFETIME\"}}). Each value is stored and returned as sent. The NativeExtensions schema in the OpenAPI spec lists every key each platform reads and where (campaign, ad group or ad) — a lifetime budget, a bidding type, delivery surfaces, the words and image on a card. On update, send the whole object for a platform: it replaces that platform's settings.", + "type": "object" +} - added
Input schema / properties / body / properties / angleIdAdded value: +{ + "description": "The angle (claim) this ad argues. Results are reported per angle.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / body / properties / angleProvenanceAdded value: +{ + "description": "Where the angle stamp came from: written by Growomat, set by you, or inferred from the copy. Defaults to `user` when you set `angleId` yourself.", + "enum": [ + "generated", + "user", + "inferred" + ], + "type": "string" +} - added
Input schema / properties / body / properties / competitorSimilarityAckAdded value: +{ + "description": "Save manual copy that the competitor similarity check flagged. Only honoured when the refusal said `overridable: true`; the decision is recorded on the ad.", + "type": "boolean" +} - added
Input schema / properties / body / properties / conceptIdAdded value: +{ + "description": "The concept (way of making the claim) this ad is a rendition of.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / body / properties / creativeAdded value: +{ + "additionalProperties": true, + "description": "Format-specific creative. For a single-image card, creative.imageUrl is the card's own image (it wins over an image attached with attach_asset_to_ad).", + "type": "object" +} - added
Input schema / properties / body / properties / typeAdded value: +{ + "description": "Ad format. Defaults from the campaign type per platform; ads imported from a platform record the format that actually serves.", + "enum": [ + "RESPONSIVE_SEARCH_AD", + "RESPONSIVE_DISPLAY_AD", + "PERFORMANCE_MAX_ASSET_GROUP", + "VIDEO_AD", + "REDDIT_TEXT_POST", + "REDDIT_IMAGE_POST", + "REDDIT_VIDEO_POST", + "REDDIT_CAROUSEL_POST", + "META_LINK_AD", + "META_IMAGE_AD", + "META_VIDEO_AD", + "META_CAROUSEL_AD", + "OPENAI_CHAT_CARD", + "OPENAI_PRODUCT_AD_TEMPLATE", + "LINKEDIN_SINGLE_IMAGE", + "LINKEDIN_TEXT_AD", + "LINKEDIN_VIDEO", + "LINKEDIN_CAROUSEL", + "LINKEDIN_DOCUMENT" + ], + "type": "string" +} - changed
Input schema / properties / body / requiredPrevious value: -[ - "adGroupId", - "campaignId", - "headlinePart1", - "headlinePart2", - "description", - "finalUrl" -]New value: +[ + "adGroupId", + "campaignId", + "headlinePart1", + "description", + "finalUrl" +]
- Changed
create_ad_group1 field changed- added
Input schema / properties / body / properties / _nativeAdded value: +{ + "additionalProperties": true, + "description": "Platform-only settings, keyed by platform id (for example {\"openai-ads\": {\"budgetKind\": \"LIFETIME\"}}). Each value is stored and returned as sent. The NativeExtensions schema in the OpenAPI spec lists every key each platform reads and where (campaign, ad group or ad) — a lifetime budget, a bidding type, delivery surfaces, the words and image on a card. On update, send the whole object for a platform: it replaces that platform's settings.", + "type": "object" +}
- Changed
create_asset4 fields changed- added
Input schema / properties / body / properties / dataAdded value: +{ + "description": "The image itself, base64-encoded (a data: URL is accepted). JPEG, PNG, WebP or GIF, up to 10 MB. Growomat stores it and reads its type, width and height from the bytes. Send this OR url.", + "type": "string" +} - added
Input schema / properties / body / properties / fileNameAdded value: +{ + "description": "With data: the stored file's name.", + "type": "string" +} - added
Input schema / properties / body / properties / storeAdded value: +{ + "description": "With url: fetch the image once and store it in Growomat, so a link that expires (a chat attachment, a pre-signed URL) keeps working. Images only.", + "type": "boolean" +} - removed
Input schema / properties / body / requiredRemoved value: -[ - "url" -]
- Changed
create_business1 field changed- added
Input schema / properties / body / properties / categoryIdAdded value: +{ + "description": "The business category, an id from *Get the creative vocabulary* (`businessCategories`). Used to compare results with similar businesses.", + "type": "string" +}
- Changed
create_campaign4 fields changed- added
Input schema / properties / body / properties / _nativeAdded value: +{ + "additionalProperties": true, + "description": "Platform-only settings, keyed by platform id (for example {\"openai-ads\": {\"budgetKind\": \"LIFETIME\"}}). Each value is stored and returned as sent. The NativeExtensions schema in the OpenAPI spec lists every key each platform reads and where (campaign, ad group or ad) — a lifetime budget, a bidding type, delivery surfaces, the words and image on a card. On update, send the whole object for a platform: it replaces that platform's settings.", + "type": "object" +} - added
Input schema / properties / body / properties / adScheduleUseSearcherTimeZoneAdded value: +{ + "description": "Interpret the ad schedule in the searcher's local time zone instead of the account time zone, on platforms that support it (Microsoft Advertising). Ignored elsewhere.", + "type": "boolean" +} - changed
Input schema / properties / body / properties / biddingStrategy / descriptionPrevious value: -"Nested BiddingStrategy; see the OpenAPI spec for the field list."New value: +"How the platforms bid. MANUAL_CPC bids biddingStrategy.cpcBid per click (an ad group's own cpcBid wins); the target strategies read their target from the matching field." - added
Input schema / properties / body / properties / biddingStrategy / propertiesAdded value: +{ + "cpcBid": { + "description": "The click bid for MANUAL_CPC, in the account currency. Every ad group without its own cpcBid bids this.", + "type": "number" + }, + "maxCpcBidCeiling": { + "description": "Never bid more than this per click.", + "type": "number" + }, + "targetCpa": { + "description": "Target cost per acquisition, for TARGET_CPA.", + "type": "number" + }, + "targetImpressionShare": { + "description": "Target impression share in percent, for TARGET_IMPRESSION_SHARE.", + "type": "number" + }, + "targetRoas": { + "description": "Target return on ad spend as a ratio (2.5 means 250%), for TARGET_ROAS.", + "type": "number" + }, + "type": { + "enum": [ + "MANUAL_CPC", + "ENHANCED_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CONVERSION_VALUE", + "TARGET_CPA", + "TARGET_ROAS", + "TARGET_IMPRESSION_SHARE" + ], + "type": "string" + } +}
- Changed
create_keyword1 field changed- added
Input schema / properties / body / properties / _nativeAdded value: +{ + "additionalProperties": true, + "description": "Platform-only settings, keyed by platform id (for example {\"openai-ads\": {\"budgetKind\": \"LIFETIME\"}}). Each value is stored and returned as sent. The NativeExtensions schema in the OpenAPI spec lists every key each platform reads and where (campaign, ad group or ad) — a lifetime budget, a bidding type, delivery surfaces, the words and image on a card. On update, send the whole object for a platform: it replaces that platform's settings.", + "type": "object" +}
- Changed
list_ad_groups1 field changed- added
Input schema / properties / campaign_idAdded value: +{ + "description": "Only return the ad groups of this campaign.", + "type": "string" +}
- Added
list_connections - Added
preview_campaign - Added
start_asset_upload - Changed
update_ad7 fields changed- added
Input schema / properties / body / properties / _nativeAdded value: +{ + "additionalProperties": true, + "description": "Platform-only settings, keyed by platform id (for example {\"openai-ads\": {\"budgetKind\": \"LIFETIME\"}}). Each value is stored and returned as sent. The NativeExtensions schema in the OpenAPI spec lists every key each platform reads and where (campaign, ad group or ad) — a lifetime budget, a bidding type, delivery surfaces, the words and image on a card. On update, send the whole object for a platform: it replaces that platform's settings.", + "type": "object" +} - added
Input schema / properties / body / properties / angleIdAdded value: +{ + "description": "The angle (claim) this ad argues. Results are reported per angle.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / body / properties / angleProvenanceAdded value: +{ + "description": "Where the angle stamp came from: written by Growomat, set by you, or inferred from the copy. Defaults to `user` when you set `angleId` yourself.", + "enum": [ + "generated", + "user", + "inferred" + ], + "type": "string" +} - added
Input schema / properties / body / properties / competitorSimilarityAckAdded value: +{ + "description": "Save manual copy that the competitor similarity check flagged. Only honoured when the refusal said `overridable: true`; the decision is recorded on the ad.", + "type": "boolean" +} - added
Input schema / properties / body / properties / conceptIdAdded value: +{ + "description": "The concept (way of making the claim) this ad is a rendition of.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / body / properties / creativeAdded value: +{ + "additionalProperties": true, + "description": "Format-specific creative. For a single-image card, creative.imageUrl is the card's own image (it wins over an image attached with attach_asset_to_ad).", + "type": "object" +} - added
Input schema / properties / body / properties / typeAdded value: +{ + "description": "Ad format. Defaults from the campaign type per platform; ads imported from a platform record the format that actually serves.", + "enum": [ + "RESPONSIVE_SEARCH_AD", + "RESPONSIVE_DISPLAY_AD", + "PERFORMANCE_MAX_ASSET_GROUP", + "VIDEO_AD", + "REDDIT_TEXT_POST", + "REDDIT_IMAGE_POST", + "REDDIT_VIDEO_POST", + "REDDIT_CAROUSEL_POST", + "META_LINK_AD", + "META_IMAGE_AD", + "META_VIDEO_AD", + "META_CAROUSEL_AD", + "OPENAI_CHAT_CARD", + "OPENAI_PRODUCT_AD_TEMPLATE", + "LINKEDIN_SINGLE_IMAGE", + "LINKEDIN_TEXT_AD", + "LINKEDIN_VIDEO", + "LINKEDIN_CAROUSEL", + "LINKEDIN_DOCUMENT" + ], + "type": "string" +}
- Changed
update_ad_group1 field changed- added
Input schema / properties / body / properties / _nativeAdded value: +{ + "additionalProperties": true, + "description": "Platform-only settings, keyed by platform id (for example {\"openai-ads\": {\"budgetKind\": \"LIFETIME\"}}). Each value is stored and returned as sent. The NativeExtensions schema in the OpenAPI spec lists every key each platform reads and where (campaign, ad group or ad) — a lifetime budget, a bidding type, delivery surfaces, the words and image on a card. On update, send the whole object for a platform: it replaces that platform's settings.", + "type": "object" +}
- Changed
update_business1 field changed- added
Input schema / properties / body / properties / categoryIdAdded value: +{ + "description": "The business category, an id from *Get the creative vocabulary* (`businessCategories`). Used to compare results with similar businesses.", + "type": "string" +}
- Changed
update_campaign4 fields changed- added
Input schema / properties / body / properties / _nativeAdded value: +{ + "additionalProperties": true, + "description": "Platform-only settings, keyed by platform id (for example {\"openai-ads\": {\"budgetKind\": \"LIFETIME\"}}). Each value is stored and returned as sent. The NativeExtensions schema in the OpenAPI spec lists every key each platform reads and where (campaign, ad group or ad) — a lifetime budget, a bidding type, delivery surfaces, the words and image on a card. On update, send the whole object for a platform: it replaces that platform's settings.", + "type": "object" +} - added
Input schema / properties / body / properties / adScheduleUseSearcherTimeZoneAdded value: +{ + "description": "Interpret the ad schedule in the searcher's local time zone instead of the account time zone, on platforms that support it (Microsoft Advertising). Ignored elsewhere.", + "type": "boolean" +} - changed
Input schema / properties / body / properties / biddingStrategy / descriptionPrevious value: -"Nested BiddingStrategy; see the OpenAPI spec for the field list."New value: +"How the platforms bid. MANUAL_CPC bids biddingStrategy.cpcBid per click (an ad group's own cpcBid wins); the target strategies read their target from the matching field." - added
Input schema / properties / body / properties / biddingStrategy / propertiesAdded value: +{ + "cpcBid": { + "description": "The click bid for MANUAL_CPC, in the account currency. Every ad group without its own cpcBid bids this.", + "type": "number" + }, + "maxCpcBidCeiling": { + "description": "Never bid more than this per click.", + "type": "number" + }, + "targetCpa": { + "description": "Target cost per acquisition, for TARGET_CPA.", + "type": "number" + }, + "targetImpressionShare": { + "description": "Target impression share in percent, for TARGET_IMPRESSION_SHARE.", + "type": "number" + }, + "targetRoas": { + "description": "Target return on ad spend as a ratio (2.5 means 250%), for TARGET_ROAS.", + "type": "number" + }, + "type": { + "enum": [ + "MANUAL_CPC", + "ENHANCED_CPC", + "MAXIMIZE_CLICKS", + "MAXIMIZE_CONVERSIONS", + "MAXIMIZE_CONVERSION_VALUE", + "TARGET_CPA", + "TARGET_ROAS", + "TARGET_IMPRESSION_SHARE" + ], + "type": "string" + } +}
- Changed
update_keyword1 field changed- added
Input schema / properties / body / properties / _nativeAdded value: +{ + "additionalProperties": true, + "description": "Platform-only settings, keyed by platform id (for example {\"openai-ads\": {\"budgetKind\": \"LIFETIME\"}}). Each value is stored and returned as sent. The NativeExtensions schema in the OpenAPI spec lists every key each platform reads and where (campaign, ad group or ad) — a lifetime budget, a bidding type, delivery surfaces, the words and image on a card. On update, send the whole object for a platform: it replaces that platform's settings.", + "type": "object" +}
- Added
upload_asset
2 tool updates
- Changed
create_campaign2 fields changed- added
Input schema / properties / body / properties / _platformBudgetsAdded value: +{ + "additionalProperties": { + "properties": { + "amount": { + "minimum": 0, + "type": "number" + }, + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "description": "Where the campaign runs, keyed by platform id (google-ads, microsoft-ads, reddit-ads, meta-ads, openai-ads, linkedin-ads), each { amount?: number, enabled?: boolean }. Only listed, switched-on platforms run; being connected never adds one. { \"reddit-ads\": {} } puts the whole budget on Reddit Ads; an entry without amount gets an even share of what the listed amounts leave. If the user has not said where the campaign should run, ask them before calling this tool, offering their connected platforms by name.", + "type": "object" +} - changed
Input schema / properties / body / requiredPrevious value: -[ - "name", - "budget" -]New value: +[ + "name", + "budget", + "_platformBudgets" +]
- Changed
update_campaign1 field changed- added
Input schema / properties / body / properties / _platformBudgetsAdded value: +{ + "additionalProperties": { + "properties": { + "amount": { + "minimum": 0, + "type": "number" + }, + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "description": "Replaces where the campaign runs (same shape as on create_campaign). Omit it to keep the current platforms. At least one platform must stay switched on; removing one the campaign is live on pauses it there at the next sync.", + "type": "object" +}
2 tool updates
- Changed
list_disapprovals1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "google-ads", - "microsoft-ads", - "reddit-ads", - "meta-ads", - "openai-ads" -]New value: +[ + "google-ads", + "microsoft-ads", + "reddit-ads", + "meta-ads", + "openai-ads", + "linkedin-ads" +]
- Changed
set_ad_schedule1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "google-ads", - "microsoft-ads", - "reddit-ads", - "meta-ads", - "openai-ads" -]New value: +[ + "google-ads", + "microsoft-ads", + "reddit-ads", + "meta-ads", + "openai-ads", + "linkedin-ads" +]
2 tool updates
- Changed
list_disapprovals1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "google-ads", - "microsoft-ads", - "reddit-ads", - "meta-ads" -]New value: +[ + "google-ads", + "microsoft-ads", + "reddit-ads", + "meta-ads", + "openai-ads" +]
- Changed
set_ad_schedule1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "google-ads", - "microsoft-ads", - "reddit-ads", - "meta-ads" -]New value: +[ + "google-ads", + "microsoft-ads", + "reddit-ads", + "meta-ads", + "openai-ads" +]
13 tool updates
- Added
create_angle - Added
create_concept - Added
delete_angle - Added
delete_concept - Added
get_angle - Added
get_angle_preflight - Added
get_angle_readout - Added
get_concept - Added
get_creative_vocabulary - Added
list_angles - Added
list_concepts - Added
update_angle - Added
update_concept
70 tool updates
- First observed
account_summary - First observed
attach_asset_to_ad - First observed
attach_asset_to_campaign - First observed
cancel_sync - First observed
create_ad - First observed
create_ad_group - First observed
create_asset - First observed
create_business - First observed
create_campaign - First observed
create_conversion_action - First observed
create_conversion_source - First observed
create_keyword - First observed
delete_ad - First observed
delete_ad_group - First observed
delete_asset - First observed
delete_business - First observed
delete_campaign - First observed
delete_conversion_action - First observed
delete_keyword - First observed
detach_asset_from_ad - First observed
detach_asset_from_campaign - First observed
get_active_space - First observed
get_ad - First observed
get_ad_asset - First observed
get_ad_group - First observed
get_asset - First observed
get_authenticated_token_info - First observed
get_brake_status - First observed
get_budget - First observed
get_business - First observed
get_campaign - First observed
get_campaign_asset - First observed
get_conversion_action - First observed
get_conversion_health - First observed
get_conversion_report - First observed
get_conversion_status - First observed
get_keyword - First observed
get_performance_stats - First observed
get_sync_status - First observed
list_ad_assets - First observed
list_ad_groups - First observed
list_ads - First observed
list_assets - First observed
list_businesses - First observed
list_campaign_assets - First observed
list_campaigns - First observed
list_conversion_actions - First observed
list_conversion_sources - First observed
list_disapprovals - First observed
list_keywords - First observed
list_spaces - First observed
list_syncs - First observed
preview_sync_plan - First observed
release_brake - First observed
set_active_space - First observed
set_ad_schedule - First observed
set_budget - First observed
set_geo_targeting - First observed
trigger_sync - First observed
unlink_campaigns - First observed
update_ad - First observed
update_ad_group - First observed
update_asset - First observed
update_business - First observed
update_campaign - First observed
update_conversion_action - First observed
update_keyword - First observed
upload_conversion_adjustment - First observed
upload_offline_conversion - First observed
validate_export
Related MCP Connectors
- ChorusOAuthnet.chorushq
Run ad campaigns on Meta, Google Ads and LinkedIn from your assistant. Spend waits for your OK.
Manage Google, Meta, LinkedIn, Microsoft, TikTok, Snapchat and Reddit ads in AI chat, with approvals
Run Google Ads and Meta Ads from ChatGPT or Claude: audit wasted spend, create and manage campaigns.
Create, launch, and manage Meta + Google ads from Claude and ChatGPT.
Related MCP Servers
AlicenseNot gradedqualityFmaintenanceConnects Google Ads, Meta Ads, and LinkedIn Ads to AI assistants, enabling natural language ad campaign management, reporting, and optimization across platforms.MIT- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to create, analyze, and optimize ad campaigns across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Amazon Ads, and ChatGPT Ads through natural language using 400+ tools.105MIT
- AlicenseNot gradedqualityCmaintenanceEnables full Google Ads management through natural language, including reading campaigns, performance, ROAS, keywords, and search terms, as well as pausing, enabling, removing, and creating campaigns, ad groups, ads, keywords, budgets, and responsive search ads.MIT
- FlicenseNot gradedqualityDmaintenanceEnables comprehensive management of Google Ads campaigns through natural language, including campaign creation, ad group management, keyword operations, Performance Max campaigns, conversion tracking, and performance insights with support for multiple accounts.3-
Glama MCP Gateway
Add one secure layer between your agents and this server.