Skip to main content
Glama

Server Details

Connect your AI assistant to Rawa, the AI marketing platform. Look up brands and guidelines, products, audiences, creatives, performance, the marketing calendar and competitor ads; keep your calendar and library up to date; and, when an organization admin allows it, generate new creatives and publish posts. Sign in with your Rawa account.

Ownership verified
Status
Healthy
Uptime
65.7% over 25 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A3.6/5.0

Scored across 51 tools

Disambiguation4/5

Most tools target clearly distinct resources and actions, and the descriptions explicitly route between generation, editing, resizing, and publishing. A few adjacent creative tools such as generate_design vs generate_image and adapt_design vs edit_creative could still be confused, and internal-only tools are exposed in the public tool list.

Naming Consistency5/5

Tool names consistently use snake_case with predictable verb_noun patterns such as list_creatives, get_creative, create_calendar_event, update_calendar_event, and remove_competitor. The few noun-heavy names like remove_background and upload_image_file remain readable and consistent with the overall convention.

Tool Count1/5

With 51 tools, the surface is far beyond the typical 3-15 range and is heavy for an agent to navigate, even for a broad marketing platform. The count is further inflated by internal-only tools such as watch_jobs, get_tiktok_draft, and submit_tiktok_post that the agent is told never to call.

Completeness4/5

The server covers the core domain well: brand context, creative library, generation, uploads, publishing, competitor tracking, analytics, calendar CRUD, credits, and captions. Minor lifecycle gaps remain, such as no delete_creative, no update/reschedule publication, and no cancel-job operation.

Available Tools

51 tools
adapt_designRedo a designA
Destructive
Inspect

Redo a finished Rawa design for another purpose, keeping its editable layers: fix or translate its wording (copy), change its shapes, colours or positions (graphics), put another product or subject in it (subject), re-lay it out on another canvas (resize), or turn a still into a clip (animate). Cost: copy, graphics, subject and resize cost one design (50 credits); animate makes a 6 s motion design, 240 credits. A clip being redone keeps its length and is priced as one. Works on any finished design of the brand, from list_creatives or the gallery. Call with dryRun: true first and tell the user the cost. Once they agree, pass the quoted credits as expectedCredits; a call that would cost a different amount is refused. Give each new generation a new requestId, and repeat it unchanged only on a retry: a retry within 2 minutes returns the first result and is not charged again. Without a requestId, the same arguments within 2 minutes count as a retry. Needs generation allowed over MCP (see get_workspace); a dry run still quotes when it is not, and says why the call would be refused in wouldRefuse. Returns a jobId, creditsCharged and creditsRemaining; ready in 1 to 5 minutes, a clip longer. If a job panel shows, it tracks the work: do not poll, end your turn with one line saying it is under way, and later use show_creatives with the creativeIds you are told. Otherwise call wait_for_jobs with the jobIds until allFinal is true.

NameRequiredDescriptionDefault
changeYesWhat the redo changes.
dryRunNotrue: return the exact cost (credits, breakdown, balanceAfter) without charging or starting anything, and wouldRefuse when the organization's spending controls would refuse the real call.
outputNoWhere the result lands: asset (the default) is a new creative beside the original; version adds it to the original's version history; replace deletes the original's current file and puts the result in its place. resize and animate cannot replace.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
entityIdNoFor change subject: the entity id from list_entities the design should now feature.
requestIdNoYour own unique id for this request. Use a new one for every new request, even with the same arguments. Repeat it unchanged only to retry this exact call within 2 minutes; the retry returns the first result.
creativeIdYesA creative id from list_creatives, search_library, get_job or get_upload.
aspectRatioNoRequired for change resize, and ignored otherwise: the new canvas shape, by name or ratio ("9:16"). It must differ from the design's own, or the redo is a charge for nothing.
instructionsYesWhat to change, in plain words. Anything you do not mention stays as it is.
designSystemIdNoA design system id from list_design_systems, the look to make it in. Omit for the design system the design was made in.
expectedCreditsNoThe credits the dryRun quoted and the user agreed to. The call is refused if it would cost a different amount.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations it discloses the credit economics per mode (1 design / 50 credits vs. 240 for animate), the expectedCredits price-lock refusal, the 2-minute requestId retry window with no re-charge, the 1-5 minute latency, and exactly what the call returns (jobId, creditsCharged, creditsRemaining). The destructiveHint is given concrete substance, since 'replace' deletes the original's current file and that restriction (not for resize/animate) is stated.

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

Conciseness4/5

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

Front-loaded: the purpose and mode enumeration come first, then pricing, then the call protocol, so an agent can stop reading early for a quick call. It is dense and long, with several run-on clauses (cost, retry, permission, polling) stacked in single sentences, which costs a point on readability rather than on wasted content.

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

Completeness5/5

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

Though it has an output schema, the description still covers what matters operationally: what comes back, how long it takes, that a job panel means do not poll, and the exact follow-up call in each branch. For an 11-parameter, credit-charging, asynchronous, potentially destructive tool, nothing an agent needs to call it safely is missing.

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

Parameters4/5

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

Schema coverage is already 100%, so the bar for extra value is high, and the description clears it for the workflow parameters: it explains that dryRun is a quote-only call to run first, that expectedCredits must match the quoted amount or the call is refused, and that requestId must be new per request but repeated verbatim on a retry. Other parameters (aspectRatio must differ from the design's own; entityId for subject) are covered adequately by the schema itself.

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

Purpose4/5

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

A specific verb-plus-resource statement ('Redo a finished Rawa design … keeping its editable layers') that immediately enumerates the five modes (copy, graphics, subject, resize, animate), so an agent knows exactly what capability this is. It loses the top mark because it never names the closely-related siblings (resize_creative, edit_creative) that an agent must choose between for the resize and copy cases.

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

Usage Guidelines5/5

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

It states the preconditions ('Works on any finished design of the brand, from list_creatives or the gallery'), the mandatory dryRun-first protocol, and the follow-up branch: use show_creatives if a job panel appears, otherwise wait_for_jobs with jobIds until allFinal. It also names the permission gate and points to get_workspace to check it, so the agent knows the fallback when generation is not allowed.

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

add_competitorAdd competitorAInspect

Start tracking a competitor's ads on one ad channel: Meta (Facebook and Instagram, the default), TikTok, Snapchat, Google or LinkedIn, so its ads and reports appear in list_competitor_ads and get_competitor_analyses. Search by company name: when the name matches one advertiser it is added, otherwise a list of candidates comes back and you add the right one by passing its advertiserId and name (with the same channel). Costs 50 credits per competitor added, charged once, then 50 credits a day while it is tracked; searching is free. Pass dryRun to see the cost without adding; it quotes even when the add would be refused (the brand's watchlist full, the advertiser already tracked), and says why in wouldRefuse. Once the user agrees, pass the quoted credits as expectedCredits; an add that would cost a different amount is refused. Give each new add a new requestId, and repeat it unchanged only on a retry: a retry within 2 minutes returns the first result and is not charged again. Without a requestId, the same arguments within 2 minutes count as a retry. Needs an admin who has allowed generation over MCP, and may be limited to admins.

NameRequiredDescriptionDefault
nameNoThe candidate's name, required alongside advertiserId.
queryNoThe competitor's name, as it appears on the channel (its Facebook page on Meta).
dryRunNoFind the advertiser and return what adding it would cost, without adding it or charging.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
channelNoThe ad channel to track the competitor on. Defaults to meta.
requestIdNoYour own unique id for this request. Use a new one for every new request, even with the same arguments. Repeat it unchanged only to retry this exact call within 2 minutes; the retry returns the first result.
advertiserIdNoThe advertiserId of a candidate from an earlier call. name is required with it.
expectedCreditsNoThe credits the dryRun quoted and the user agreed to. The call is refused if it would cost a different amount.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Beyond annotations, the description discloses the full cost model (50 credits per add, then 50 credits/day, search free), dryRun quote behavior including refusal cases, expectedCredits mismatch refusal, requestId retry semantics, and admin permission requirements. This is exactly the kind of behavioral context the annotations do not carry.

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

Conciseness4/5

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

The description is dense and front-loaded with the main action before costs, dryRun, retries, and permissions. It is longer than typical but every sentence contributes necessary operational context for a complex mutation tool, though the single-paragraph structure could be easier to scan.

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

Completeness5/5

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

Given the tool's complexity, eight parameters, existing output schema, and mutation annotations, the description covers the critical gaps an agent needs: cost, dryRun workflow, expectedCredits guard, retry behavior, ambiguity handling, and permissions. Nothing essential for correct invocation appears missing.

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

Parameters4/5

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 meaningful workflow semantics: query vs advertiserId/name candidate flow, keeping the same channel when adding a candidate, and how expectedCredits must match the dryRun quote. It does not add syntax-level details beyond the schema, but it clarifies parameter relationships well.

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

Purpose5/5

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

The description states a specific verb and resource: 'Start tracking a competitor's ads' on a named ad channel, and connects the result to list_competitor_ads and get_competitor_analyses. An agent can distinguish this from list_competitors or get_competitor_analyses 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.

Usage Guidelines4/5

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

The description gives clear operational context: use query to search by company name, handle multiple candidates by passing advertiserId and name, and use dryRun before agreeing to costs. It does not explicitly state when not to use this tool or name remove_competitor as the alternative for stopping tracking, so it stops short of the full when/when-not/alternatives bar.

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

cancel_publicationCancel scheduled postA
DestructiveIdempotent
Inspect

Call off a post that is still scheduled and has not started publishing. The post is removed from the schedule for good; the creative itself is untouched. A post that is already publishing or published cannot be cancelled here. Needs an admin to allow publishing over MCP (see get_workspace).

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
publicationIdYesA publication id from list_publications.

Output Schema

NameRequiredDescription
platformYes
cancelledYes
scheduledAtNo
publicationIdYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already flag destructive and idempotent, but the description adds real substance beyond them: the schedule removal is permanent, the creative itself is left intact, and in-flight/published posts are out of scope. It also discloses an authorization prerequisite (admin must enable publishing over MCP) that no annotation conveys.

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

Conciseness4/5

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

Front-loaded with purpose, then irreversibility, scope limit, and prerequisite in short clauses with no filler. The trailing permission sentence is terse to the point of being a fragment, which slightly hurts readability.

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

Completeness5/5

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

An output schema exists so return values need no explanation. Given a two-parameter mutation tool, the description covers permanence, side-effect scope, excluded states, and the authorization gate — everything an agent needs to invoke it safely.

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

Parameters3/5

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

Schema description coverage is 100%, so both publicationId and brandId are already documented, including the single-brand omission rule. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (call off/cancel) applied to a specific resource (a scheduled post) plus a scope condition (still scheduled, not yet publishing). This clearly separates it from submit_publication and list_publications without opening any schema.

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

Usage Guidelines4/5

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

Gives an explicit exclusion (already publishing or published cannot be cancelled here) and a prerequisite path via get_workspace for the admin publishing-over-MCP setting. It does not name the alternative tool to use for the published-post case, so it falls just short of full routing guidance.

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

create_calendar_eventCreate calendar eventAInspect

Add an event to the brand's marketing calendar: a launch, a promotion, a campaign moment. It belongs to the brand and is separate from the holidays and cultural moments Rawa curates. Free. The same call repeated within 2 minutes returns the event already made, with deduplicated: true, rather than a second one.

NameRequiredDescriptionDefault
dateYesThe day it starts. ISO date, e.g. 2026-09-21.
titleYes
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
endDateNoThe last day, for a multi-day event. ISO date, e.g. 2026-09-21.
marketsNoMarket ids from get_brand. Omit for all of the brand's markets.
descriptionYesWhat happens and why it matters for marketing.

Output Schema

NameRequiredDescription
dateNo
titleYes
eventIdYes
deduplicatedNoThe same call was made in the last 2 minutes: this is its result, not charged again.

TDQS

A4.1/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses cost ("Free") and, critically, the duplicate-call semantics — the same call within 2 minutes returns the existing event with deduplicated: true instead of creating a second one. That time-boxed behavior cannot be expressed by idempotentHint: false, so the description is adding genuine value rather than restating the annotation, and it does not contradict it (outside the 2-minute window duplicates are still possible).

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

Conciseness4/5

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

Three short sentences, front-loaded with purpose before the scoping caveat and the dedup behavior. The one-word sentence "Free." is terse but does carry real information; slightly tighter phrasing could fold it into the prior sentence.

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

Completeness4/5

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

An output schema exists and all parameters are documented, so the description only had to cover cost and duplicate-call behavior, which it does. What remains unsaid is what the returned object contains beyond deduplicated: true and whether repeated calls outside the window are safe — minor given the output schema.

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

Parameters3/5

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

Schema coverage is 83% and every parameter including brandId, markets and description already carries its own description, so the baseline is 3. The prose adds only a weak hint that the event "belongs to the brand," implying brandId scoping, but no format, default, or constraint detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ("Add an event to the brand's marketing calendar") and scopes it with concrete examples (launch, promotion, campaign moment). It also delimits the resource against adjacent content ("separate from the holidays and cultural moments Rawa curates") and, by virtue of "Add", is distinguishable from list_calendar_events, update_calendar_event and delete_calendar_event.

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

Usage Guidelines3/5

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

Usage is implied by the examples of what counts as a calendar entry and by the note that it is "Free," so an agent can infer this is the cheap way to record a brand-owned moment. However, no sibling is named and there is no explicit when-not guidance (e.g., use update_calendar_event rather than re-creating, or that this does not cover holidays).

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

delete_calendar_eventDelete calendar eventA
DestructiveIdempotent
Inspect

Delete one of the brand's own calendar events. This cannot be undone. Rawa-curated events (holidays, seasons, cultural moments) cannot be deleted. Free.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
eventIdYesA calendar event id from list_calendar_events. Rawa-curated events are not editable.

Output Schema

NameRequiredDescription
titleYes
deletedYes
eventIdYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered structurally. The description adds real value beyond that: irreversibility, the protection of curated events, and that the call is free.

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

Conciseness5/5

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

Four short sentences, with the scope, the irreversibility warning, the exclusion, and the cost each stated once. Zero redundancy and no burying of the critical warning.

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

Completeness4/5

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

An output schema exists so return values need not be explained, and the annotations plus description cover the destructive profile and validity constraints. What is missing is minor: failure behavior for a nonexistent or already-deleted eventId, and no pointer to the edit alternative.

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

Parameters3/5

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

Schema coverage is 100% and both parameters carry their own descriptions, so the baseline is 3. The description only reinforces that the targeted event must be brand-owned and non-curated, without adding syntax or format detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('Delete ... calendar events') and narrows scope to 'the brand's own' events, explicitly excluding Rawa-curated ones. An agent can distinguish this from update_calendar_event or cancel_publication 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.

Usage Guidelines4/5

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

Gives a clear exclusion ('Rawa-curated events cannot be deleted') and a consequence warning ('This cannot be undone'), which is genuine when/when-not guidance. It stops short of naming alternatives such as update_calendar_event for modifying rather than removing an event.

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

edit_creativeEdit an imageAInspect

Edit a finished image from written instructions: change or remove something in it, or add something to it. Headlines, text or a layout on a photo are a design, not an edit: use generate_design with the photo as photoCreativeId, which keeps the photo as it is and sets the type in the brand's fonts. For a design made in Rawa, prefer adapt_design, which keeps its editable layers. The source is a creative of the brand (creativeId) or an image on the web (imageUrl: a direct, public URL to a JPEG, PNG or WebP file). An image the user pasted or attached in the chat has no such URL and you cannot read it yourself: call request_image_upload right away (do not ask them to re-attach it), and once the image has landed use its creativeId here. An image you hold as a file on your own filesystem (a coding agent in a project) goes through upload_image_file instead. A linked image is added to the brand's library first and its creativeId is returned as sourceCreativeId; an image the library already holds is not added again, and sourceCreativeId is that creative, with alreadyInLibrary: true. Reuse sourceCreativeId for any further work on the same image instead of passing imageUrl again. Cost: 30 credits. Call with dryRun: true first and tell the user the cost. Once they agree, pass the quoted credits as expectedCredits; a call that would cost a different amount is refused. Give each new generation a new requestId, and repeat it unchanged only on a retry: a retry within 2 minutes returns the first result and is not charged again. Without a requestId, the same arguments within 2 minutes count as a retry. Needs generation allowed over MCP (see get_workspace); a dry run still quotes when it is not, and says why the call would be refused in wouldRefuse. Returns a jobId, creditsCharged and creditsRemaining; ready in 1 to 5 minutes. If a job panel shows, it tracks the work: do not poll, end your turn with one line saying it is under way, and later use show_creatives with the creativeIds you are told. Otherwise call wait_for_jobs with the jobIds until allFinal is true.

NameRequiredDescriptionDefault
dryRunNotrue: return the exact cost (credits, breakdown, balanceAfter) without charging or starting anything, and wouldRefuse when the organization's spending controls would refuse the real call.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
imageUrlNoA direct, publicly reachable https URL of the image to work on, when it is not in the library yet.
requestIdNoYour own unique id for this request. Use a new one for every new request, even with the same arguments. Repeat it unchanged only to retry this exact call within 2 minutes; the retry returns the first result.
creativeIdNoA creative id from list_creatives, search_library, get_job or get_upload.
instructionsYesWhat to change in the image, in plain words.
expectedCreditsNoThe credits the dryRun quoted and the user agreed to. The call is refused if it would cost a different amount.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: states the 30-credit cost, mandates a dryRun-first confirmation flow, explains the expectedCredits guard, the requestId retry/dedup window (2 minutes, not re-charged), the MCP generation permission gate with wouldRefuse on dry run, the 1–5 minute latency, and the no-polling rule. These are operational facts an agent cannot infer from readOnlyHint/openWorldHint/idempotentHint.

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

Conciseness4/5

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

Front-loaded with purpose before routing and cost mechanics, and nearly every sentence carries actionable information. It is long (roughly 280 words), but the length is driven by a genuinely multi-path workflow rather than padding; a tighter split of job-tracking guidance would still help.

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

Completeness5/5

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

For a costly, asynchronous, multi-source generation tool it covers sourcing, permissions, cost/confirmation, retry semantics, latency, and post-call tracking. Return fields are described even though an output schema exists, and nothing needed 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.

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each field and the baseline would be 3. The description adds real meaning on top: the creativeId-vs-imageUrl source choice, the sourceCreativeId/alreadyInLibrary return semantics, and the instruction to reuse sourceCreativeId rather than re-passing imageUrl.

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

Purpose5/5

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

States a specific verb and resource ('Edit a finished image from written instructions') and immediately bounds scope ('change or remove something in it, or add something to it'). It then explicitly separates itself from generate_design and adapt_design, so an agent can pick the right tool without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit alternatives keyed to conditions: text/layout on a photo → generate_design with photoCreativeId; a Rawa design → adapt_design; a pasted/attached image → request_image_upload; a local file → upload_image_file. Follow-up routing is also specified (show_creatives vs wait_for_jobs).

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

generate_designGenerate designsAInspect

Generate designs for a brand, such as ads and social posts: finished, on-brand designs made by Rawa from the brief, one or more per concept. To put a headline, copy or a layout on the user's own photo and keep the photo exactly as it is, pass it as the concept's photoCreativeId: the type is set in the brand's fonts as editable layers, not painted into the picture. Cost: every design is charged, and a call makes concepts × designsPerConcept of them, priced by format. Call with dryRun: true first and tell the user the cost. Once they agree, pass the quoted credits as expectedCredits; a call that would cost a different amount is refused. Give each new generation a new requestId, and repeat it unchanged only on a retry: a retry within 2 minutes returns the first result and is not charged again. Without a requestId, the same arguments within 2 minutes count as a retry. Needs generation allowed over MCP (see get_workspace); a dry run still quotes when it is not, and says why the call would be refused in wouldRefuse. Returns jobs, one jobId per concept, creditsCharged and creditsRemaining; ready in 1 to 5 minutes, a clip longer. If a job panel shows, it tracks the work: do not poll, end your turn with one line saying it is under way, and later use show_creatives with the creativeIds you are told. Otherwise call wait_for_jobs with the jobIds until allFinal is true.

NameRequiredDescriptionDefault
briefYesWhat the campaign is for, in the user's own words: the offer, the occasion, the audience, the tone.
dryRunNotrue: return the exact cost (credits, breakdown, balanceAfter) without charging or starting anything, and wouldRefuse when the organization's spending controls would refuse the real call.
formatYesPer design: still is a still image, 50 credits. motion is an animated clip designed scene by scene, 3, 5, 6, 8, 10, 15, 20, 30 s long (default 6), 40 credits a second.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
conceptsYesOne entry per creative idea. Each becomes its own job.
entityIdsNoIds from list_entities of the products, places, ambassadors or design elements the design must feature. The designer uses that entity's real images, so only name what the user asked for.
placementNoWhere the ads will run, so the designer keeps that platform's safe zones clear. instagram_feed: Instagram / Facebook feed (1:1 or 4:5); instagram_story: Instagram / Facebook Stories (9:16); instagram_story_ad: Instagram / Facebook Stories ad (9:16); instagram_reels: Instagram Reels (9:16); instagram_reels_ad: Instagram Reels ad (9:16); tiktok_organic: TikTok (organic) (9:16); tiktok_ad: TikTok in-feed ad (9:16); snapchat: Snapchat Story (9:16); snapchat_ad: Snapchat Snap Ad (9:16); linkedin_feed: LinkedIn feed / sponsored (static) (1:1, 4:5 or 1.91:1); linkedin_video: LinkedIn feed (video) (9:16); linkedin_video_ad: LinkedIn sponsored (video) (9:16); google_display: Google Display (responsive) (1:1 or 1.91:1); youtube_instream: YouTube in-stream (16:9); youtube_shorts: YouTube Shorts (9:16); youtube_shorts_ad: YouTube Shorts ad (9:16). Omit for a plain margin on every edge.
requestIdNoYour own unique id for this request. Use a new one for every new request, even with the same arguments. Repeat it unchanged only to retry this exact call within 2 minutes; the retry returns the first result.
audienceIdNoAn audience id from list_audiences; the designs then read that audience's age, gender, language, markets, voice and photography.
aspectRatioYesThe canvas shape of every design, by name or ratio ("9:16" is portrait_9_16).
designSystemIdNoA design system id from list_design_systems, the look to make it in. Omit for the audience's own design system when it has one, otherwise the brand's default.
durationSecondsNomotion only: the clip length in seconds, one of the lengths motion lists.
expectedCreditsNoThe credits the dryRun quoted and the user agreed to. The call is refused if it would cost a different amount.
designsPerConceptNoHow many different designs to make for each concept. Defaults to 1. The call makes concepts × designsPerConcept designs, each charged.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses charging behavior (every design charged, cost = concepts × designsPerConcept, priced by format), dry-run quoting, expectedCredits refusal, retry deduplication within two minutes, permission requirements, and output timing. These are exactly the behavioral traits an agent needs for a costly, non-idempotent mutation with asynchronous completion.

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

Conciseness5/5

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

The description is long but every sentence carries a distinct operational rule for a complex, high-cost, asynchronous tool. Purpose, photo handling, cost, retry, permissions, outputs, and polling are front-loaded in a sensible sequence with no filler.

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

Completeness5/5

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

Given the tool's complexity, 14 parameters, output schema, and asynchronous job model, the description covers the essential context: cost flow, dry-run requirement, retry behavior, permission checks, return shape at a high level, timing, and job-tracking alternatives. The output schema's existence means return values need not be fully restated, but the description still orients the agent adequately.

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

Parameters4/5

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

Schema coverage is 100% and the input schema already documents every parameter in detail. The description still adds cross-parameter meaning beyond the schema, especially the cost formula involving concepts and designsPerConcept, the expectedCredits refusal condition, requestId retry semantics, and photoCreativeId's exact preservation behavior.

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

Purpose5/5

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

The description opens with a precise verb and resource: generating finished, on-brand designs from a brief, one or more per concept. It implicitly distinguishes itself from generate_image by emphasizing full designs made by Rawa, and it explicitly distinguishes the photoCreativeId path where the user's photo is kept intact rather than generated.

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

Usage Guidelines5/5

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

It gives explicit operating instructions: call with dryRun first, tell the user the cost, then pass expectedCredits after agreement; use a new requestId per request and repeat only on retry. It also routes the agent correctly for job tracking: if a job panel shows, do not poll and use show_creatives later; otherwise call wait_for_jobs until allFinal is true.

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

generate_imageGenerate imagesAInspect

Generate on-brand images (photography, scenes, product shots) from prompts. Not a design: no headline, logo or layout - use generate_design for those. One call takes every image the user asked for: one entry in images per different image, never one call per image. To build on images the user picked ("like this one but tighter", "the same scene from another angle"), name them in that entry's referenceCreativeIds rather than starting from scratch. Cost: charged per image, 30 credits at quality standard, 20 at fast (the cheaper model). A call makes images × count of them. Call with dryRun: true first and tell the user the cost. Once they agree, pass the quoted credits as expectedCredits; a call that would cost a different amount is refused. Give each new generation a new requestId, and repeat it unchanged only on a retry: a retry within 2 minutes returns the first result and is not charged again. Without a requestId, the same arguments within 2 minutes count as a retry. Needs generation allowed over MCP (see get_workspace); a dry run still quotes when it is not, and says why the call would be refused in wouldRefuse. Returns jobs, one jobId per entry in images, creditsCharged and creditsRemaining; ready in 1 to 5 minutes. If a job panel shows, it tracks the work: do not poll, end your turn with one line saying it is under way, and later use show_creatives with the creativeIds you are told. Otherwise call wait_for_jobs with the jobIds until allFinal is true.

NameRequiredDescriptionDefault
countNoHow many variations of each entry to make. Defaults to 1. The call makes images × count images, each charged.
dryRunNotrue: return the exact cost (credits, breakdown, balanceAfter) without charging or starting anything, and wouldRefuse when the organization's spending controls would refuse the real call.
imagesYesEvery image the user asked for, one entry per different image. Each becomes its own job.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
qualityNoDefaults to standard.
entityIdsNoIds from list_entities of the products, places, ambassadors or design elements the design must feature. The designer uses that entity's real images, so only name what the user asked for.
requestIdNoYour own unique id for this request. Use a new one for every new request, even with the same arguments. Repeat it unchanged only to retry this exact call within 2 minutes; the retry returns the first result.
aspectRatioYesThe canvas shape, by name or ratio ("9:16" is portrait_9_16).
designSystemIdNoA design system id from list_design_systems, the look to make it in. Omit for the brand's default design system.
expectedCreditsNoThe credits the dryRun quoted and the user agreed to. The call is refused if it would cost a different amount.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say it is a non-read-only, non-destructive, non-idempotent write. The description adds the facts an agent actually needs: per-image pricing (30 standard / 20 fast), a 2-minute free retry window keyed on requestId, the expectedCredits mismatch refusal, and the MCP-generation permission prerequisite surfaced through wouldRefuse on a dry run.

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

Conciseness4/5

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

Front-loaded with purpose and the alternative, and every sentence carries a distinct operational fact. It is dense and slightly sprawling across cost, retry and job-polling topics, but not padded; the return-value sentence overlaps somewhat with the output schema.

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

Completeness5/5

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

Covers cost quoting, the confirm-then-call sequence, idempotency/retry handling, permission failure mode, expected latency (1-5 minutes) and the two follow-up paths (job panel vs wait_for_jobs). Nothing an agent needs to invoke and follow through correctly is missing.

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

Parameters4/5

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 still adds real meaning by explaining the images array cardinality rule (one entry per distinct image, all in a single call) and how referenceCreativeIds differs from prompting from scratch, though it does not extend semantics for aspectRatio, quality or brandId beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ("Generate on-brand images ... from prompts") and immediately names the excluded sibling ("Not a design: no headline, logo or layout - use generate_design for those"). An agent can distinguish this from generate_design without opening either schema.

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

Usage Guidelines5/5

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

Explicit routing rules: use generate_design for layouts, use referenceCreativeIds when the user points at existing images, one call for all requested images rather than one call per image. It also prescribes the dryRun-then-expectedCredits workflow and what to do instead of polling when a job panel appears.

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

get_brandGet brand identityB
Read-onlyIdempotent
Inspect

A brand's identity: about, markets, voice, photography guidelines, colour palette, fonts, categories and logo URLs.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.

Output Schema

NameRequiredDescription
idYes
nameYes
aboutNo
fontsYes
goalsNo
logosYes
marketsNo
ctaStylesYes
brandVoiceNo
categoriesYes
industriesNo
websiteUrlNo
colorPaletteYes
photographyGuidelinesNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is fully covered. The description contributes only a field inventory, which is largely redundant with the existing output schema; it says nothing about shape, failure modes, or whether missing sections are omitted or null.

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

Conciseness4/5

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

A single tight fragment with zero filler and the content list front-loaded. It would be stronger as a complete sentence with a verb, but nothing in it is wasted.

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

Completeness4/5

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

For a simple read-only lookup with one optional, well-documented parameter and an existing output schema plus full annotations, the coverage of what data comes back is sufficient. Only the absence of sibling differentiation keeps it from a 5.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already explains that brandId accepts an id from get_workspace/list_brands or a brand name and may be omitted for single-brand organizations. The description adds nothing beyond that, so the baseline 3 applies.

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

Purpose4/5

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

The fragment enumerates exactly what a caller receives (about, markets, voice, photography guidelines, colour palette, fonts, categories, logo URLs), which makes the resource unmistakable. It lacks an explicit verb such as 'returns' and never distinguishes itself from the similarly named sibling get_brand_analysis, 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.

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance at all — no mention of how this differs from get_brand_analysis, get_workspace, or list_brands. The only usage-adjacent info (omit brandId for single-brand orgs) lives in the schema, not the description.

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

get_brand_analysisGet brand analysisA
Read-onlyIdempotent
Inspect

Use this when the user wants the story rather than the numbers: the latest written analysis Rawa made of the brand's marketing performance, one per connected account (pass account for one).

NameRequiredDescriptionDefault
accountNoOne connected account to read. Omit it for every connected analytics account; each comes back on its own, never combined.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.

Output Schema

NameRequiredDescription
accountsYesThe newest analysis of each connected analytics account.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: results are the *latest* analysis and come back 'one per connected account... never combined', which tells the agent to expect a fan-out rather than a merged document. It doesn't mention what a missing analysis yields or how fresh the analysis is.

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

Conciseness5/5

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

A single sentence, front-loaded with the usage cue and followed by the resource description and the per-account scoping note. No filler or redundant phrasing.

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

Completeness4/5

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

An output schema exists, so return-value shape needn't be explained, and the multi-account fan-out plus optional account filter is covered. The remaining gap is edge-case behavior — what is returned when no analysis has been produced yet, or whether results are ordered/paginated.

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

Parameters3/5

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

Schema coverage is 100% and the nested account object already documents platform/accountId and the omit-for-all behavior, so the schema does the heavy lifting. The description restates the single-account case ('pass account for one') and says nothing about brandId, adding little meaning beyond structured fields. Baseline 3 applies.

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

Purpose4/5

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

The description names a specific resource — 'the latest written analysis Rawa made of the brand's marketing performance' — and frames it as 'the story rather than the numbers', which implicitly separates it from a metrics tool like get_performance_overview. It is clear what is returned, though it never names a sibling tool outright.

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

Usage Guidelines4/5

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

'Use this when the user wants the story rather than the numbers' gives an explicit selection condition tied to narrative-vs-metric intent, which is genuinely actionable. It stops short of a full when-not statement (e.g., when to prefer the numeric overview, or what to do when no analysis exists).

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

get_competitor_analysesGet competitor reportsB
Read-onlyIdempotent
Inspect

The latest written report per competitor, and the merged view of their current offers, events, launches and objectives.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
channelNoOnly competitors watched on this ad channel. Omit for every channel the brand watches them on.
competitorIdNoA competitor id from list_competitors. Omit for every competitor the brand watches.

Output Schema

NameRequiredDescription
reportsYes
watchlistYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, and closed-world, so the safety profile is covered. The description adds some value by implying aggregation semantics: 'latest' per competitor and a 'merged' cross-signal view. It does not mention result size, freshness, or cost, but the output schema carries return-shape detail.

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

Conciseness4/5

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

A single dense sentence with no filler, and the core content (latest report plus merged offer/event view) is front-loaded. It reads as a fragment rather than a complete statement, which slightly weakens its clarity.

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

Completeness3/5

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

The tool has full schema coverage and an output schema, so much of the burden is carried elsewhere. What is missing is positioning among the many competitor-related siblings; without it, an agent may pick the audience or creative-mix tool instead.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter is well documented in the schema, including defaults and cross-references to list_brands and list_competitors. The description adds nothing about how brandId, channel, or competitorId scope the report, so baseline 3 is appropriate.

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

Purpose4/5

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

The description specifies the resource precisely: the latest written report per competitor plus a merged view of offers, events, launches, and objectives. However, it is a noun phrase with no verb and does not distinguish this tool from close siblings like get_competitor_audience or get_competitor_creative_mix.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool instead of get_competitor_audience, get_competitor_creative_mix, or list_competitors. The agent must infer selection from the name alone.

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

get_competitor_audienceGet competitor audienceA
Read-onlyIdempotent
Inspect

Who the brand's competitors aim their ads at and who the ads reached, summed over their ads: reach (people) and impressions per country, people reached by age and gender, impressions per Google surface, the genders, ages, devices and objectives targeted, and who pays for the ads. It is what the ad libraries disclose, mostly for ads shown in the EU. Sums every ad on record unless startedWithinDays or activeOnly narrows it.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
channelNoOnly competitors watched on this ad channel. Omit for every channel the brand watches them on.
activeOnlyNoOnly ads still running.
competitorIdNoA competitor id from list_competitors. Omit for every competitor the brand watches.
startedWithinDaysNoOnly ads that started within this many days. Omit for every ad on record.

Output Schema

NameRequiredDescription
agesYes
payersYes
devicesYes
gendersYesfemale / male / all, over ads that disclosed their targeting.
deliveryYesTotals per metric; reach (people) and impressions (views) never add up.
surfacesYes
totalAdsYesThe ads summed: those that started within startedWithinDays, when given.
ageGenderYes
countriesYes
languagesYes
objectivesYes
adsWithAudienceYesAds whose library disclosed any targeting or delivery.

TDQS

A3.8/5.0
Behavior4/5

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

With readOnlyHint, idempotentHint and destructiveHint already declared, the description still adds genuinely new context: the data is "what the ad libraries disclose, mostly for ads shown in the EU," which warns the agent about partial geographic coverage and upstream data limitations. It also discloses the aggregation default (sums all ads unless narrowed). No return shape or latency detail, but the safety profile is already covered.

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

Conciseness4/5

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

The lead clause is front-loaded and states the payoff first. The middle sentence is a dense but informative metric enumeration, and the closing EU-caveat sentence earns its place by flagging a real data limitation. Slightly list-heavy, but no filler.

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

Completeness5/5

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

An output schema exists, so return values need no explanation, and all five optional parameters are fully documented in the schema. What remains for the description — aggregation defaults and the EU-centric source caveat — is present, so an agent has everything needed to call this correctly and interpret the result.

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

Parameters3/5

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

Schema coverage is 100% and every parameter carries a clarifying description, so the schema does the heavy lifting. The description only reinforces the default behavior for startedWithinDays and activeOnly ("unless ... narrows it"), adding marginal meaning rather than new syntax or format guidance. Baseline 3 applies.

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

Purpose4/5

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

The description opens with a clear subject and verb phrase ("Who the brand's competitors aim their ads at and who the ads reached") and then enumerates the exact breakdowns returned: reach and impressions per country, age/gender, Google surface, and targeting attributes. That enumeration differentiates it well from get_competitor_analyses and get_competitor_creative_mix, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

"Sums every ad on record unless startedWithinDays or activeOnly narrows it" establishes the default aggregation behavior, which is a usage-relevant constraint. But it never says when to reach for this tool over list_competitor_ads or get_competitor_analyses, and lists no prerequisites or exclusions. Usage is inferable rather than stated.

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

get_competitor_creative_mixGet competitor creative mixA
Read-onlyIdempotent
Inspect

How the brand's competitors advertise in aggregate, across every ad channel they are watched on: mix of formats, media types, platforms and calls to action, plus the creative features found in their ads. Counts every ad on record unless startedWithinDays or activeOnly narrows it.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
channelNoOnly competitors watched on this ad channel. Omit for every channel the brand watches them on.
activeOnlyNo
competitorIdNoA competitor id from list_competitors. Omit for every competitor the brand watches.
startedWithinDaysNoOnly ads that started within this many days. Omit for every ad on record.

Output Schema

NameRequiredDescription
ctaTypeYes
featuresYes
platformYes
totalAdsYesThe ads summed: those that started within startedWithinDays, when given.
mediaTypeYes
displayFormatYes
adsWithFeaturesYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish that this is a read-only, idempotent, non-destructive, closed-world operation. The description adds useful behavioral context: it aggregates across every channel the brand watches and counts every ad on record unless startedWithinDays or activeOnly narrows the scope.

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

Conciseness5/5

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

The description is two tight sentences with no wasted language. It front-loads the aggregate purpose and then immediately states the default scoping behavior of the filters.

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

Completeness5/5

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

With an output schema present, the description need not explain return values, and the annotations already carry safety and idempotency semantics. The description supplies the essential conceptual model — aggregate competitor creative mix across channels, with optional filters narrowing the ad set — which 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.

Parameters3/5

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

Schema coverage is high at 80%, so most parameter meaning is already documented in the schema. The description reinforces the default counting behavior and names startedWithinDays and activeOnly as narrowing filters, but it does not add meaning for brandId, channel, or competitorId beyond what the schema provides.

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

Purpose5/5

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

The description states a specific retrieval and aggregation operation: the creative mix of a brand's competitors across watched ad channels, broken down by formats, media types, platforms, CTAs, and creative features. It is clearly distinct from list-oriented siblings like list_competitor_ads and from the individual-analysis-oriented get_competitor_analyses.

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

Usage Guidelines3/5

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

The phrase 'in aggregate' implies this is for aggregate competitor creative reporting rather than a list of individual ads, which gives some usage context. However, the description never explicitly names alternatives or states when to choose this tool versus list_competitor_ads, get_competitor_analyses, or get_competitor_audience, leaving selection to inference.

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

get_complianceGet compliance reviewA
Read-onlyIdempotent
Inspect

The compliance review of one creative, where the workspace runs them: overall score out of 100, risk level (low, medium, high) and each failed check with what it flagged and how to fix it. Returns status 'not_checked' when the creative was never reviewed.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
creativeIdYesA creative id from list_creatives, search_library, get_job or get_upload.

Output Schema

NameRequiredDescription
errorNo
marketNo
statusYes
marketsNo
checkedAtNo
riskLevelNo
creativeIdYes
failedChecksNo
overallScoreNo
passedChecksNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive, closed-world behavior, so the bar is lower; the description still adds real value by defining the result shape and the 'not_checked' sentinel for never-reviewed creatives. It does not say what happens if compliance is unavailable for the workspace or whether failed checks are paginated/truncated.

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

Conciseness5/5

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

Two sentences, no filler, and the core identification ('compliance review of one creative') is front-loaded before the return-shape detail and the not_checked caveat.

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

Completeness4/5

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

For a two-param read with full schema coverage and an output schema, this is nearly complete; the return-value summary is arguably redundant with the output schema but aids tool selection. The only real gap is no mention of the error/unavailable case when a workspace does not run compliance reviews.

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

Parameters3/5

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

Schema description coverage is 100%, so both brandId (fallback to brand name, omit for single-brand orgs) and creativeId (source tools) are fully documented in the schema. The description adds only the notion of 'one creative', so baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource ('The compliance review of one creative') and enumerates what the response contains (score out of 100, risk level, failed checks with fixes). That is far more precise than a sibling like get_creative_insights, though it never names a sibling to contrast with.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: 'where the workspace runs them' hints compliance only exists in some workspaces, and the 'not_checked' note tells the agent what a null result means. There is no explicit when-to-use/when-not guidance or pointer to an alternative (e.g., get_creative or get_creative_insights).

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

get_creativeGet creativeA
Read-onlyIdempotent
Inspect

One creative by id, with its versions and the picture itself.

NameRequiredDescriptionDefault
brandIdNoOptional: the brand it belongs to, by id or name. Read from the id when omitted.
creativeIdYesA creative id from list_creatives, search_library, get_job or get_upload.

Output Schema

NameRequiredDescription
idYes
urlNo
nameYes
typeYes
mediaYes
widthNo
heightNo
statusYes
brandIdYes
versionsYes
createdAtYes
pageCountYesPages in the design; above 1 it is a carousel, and url shows page 1 only. Editing tools refuse it.
isFavoriteYes
aspectRatioNo
thumbnailUrlNo
durationSecondsNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds a useful hint about what comes back (versions plus the rendered image), but says nothing about cost, size, or failure behavior for a missing/inaccessible id.

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

Conciseness4/5

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

A single front-loaded fragment with no waste; the key noun and scope come first. It is terse to the point of being slightly informal ('the picture itself'), but nothing is redundant.

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

Completeness4/5

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

With annotations covering safety, a fully documented two-parameter schema, and an output schema for return shape, the description needs only to state scope. It does that plus a brief payload hint, leaving only edge cases (unknown id, missing brand) unaddressed.

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

Parameters3/5

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

Schema coverage is 100% with both parameters documented, including the fallback behavior for brandId ('read from the id when omitted'). The description adds no parameter meaning beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

States a specific resource (one creative by id) plus notable payload content (versions and the image itself), which distinguishes it from list_creatives and get_creative_insights. It never names a sibling explicitly, so differentiation is inferred from the 'one ... by id' scope rather than stated.

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

Usage Guidelines3/5

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

Usage is only implied: 'one creative by id' signals single-record retrieval versus the list/search siblings, but there is no explicit when-to-use or when-not-to-use guidance. The schema's creativeId note (ids come from list_creatives, search_library, get_job, get_upload) does the routing work rather than the description.

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

get_creative_insightsGet creative insightsA
Read-onlyIdempotent
Inspect

Use this when the user asks what kind of creative works for the brand: the creative features that lift paid click-through and organic engagement, its winning creatives, where its paid ads delivered, and how many competitors it watches on which ad channels (get_competitor_creative_mix reads their ads). The lifts, creatives and placements are per connected account, each on its own and never combined; pass account for one. Engagement rate is (likes + comments + shares + saves) / reach × 100 for organic posts.

NameRequiredDescriptionDefault
accountNoOne connected account to read. Omit it for every connected analytics account; each comes back on its own, never combined.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
windowDaysNoReporting window in days. Defaults to 90.

Output Schema

NameRequiredDescription
accountsYesOne entry per connected analytics account, never combined.
windowDaysYes
competitorsYesWho the brand watches; get_competitor_creative_mix and list_competitor_ads read their ads.
connectedPlatformsYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the read-only, idempotent, closed-world safety profile, and the description earns its keep by disclosing a key aggregation behavior: results are per connected account, each on its own and never combined, with the account parameter selecting one. It also spells out the engagement-rate formula, which is behavioral context the 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.

Conciseness4/5

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

The usage trigger is front-loaded and the second sentence groups the returned artifacts compactly. The prose is dense, with a long mid-sentence list and a parenthetical, but almost every clause carries information rather than filler.

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

Completeness4/5

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

An output schema exists, so return values need not be explained, and the description covers the trigger, per-account aggregation, the sibling boundary, and the engagement-rate definition. It leaves slight ambiguity about how windowDays interacts with the per-account breakdown, but overall it is sufficient to call the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents platform, accountId, brandId and the windowDays default. The description reinforces the per-account scoping semantics of 'account' but adds little beyond what the nested schema description and brandId note already state. Baseline 3 is appropriate 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.

Purpose5/5

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

The description names a concrete payload: creative features that lift paid CTR and organic engagement, winning creatives, ad placements, and competitor/channel counts. It distinguishes itself from a named sibling by noting that get_competitor_creative_mix reads competitors' ads, so an agent can separate the two without opening either schema.

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

Usage Guidelines4/5

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

The opening clause gives an explicit trigger: 'Use this when the user asks what kind of creative works for the brand.' It also points to get_competitor_creative_mix for competitor ad content. It does not contrast with other analytics siblings like get_performance_overview or get_brand_analysis, so the routing guidance is clear but not exhaustive.

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

get_credit_statusGet credit statusA
Read-onlyIdempotent
Inspect

How many credits the workspace has left, the plan it is on, the brand's monthly credit budget (when it has one) and what it has used this month, plus the price in credits of every tool that spends. Call this before offering to generate anything, and quote the cost to the user.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.

Output Schema

NameRequiredDescription
brandYes
creditCostsYes
organizationYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is met structurally. The description adds genuine context beyond that: the brand budget is conditional ('when it has one') and the intended downstream behavior is to quote cost to the user. It stops short of noting any caching/freshness behavior, hence 4.

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

Conciseness5/5

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

Two sentences: the first front-loads the return contents, the second is the actionable directive. No filler or restated title text.

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

Completeness5/5

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

An output schema exists so return shape needn't be explained, annotations cover the safety profile, and the parameter is fully documented in the schema. The description supplies the one thing structure can't: when to call and what to do with the numbers.

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

Parameters3/5

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

Schema description coverage is 100%, and the brandId field already documents its source (get_workspace/list_brands) and the single-brand omission rule. The description adds nothing about the parameter, so baseline 3 applies.

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

Purpose5/5

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

Enumerates exactly what the tool returns (remaining credits, plan, per-brand monthly budget and usage, per-tool credit prices) rather than restating the name. No sibling in the list touches billing, 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.

Usage Guidelines5/5

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

Explicit directive: 'Call this before offering to generate anything, and quote the cost to the user.' That ties usage directly to the generation siblings (generate_design, generate_image, adapt_design) and tells the agent what to do with the result.

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

get_jobGet jobA
Read-onlyIdempotent
Inspect

The state of a generation job started by generate_design, generate_image, adapt_design, resize_creative, remove_background, sharpen_creative or edit_creative: running, completed, failed or rejected, how many of its images are done, the error if it failed, and the finished creatives with their media URLs. Finished images come back as pictures too, for you to look at; to show them to the user, call show_creatives with their ids rather than pasting URLs. To wait for jobs to finish, call wait_for_jobs instead. A final job never changes, so do not read it again.

NameRequiredDescriptionDefault
jobIdYesThe jobId a generation tool returned.
brandIdNoOptional: the brand it belongs to, by id or name. Read from the id when omitted.

Output Schema

NameRequiredDescription
idYes
nextYes
errorNo
finalYesTrue once the job has completed, failed or been rejected: it will not change again.
mediaYes
statusYes
brandIdYes
progressYes
creativesYes
operationYes
submittedAtYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent, so the description is free to add the traits that matter: final jobs are immutable (so re-reads are wasted calls) and finished images are returned inline as pictures the model can inspect. That is real behavioral context beyond the structured fields, not a restatement of them.

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

Conciseness4/5

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

Front-loaded with the core purpose and packed with useful detail, with no filler sentences. The long run-on enumeration of seven generator tools and the chained clauses make it slightly dense to parse, but every clause carries information an agent needs.

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

Completeness5/5

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

An output schema exists, yet the description still tells the agent what the response contains (status, progress, error, media URLs, inline images) and what to do with it. Combined with the immutability rule and the sibling routing, an agent has everything needed to call this correctly on the first try.

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

Parameters3/5

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

Schema coverage is 100%, so both jobId and the optional brandId (including the 'read from the id when omitted' fallback) are already documented in the schema. The description only implicitly ties jobId to the generation tools and says nothing about brandId, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ("the state of a generation job") and enumerates the possible states and payload (progress counts, error, finished creatives with media URLs). It also names the exact upstream tools that produce a jobId, so the agent knows where the input comes from 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.

Usage Guidelines5/5

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

Explicit routing: use wait_for_jobs to block on completion, use show_creatives to display results instead of pasting URLs, and do not re-poll a final job. Each alternative is named with the condition that selects it, which is exactly the when/when-not guidance needed next to siblings wait_for_jobs, watch_jobs and show_creatives.

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

get_performance_overviewGet performance overviewA
Read-onlyIdempotent
Inspect

Use this when the user asks how the brand's marketing is doing in numbers: KPIs for the window with their trend, reach and the top posts, per connected account, each on its own and never combined (pass account for one). Numbers are the platform's own; a rate the platform does not report is absent. Engagement rate is (likes + comments + shares + saves) / reach × 100 for organic, and post engagements / reach × 100 for paid.

NameRequiredDescriptionDefault
accountNoOne connected account to read. Omit it for every connected analytics account; each comes back on its own, never combined.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
windowDaysNoReporting window in days. Defaults to 90.

Output Schema

NameRequiredDescription
accountsYesOne entry per connected analytics account, never combined.
windowDaysYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's remaining burden is domain behavior, which it meets: it discloses that numbers are the platform's own, that unreported rates are simply absent rather than zero, and gives the exact engagement-rate formulas for organic vs. paid. It does not discuss caching/freshness or data latency, which is the main residual gap for a metrics tool.

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

Conciseness4/5

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

The trigger condition is front-loaded in the first clause, followed by the returned payload, the scoping rule, and then the metric definitions. It is dense but each sentence carries information an agent needs; the formulas are slightly heavy for a description but justify their space by preventing misreading of engagement rate.

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

Completeness5/5

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

An output schema exists, so return shapes need not be explained, and the description fills the remaining gaps: what is measured, at what granularity, over what window, and how derived rates are computed or omitted. Combined with the fully described three-parameter schema, an agent can call this correctly without opening anything else.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description earns an increment by clarifying the aggregation semantics of 'account' — one account when passed, all accounts returned separately and never combined — which is the parameter's most consequential behavior. It adds nothing about windowDays beyond the schema's stated default of 90, and brandId resolution is already handled in the schema text.

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

Purpose4/5

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

The description states a specific verb and resource ('how the brand's marketing is doing in numbers') and enumerates the payload: KPIs with trend, reach, and top posts. It also pins the granularity ('per connected account, each on its own and never combined'), which separates it from aggregate siblings like get_brand_analysis. It never names those siblings explicitly, so the differentiation is inferential rather than stated.

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

Usage Guidelines4/5

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

The opening clause gives a clear triggering condition tied to a user intent, and 'pass account for one' vs. omitting it for every account gives concrete selection guidance. There is no explicit when-not or named alternative tool, so an agent facing an overlapping analysis request (e.g. get_creative_insights) must still reason about which to pick.

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

get_tiktok_draftTikTok panel draftC
Read-onlyIdempotent
Inspect

Internal to the Rawa TikTok panel: the post it is finishing. Never call this yourself.

NameRequiredDescriptionDefault
tokenYes

Output Schema

NameRequiredDescription
accountYes
captionYes
creatorNo
creativeYes
expiresAtYes
submittedNo
scheduledAtNo

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds the non-obvious context that this is bound to an in-progress panel session rather than a general resource, but says nothing about what the token represents or what the returned draft contains.

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

Conciseness3/5

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

Very short and front-loaded, which is right for a tool agents should not call. But the sentence fragments awkwardly ('Internal to the Rawa TikTok panel: the post it is finishing'), spending words on identity rather than on what the tool returns.

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

Completeness2/5

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

An output schema exists so return values need not be explained, but the core gap is the undocumented token and the ambiguous object being fetched. For a tool that agents are told to never call, the description still needs to be complete enough for a panel-integrated caller to know what token to pass.

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

Parameters2/5

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

The single required 'token' parameter has 0% schema description coverage, and the description never mentions it. An agent has no idea whether the token is a session id, an upload id, or a publication id.

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

Purpose2/5

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

The phrase 'the post it is finishing' gestures at returning a TikTok draft but never states a verb or resource plainly. It does differentiate itself from siblings like prepare_tiktok_post by declaring itself panel-internal, but an agent cannot tell what it actually returns.

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

Usage Guidelines4/5

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

'Never call this yourself' is an unambiguous exclusion that no sibling offers, which is exactly the routing signal an agent needs. It stops short of naming what to call instead (submit_tiktok_post or prepare_tiktok_post would be the natural alternatives), so it is not a 5.

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

get_uploadGet uploadA
Read-onlyIdempotent
Inspect

What the user has uploaded through a request_image_upload link: the link's state (open, full or expired), how many images are still processing, and the finished creatives with their ids and pictures. An image the library already held is listed as that creative, with alreadyInLibrary, rather than as a copy. Pass a creative's id as creativeId to resize_creative, edit_creative, remove_background or any other tool.

NameRequiredDescriptionDefault
brandIdNoOptional: the brand it belongs to, by id or name. Read from the id when omitted.
uploadIdYesThe uploadId request_image_upload returned.

Output Schema

NameRequiredDescription
idYes
mediaYes
statusYes
pendingYes
creativesYes
expiresAtYes
maxImagesYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavioral context: the three possible link states, the processing-count semantics, and the alreadyInLibrary dedupe rule (an existing library image is reported as that creative, not a copy). 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.

Conciseness4/5

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

Three sentences, front-loaded with what the tool returns, then the dedupe quirk, then the downstream handoff. Dense but every sentence carries information; nothing is padded.

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

Completeness4/5

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

An output schema exists so return shape needs no prose, yet the description usefully flags the non-obvious alreadyInLibrary case and the link-state enum values an agent must branch on. Combined with read-only annotations and fully documented params, it is functionally complete.

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

Parameters3/5

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

Schema coverage is 100%, so both params (brandId, uploadId) are already documented, and the description largely restates uploadId's origin. The creativeId mentioned is not a parameter of this tool, so it adds no per-parameter meaning here – baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource – retrieving the upload behind a request_image_upload link – and enumerates exactly what comes back (link state, processing count, finished creatives with ids). It is clearly distinguishable from get_creative/list_creatives because it describes upload-session state rather than the creative library itself.

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

Usage Guidelines4/5

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

Implies the use case (after request_image_upload, to check open/full/expired state and processing progress) and gives explicit downstream routing: take a creative id into resize_creative, edit_creative, remove_background. It lacks an explicit 'do not use X instead' exclusion against get_creative or list_creatives.

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

get_workspaceGet workspaceA
Read-onlyIdempotent
Inspect

Start here. Who the user is, the Rawa organization this connection is for and its brands with their ids, the credits left, whether this connection may generate (and who may, and what is left of today's credit allowance) and whether it may publish posts. When the organization has a single brand, every tool works on it without a brandId.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
userYes
brandsYes
creditsYes
generationYes
publishingYes
organizationYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnly, idempotent, and non-destructive annotations, the description discloses the returned workspace data, permission checks for generation and publishing, remaining credits, and the single-brand behavior that affects all tools. This adds substantial behavioral context needed to interpret the connection's capabilities.

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

Conciseness4/5

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

The description is front-loaded with "Start here" and has no wasted sentences. The second sentence is dense and contains nested parentheticals, which slightly reduces readability, but every clause carries useful information.

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

Completeness5/5

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

Given that an output schema exists, the description does not need to explain return values, yet it still summarizes the key data and permission context. Annotations cover the safety profile, and the description completes the picture with workspace setup and single-brand behavior.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The description adds useful cross-tool context about brandId omission for single-brand organizations, though that note applies to sibling tools rather than this tool's own parameters.

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

Purpose5/5

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

The description states a specific bootstrap purpose and enumerates exactly what the tool returns: user identity, organization, brands with ids, credits, generation permission, and publish permission. It clearly distinguishes itself from sibling tools by positioning itself as the starting point for workspace context.

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

Usage Guidelines4/5

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

The phrase "Start here" gives explicit usage guidance for an initial call, and the note about single-brand organizations tells the agent when brandId can be omitted elsewhere. However, it does not explicitly name alternatives or when-not to use this tool versus siblings like get_brand or list_brands.

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

list_audiencesList audiencesB
Read-onlyIdempotent
Inspect

The brand's audiences: target profiles with an optional age range, gender and language that override the brand's markets, voice and photography. An empty markets, brandVoice or photographyGuidelines inherits the brand's; an empty ageRange, gender or language means any. Returns truncated when there are more than limit.

NameRequiredDescriptionDefault
limitNoHow many to return. Defaults to 25.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.

Output Schema

NameRequiredDescription
audiencesYes
truncatedYes

TDQS

B3.1/5.0
Behavior4/5

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

Beyond the read-only/idempotent annotations, the description discloses meaningful data semantics: empty markets, brandVoice, or photographyGuidelines inherit the brand's values, empty ageRange/gender/language means any, and results truncate beyond limit. This adds real interpretive context for the returned audiences.

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

Conciseness4/5

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

The description is compact and front-loads the domain concept of audiences. It is dense but every clause carries inheritance or truncation information, with no filler.

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

Completeness3/5

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

An output schema exists, so return structure need not be explained. However, for a listing tool the description lacks explicit operation framing and when-to-use context, leaving some ambiguity despite strong domain semantics.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented. The description adds a bit of meaning by explaining truncation relative to limit, but gives no further guidance on brandId semantics beyond what the schema already states.

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

Purpose3/5

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

The description names the resource ("The brand's audiences") and implies retrieval through "Returns truncated", but never states the verb or operation explicitly. An agent can infer listing, yet it is not as clear as siblings like list_brands that encode the action in the name.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as get_competitor_audience or list_brands. It also does not mention prerequisites, such as when brandId can be omitted, despite that being documented only in the schema.

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

list_brandsList brandsA
Read-onlyIdempotent
Inspect

The brands of the organization this connection is for that the user can open, with their ids. Tools take a brandId from here; it can be left out when there is only one brand.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
brandsYes
organizationYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds real context beyond that: results are scoped to the connection's organization and filtered to brands the user can actually open, plus the one-brand omission rule. Return contents are left to the output schema, which is fine.

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

Conciseness5/5

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

Two short sentences, no filler: the scoping and id payload come first, then the downstream usage note. Every clause carries information an agent needs.

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

Completeness5/5

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

With no parameters and an output schema handling the return shape, the description only needed to convey scope, permission filtering, and how the ids are consumed. It does all three, plus the single-brand edge case.

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

Parameters4/5

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

Zero parameters, so there is nothing to document in the schema; baseline is 4. Usefully, the description still explains how the ids it returns feed the brandId parameter on sibling tools and when that parameter may be omitted.

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

Purpose4/5

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

The description names a specific resource (the brands of the organization this connection is for, that the user can open) and states the payload (their ids). It signals a discovery/list role clearly, though it never explicitly contrasts with get_brand or list_entities, so an agent has to infer that differentiation from the names alone.

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

Usage Guidelines4/5

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

"Tools take a brandId from here; it can be left out when there is only one brand" is genuinely actionable guidance about downstream use and about the degenerate single-brand case. It stops short of stating when not to call it or naming get_brand as the alternative for full brand detail.

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

list_calendar_eventsList calendar eventsA
Read-onlyIdempotent
Inspect

The brand's marketing calendar: events its team added plus the holidays, seasons and cultural moments Rawa curates for its markets and industries, oldest first. Without dates, today through 30 days out. Returns truncated when more events fall in the window than limit; narrow the dates to see the rest.

NameRequiredDescriptionDefault
limitNoHow many to return. Defaults to 50.
toDateNoThe last day, inclusive. Defaults to 30 days after fromDate. ISO date, e.g. 2026-09-21.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
fromDateNoThe first day, inclusive. Defaults to today, or to 30 days before toDate. ISO date, e.g. 2026-09-21.

Output Schema

NameRequiredDescription
eventsYes
toDateYes
fromDateYes
truncatedYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new behavior: results are sorted oldest first, the implicit default window is today through 30 days out, and over-window results are truncated rather than paged — the last point is the kind of silent failure mode an agent needs warned about.

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

Conciseness5/5

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

Three sentences, no filler, and the identity of the resource is front-loaded before the defaulting and truncation rules. Every clause carries information the agent cannot get from structured fields.

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

Completeness4/5

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

With an output schema, rich annotations and full parameter coverage, the description fills the remaining gaps: ordering, default window, and truncation behavior. The one unresolved ambiguity is whether scheduled publications appear here or only in list_publications, which an agent deciding between the two would still have to guess.

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

Parameters3/5

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

Schema coverage is 100%, so all four parameters including the fromDate/toDate defaults are already documented. The description restates the default window and gestures at date narrowing but adds no format, boundary or interaction detail beyond the schema; baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource and enumerates exactly what the resource contains: the brand team's own events plus Rawa-curated holidays, seasons and cultural moments for its markets and industries. That content scope distinguishes it from the create/update/delete calendar siblings and from list_publications, which an agent could otherwise confuse it with.

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

Usage Guidelines3/5

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

Usage is only implied: the description says what happens when no dates are given and tells the agent to 'narrow the dates' when results are truncated, which is a useful remediation. But it never says when to choose this over list_publications or list_signals, nor any prerequisite for brandId beyond what the schema already states.

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 adsA
Read-onlyIdempotent
Inspect

Ads the brand's competitors are running on every ad channel the brand watches them on (Meta, TikTok, Snapchat, Google, LinkedIn), newest first: channel, copy, call to action, format, platforms, countries (ISO codes), days active, media URLs, the landing page, and the audience the library discloses (targeting, reach or impressions by country, age and gender, payer). Up to limit per page (30 unless given); pass nextCursor for the next.

NameRequiredDescriptionDefault
limitNoHow many to return. Defaults to 30.
cursorNonextCursor from the previous page.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
channelNoOnly competitors watched on this ad channel. Omit for every channel the brand watches them on.
regionsNoOnly ads reaching one of these countries (ISO 3166-1 alpha-2 codes).
platformNoOnly Meta ads shown on this Meta platform; ads on other channels have no such platform.
mediaTypeNo
activeOnlyNoOnly ads still running.
competitorIdNoA competitor id from list_competitors. Omit for every competitor the brand watches.

Output Schema

NameRequiredDescription
adsYes
nextCursorNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), so the description earns credit for the extra traits it does disclose: results are ordered newest first, page size defaults to 30 unless given, and the next page comes from nextCursor. It adds real behavioral context beyond the annotation block, though it says nothing about empty results or what happens when the brand has no watched competitors.

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

Conciseness3/5

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

It is one front-loaded sentence but very densely packed, spending most of its length enumerating returned fields that the output schema already declares. The pagination and ordering facts are valuable; the field list is largely redundant and pushes the sentence toward bloat.

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

Completeness3/5

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

With an output schema present, the field enumeration is not needed, and the description leaves out the relational context most relevant to a 9-parameter tool with many competitor siblings: when to reach for this versus get_competitor_audience or get_competitor_analyses. It is adequate to call the tool correctly but not complete for selection.

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

Parameters3/5

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

Schema coverage is 89%, so the schema already explains each parameter thoroughly, including the brandId/competitorId omission rules and the Meta-only platform constraint. The description restates the limit default and cursor continuation without adding syntax or semantics the schema lacks, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Ads the brand's competitors are running') plus the channel scope and ordering, so the agent knows exactly what it retrieves. It never distinguishes itself from near-siblings like get_competitor_analyses, get_competitor_audience, or list_competitors, which is the one gap keeping this at 4.

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

Usage Guidelines3/5

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

Usage is only implied by the scope language ('every ad channel the brand watches them on', 'Omit for every competitor the brand watches'). There is no explicit 'use this when…' or 'use get_competitor_audience instead for…' guidance, which matters given several competitor-related siblings.

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

list_competitorsList competitorsA
Read-onlyIdempotent
Inspect

The competitors the brand tracks in Rawa, each with the ad channel it is watched on (meta, tiktok, snapchat, google, linkedin); a company watched on two channels is listed once per channel. Returns truncated when there are more than limit.

NameRequiredDescriptionDefault
limitNoHow many to return. Defaults to 50.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
channelNoOnly competitors watched on this ad channel. Omit for every channel the brand watches them on.

Output Schema

NameRequiredDescription
truncatedYes
competitorsYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real context beyond that: the one-row-per-channel duplication rule and the fact that results are truncated past limit — both non-obvious behaviors an agent would otherwise misread.

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

Conciseness4/5

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

Front-loaded with the resource, then the enumeration and the dedup caveat, ending with truncation. Slightly run-on and the fragment 'Returns truncated when there are more than limit' is awkward, but every clause carries information.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the description covers the two things that would trip an agent: per-channel duplication and truncation at limit. Minor gap: it does not say how to retrieve the remainder once truncated (there is no offset parameter).

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

Parameters4/5

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 earns above baseline by explaining why a company can appear multiple times (once per channel), which gives the channel filter and the row semantics meaning the schema text alone does not convey.

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

Purpose4/5

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

States a specific verb and resource ('the competitors the brand tracks') plus the shape of each row (channel-tagged). It is distinguishable from list_competitor_ads and get_competitor_analyses by being the roster itself, though it never names a sibling to contrast with.

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

Usage Guidelines3/5

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

Usage is implied by the resource description rather than stated: an agent can infer this is the entry point for the tracked-competitor roster before drilling into ads or analyses. There is no explicit when-to-use/when-not or pointer to alternatives like list_competitor_ads.

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

list_creativesList creativesA
Read-onlyIdempotent
Inspect

The brand's generated and uploaded images, videos and SVGs, newest first, with their names and media URLs. Pages with nextCursor. An image the user pasted or attached in the chat is not here until they upload it through request_image_upload.

NameRequiredDescriptionDefault
limitNoHow many to return. Defaults to 20.
cursorNonextCursor from the previous page.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
assetTypesNo
favoritesOnlyNo
includeImagesNoAlso show the pictures themselves, for the first 6 of the page. Off by default: ask for it when the user wants to look at the creatives rather than read about them.

Output Schema

NameRequiredDescription
mediaNo
creativesYes
nextCursorNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds what they cannot: result ordering (newest first), the shape of each item (name plus media URL), cursor-based paging, and the pre-upload visibility caveat. Minor gap: it never says the listing is brand-scoped/requires a brand context beyond the brandId param.

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

Conciseness5/5

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

Two sentences, front-loaded with what the tool returns and followed by the one behavioral caveat an agent would otherwise get wrong. No restatement of the title and no filler.

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

Completeness4/5

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

With six optional parameters, an output schema, and rich annotations, the description covers the essentials: scope, ordering, paging, and the notable exclusion. The remaining shortfall is guidance on the two filter parameters (assetTypes, favoritesOnly) that an agent would need to use the tool fully.

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

Parameters3/5

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

Schema coverage is 67%, above the point where the schema alone suffices but below full coverage. The description's mention of images/videos/SVGs loosely maps to assetTypes, but favoritesOnly and assetTypes have no description in the schema and get no explanation here, so the description doesn't compensate for the documented gaps.

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

Purpose4/5

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

The verb ('list') and resource ('the brand's generated and uploaded images, videos and SVGs') are stated concretely, along with ordering ('newest first') and the fields returned ('names and media URLs'). What's missing is differentiation from near-siblings in the toolset such as search_library, show_creatives and get_creative, so an agent still has to guess which listing tool to pick.

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

Usage Guidelines4/5

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

The second sentence gives an explicit exclusion plus an alternative path: a pasted or attached image won't appear here until it goes through request_image_upload. That is real when-not guidance routing to a named sibling, but it only covers that one edge case; there is no guidance on when to prefer this over search_library or get_creative.

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

list_design_systemsList design systemsA
Read-onlyIdempotent
Inspect

The brand's design systems: each is a full look (logos, colours, fonts, design rules). Pass a design system's id as designSystemId to generate_design, generate_image or adapt_design; without one the brand's default design system is used. Empty when the brand has no design systems to choose from.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.

Output Schema

NameRequiredDescription
designSystemsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety needs no restatement. The description adds genuine context beyond them: the default-fallback behavior and the empty-result case when a brand has no design systems.

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

Conciseness5/5

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

Three sentences, each earning its place: definition, forward usage with default, and empty case. The forward usage — the most decision-relevant fact — is placed early.

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

Completeness5/5

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

An output schema exists so return values need no explanation, leaving the description responsible only for definition, downstream usage and the empty edge case — all present. Nothing an agent needs in order to call this correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the brandId description already explains sourcing it from get_workspace or list_brands and omitting it for single-brand orgs. The tool description says nothing about brandId and only implies the id's downstream use, so the schema carries the load — baseline 3.

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

Purpose5/5

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

States a specific resource (the brand's design systems) and defines what one is ('a full look — logos, colours, fonts, design rules'), which no sibling tool does. The agent can distinguish it from list_brands, get_brand and list_entities immediately.

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

Usage Guidelines4/5

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

Explicitly routes the result forward: pass an id as designSystemId to generate_design, generate_image or adapt_design, and states that omitting one yields the brand default. It stops just short of saying when not to call it (e.g. that it's unnecessary for a single-brand workflow already covered by get_brand).

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

list_entitiesList products, places and charactersA
Read-onlyIdempotent
Inspect

The brand's products, places, characters (the people or mascots it features) or design elements, with an image URL each. Pass query to find them by name. Pages with nextCursor.

NameRequiredDescriptionDefault
typeYesambassador is a character: a person or mascot the brand features.
limitNoHow many to return. Defaults to 50.
queryNoOnly those whose name matches, e.g. 'vanilla latte'.
cursorNonextCursor from the previous page.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.

Output Schema

NameRequiredDescription
entitiesYes
nextCursorNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description still adds real context beyond them: results are paginated via nextCursor and each entity includes an image URL. It stops short of describing ordering or what missing entities mean.

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

Conciseness4/5

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

Two short sentences with no filler, and the resource enumeration leads. The first sentence is a fragment, which slightly weakens the front-loading of what the tool actually does.

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

Completeness4/5

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

With an output schema, rich annotations and full schema coverage, the description only needs to frame scope and pagination, which it does. The remaining gap is disambiguation from sibling list/search tools in a crowded namespace.

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

Parameters3/5

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

Schema coverage is 100%, so parameter documentation is already handled (including the ambassador/character clarification). The description's only parameter remark, 'Pass query to find them by name', echoes the schema's own query description without adding syntax or matching behavior.

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

Purpose4/5

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

Names the resource set precisely (products, places, characters/mascots, design elements) and states each item carries an image URL. However it is a noun-phrase fragment with no verb, and it does not differentiate itself from close siblings such as search_library, list_creatives or list_design_systems.

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

Usage Guidelines3/5

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

'Pass query to find them by name' gives one usage hint, but there is no guidance on when to prefer this over search_library or list_design_systems, and no when-not conditions. Usage is implied rather than stated.

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

list_integrationsList connected accountsA
Read-onlyIdempotent
Inspect

The marketing accounts connected to the brand (Instagram, Facebook, TikTok, LinkedIn, Meta Ads, Shopify): account name, whether the connection is active or needs reconnecting, when it last synced, and canPublish when Rawa can post to it, with publishWith naming the tool: submit_publication, or prepare_tiktok_post for TikTok, where the user makes TikTok's settings in a panel. Check this when performance data or published posts come back empty.

NameRequiredDescriptionDefault
limitNoHow many to return. Defaults to 50.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.

Output Schema

NameRequiredDescription
truncatedYes
integrationsYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, closed-world behaviour, so the lower bar applies. The description adds genuinely useful context beyond that: connection status ('active or needs reconnecting'), last-sync timing, and the important downstream effect that canPublish/publishWith determines whether and how posting can happen. It could have stated explicitly that it returns at most `limit` accounts in a single call, which is why it isn't 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.

Conciseness3/5

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

The whole definition is one long sentence with layered colons and parentheticals, making it hard to scan. The most actionable instruction, checking this when data is empty, is buried at the end instead of being front-loaded. It is dense rather than bloated, but the structure needs work.

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

Completeness4/5

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

With an output schema available, the description does not need to explain return shapes, and it still helpfully explains the non-obvious canPublish and publishWith fields. The diagnostic use case is covered. Minor remaining gap: it does not state pagination or single-page behaviour, though the limit parameter implies it.

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

Parameters3/5

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

Schema coverage is 100%, so both `limit` and `brandId` are already fully documented in the schema, including defaults and the single-brand omission rule. The description mentions the brand implicitly but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate.

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

Purpose4/5

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

The definition gives a specific verb and resource ('marketing accounts connected to the brand') and enumerates the channels and returned fields, so an agent knows exactly what it gets back. It does not explicitly contrast itself with nearby list tools such as list_brands or get_brand, so it falls short of the 5 bar.

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

Usage Guidelines4/5

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

It gives a concrete triggering condition: 'Check this when performance data or published posts come back empty.' That is real when-to-use guidance, especially useful for diagnosing broken connections. It omits when-not-to-use or a direct pointer to an alternative list tool, so a 4 rather than a 5.

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

list_publicationsList publicationsA
Read-onlyIdempotent
Inspect

Rawa's publishing queue: posts scheduled or sent from Rawa, by the user or through submit_publication: scheduled, publishing, waiting on the user, published and failed. Each one gives the channel and account, the caption, the format, when it is due or went out, the link to the live post once it is published, and why it failed if it did. Times are ISO timestamps. Pages are ordered by creation time, newest first; follow nextCursor with the same filters. For everything on the channels, whoever posted it, with its metrics, use list_recent_posts.

NameRequiredDescriptionDefault
limitNoHow many to return. Defaults to 20.
cursorNonextCursor from the previous page, with the same filters.
statusNoOnly posts in this state. Omit for all of them.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
lookbackDaysNoHow many days back to look, by when the post was created in Rawa. Defaults to 30. With status scheduled the whole queue is listed, whatever the window, so a post booked long ago is still shown. Follow nextCursor until absent to read the complete queue.

Output Schema

NameRequiredDescription
nextCursorNo
lookbackDaysYes
publicationsYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds non-obvious behavior: results are ordered by creation time newest-first, timestamps are ISO, and status=scheduled ignores the lookback window entirely. That last point is a genuinely surprising query behavior an agent could not infer from annotations.

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

Conciseness5/5

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

Front-loaded with identity and scope, then return fields, then ordering/pagination, then the alternative — every clause earns its place and nothing is repeated. The single dense paragraph reads cleanly despite carrying a lot of information.

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

Completeness5/5

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

With an output schema present, the description needn't document return values, yet it still summarizes what each entry carries (channel, account, caption, format, timing, live link, failure reason). Combined with ordering, pagination, and the alternative route, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema, including the limit default, the cursor contract, and the lookbackDays/status interaction. The description restates pagination and the queue caveat rather than adding syntax or format detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

Names a specific resource (Rawa's publishing queue) with precise scope: posts scheduled or sent, by the user or via submit_publication, and enumerates the lifecycle states. It also names the sibling tool it is not (list_recent_posts), letting an agent distinguish the two without opening either schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent: use this for the Rawa publishing queue, use list_recent_posts for everything on the channels with metrics. It also gives the operational rule for pagination ('follow nextCursor with the same filters') and the status=scheduled whole-queue caveat, so nothing about when/how to call it is left implicit.

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

list_recent_postsList recent postsA
Read-onlyIdempotent
Inspect

Posts synced from the brand's connected channels, whoever published them, with their metrics: newest first, each with its caption, link, and its latest daily reach, views, likes, comments, shares, saves, follows and engagement rate as of metrics.day (a metric the channel does not report is left out), plus the sentiment and recurring themes of its comments where Rawa has analysed them. For what Rawa itself has scheduled or sent, use list_publications.

NameRequiredDescriptionDefault
limitNoHow many to return. Defaults to 20.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
platformNoOnly this channel. Omit for all of them.
lookbackDaysNoHow many days back to look. Defaults to 30.

Output Schema

NameRequiredDescription
postsYes
truncatedYes
lookbackDaysYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds real behavioral detail beyond them: newest-first ordering, that an unreported metric is simply omitted, and that sentiment/themes only appear where Rawa has analysed comments. These conditional-presence rules are the kind of context an agent cannot get from 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.

Conciseness3/5

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

Purpose and the sibling alternative bracket the description well, and it is front-loaded. However, the long enumeration of return metrics (reach, views, likes, comments, shares, saves, follows, engagement rate) largely duplicates what the existing output schema already declares, weakening the 'every sentence earns its place' test.

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

Completeness5/5

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

With a rich output schema, full annotation coverage and 100% schema description coverage, the description only needs scope, ordering and sibling routing — all of which it supplies. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter (limit, brandId, platform, lookbackDays) is documented in the schema with defaults and enum values. The description adds only indirect hints — 'whoever published them' signals there is no author filter, and 'newest first' signals ordering is not parameterized — so the schema does the heavy lifting and baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource (posts synced from the brand's connected channels) with an explicit scope qualifier ('whoever published them') and ordering ('newest first'). It also names the sibling it is not (list_publications), so an agent can distinguish the two without opening either schema.

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

Usage Guidelines4/5

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

Gives an explicit routing rule: for content Rawa itself scheduled or sent, use list_publications instead. That resolves the main ambiguity with the closest sibling. It stops short of covering when-not to use it against the many other list_* tools, so it is clear context rather than full when/when-not guidance.

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

prepare_tiktok_postPrepare a TikTok postAInspect

Post one of the brand's finished videos to TikTok. TikTok requires the person posting to choose who can view the video, whether others may comment, Duet and Stitch, to declare promotional or branded content and to agree to TikTok's terms, so this opens Rawa's TikTok panel in the conversation where the user does all of that and submits. You cannot publish to TikTok yourself: there is no tool for it, submit_publication refuses TikTok, and you must not ask the user for those settings in chat or describe them as chosen. Pass the video's creativeId (TikTok takes one video, never an image), connectionId from list_integrations or nothing when the brand has a single TikTok account, a caption of up to 2200 characters that the user can still edit in the panel (write_caption can draft one in the brand's voice; one is needed to post), and scheduledAt to schedule it: an ISO 8601 timestamp with its offset, in the future. Without scheduledAt it goes out as soon as the user submits. Confirm the video, caption and time with the user before calling. When the panel says the post was submitted you are told its publicationId: use list_publications for its status. Rawa's TikTok app sends the video to the creator's TikTok inbox, where they finish posting it in the TikTok app (status awaiting_user_action until then). Where no panel appears, the post cannot be finished in this chat: give the user openInRawaUrl, which opens the video in Rawa, and tell them to publish it from there with Publish. Free. Needs an admin to allow publishing over MCP (see get_workspace). The prepared post lasts an hour; call again for a new one.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
captionNoThe caption to start from; the user can edit it in the panel.
creativeIdYesA finished video of the brand, from list_creatives, search_library or get_job.
scheduledAtNoWhen to publish, as an ISO 8601 timestamp with its offset, in the future. Omit to post once the user submits.
connectionIdNoThe TikTok account, from list_integrations. Omit it when the brand has a single TikTok account.

Output Schema

NameRequiredDescription
nextYes
accountYes
captionYes
expiresAtYes
creativeIdYes
scheduledAtNo
openInRawaUrlYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only say it is a non-idempotent, open-world, non-destructive write; the description adds what actually happens: no publish occurs, a panel opens, the user submits, the app delivers to the creator's TikTok inbox with status awaiting_user_action, the prepared post expires after an hour, and the call is free but gated on an admin setting. It also warns against a specific failure mode ('must not ask the user for those settings in chat').

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

Conciseness4/5

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

The purpose is front-loaded and nearly every clause carries load-bearing information — permissions, fallback path, expiry, caption limit. It is a dense single block of long compound sentences, so it reads as a wall of text, but there is little outright waste to cut.

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

Completeness5/5

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

For a five-parameter, non-idempotent, open-world write with a human-in-the-loop handoff, the description covers the full lifecycle: prerequisite permissions, what the agent must not do, what happens after submission, how to check status, and what to do when the panel never appears. An output schema exists, yet the description still names publicationId, which is a bonus rather than a gap.

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

Parameters4/5

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 semantics beyond the schema: creativeId must be a video and never an image, omitting connectionId is only valid for single-account brands, scheduledAt must carry an offset and be in the future, and omitting it means immediate posting on submit. Only brandId goes unmentioned, though the schema covers it.

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

Purpose4/5

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

The opening names a specific verb and resource ('Post one of the brand's finished videos to TikTok') and the body clarifies the real action: it opens Rawa's TikTok panel where the user submits. It differentiates from submit_publication explicitly. However, the claim 'there is no tool for it' sits awkwardly against the sibling submit_tiktok_post, which an agent will see in the tool list, creating a moment of doubt about which path publishes.

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

Usage Guidelines5/5

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

It gives explicit prerequisites (admin must allow publishing over MCP, see get_workspace), a pre-call ritual ('Confirm the video, caption and time with the user before calling'), sibling routing (list_integrations, write_caption, list_publications, get_workspace), and a when-this-fails branch pointing at openInRawaUrl. Nothing about selecting or invoking this tool 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.

remove_backgroundRemove a backgroundAInspect

Cut the background out of a finished image, leaving a transparent PNG of the subject. The source is a creative of the brand (creativeId) or an image on the web (imageUrl: a direct, public URL to a JPEG, PNG or WebP file). An image the user pasted or attached in the chat has no such URL and you cannot read it yourself: call request_image_upload right away (do not ask them to re-attach it), and once the image has landed use its creativeId here. An image you hold as a file on your own filesystem (a coding agent in a project) goes through upload_image_file instead. A linked image is added to the brand's library first and its creativeId is returned as sourceCreativeId; an image the library already holds is not added again, and sourceCreativeId is that creative, with alreadyInLibrary: true. Reuse sourceCreativeId for any further work on the same image instead of passing imageUrl again. Cost: 30 credits. Call with dryRun: true first and tell the user the cost. Once they agree, pass the quoted credits as expectedCredits; a call that would cost a different amount is refused. Give each new generation a new requestId, and repeat it unchanged only on a retry: a retry within 2 minutes returns the first result and is not charged again. Without a requestId, the same arguments within 2 minutes count as a retry. Needs generation allowed over MCP (see get_workspace); a dry run still quotes when it is not, and says why the call would be refused in wouldRefuse. Returns a jobId, creditsCharged and creditsRemaining; ready in 1 to 5 minutes. If a job panel shows, it tracks the work: do not poll, end your turn with one line saying it is under way, and later use show_creatives with the creativeIds you are told. Otherwise call wait_for_jobs with the jobIds until allFinal is true.

NameRequiredDescriptionDefault
dryRunNotrue: return the exact cost (credits, breakdown, balanceAfter) without charging or starting anything, and wouldRefuse when the organization's spending controls would refuse the real call.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
imageUrlNoA direct, publicly reachable https URL of the image to work on, when it is not in the library yet.
requestIdNoYour own unique id for this request. Use a new one for every new request, even with the same arguments. Repeat it unchanged only to retry this exact call within 2 minutes; the retry returns the first result.
creativeIdNoA creative id from list_creatives, search_library, get_job or get_upload.
expectedCreditsNoThe credits the dryRun quoted and the user agreed to. The call is refused if it would cost a different amount.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false, but the description adds substantial operational context: cost of 30 credits, dryRun quoting, expectedCredits refusal guard, requestId retry window, generation-allowed prerequisite, returned jobId/credits, 1–5 minute readiness, and job-panel versus wait_for_jobs behavior. It does not contradict 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.

Conciseness4/5

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

The description is long but front-loaded and dense with operational rules rather than filler. Every major sentence carries a distinct instruction, though the volume is high for a single description and could be tightened slightly without losing meaning.

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

Completeness5/5

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

For a complex mutation with cost, credit guards, source-routing alternatives, and asynchronous job handling, the description is complete. Since an output schema exists, it appropriately does not spend space explaining every return field, but still mentions jobId, creditsCharged, creditsRemaining, and sourceCreativeId metadata needed to continue the workflow.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each parameter. The description still adds meaningful cross-parameter semantics beyond the schema: imageUrl must be a direct public JPEG/PNG/WebP URL, requestId must be new per generation and repeated only on retry, and expectedCredits must match the quoted dry-run amount to avoid refusal.

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

Purpose5/5

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

States a specific verb+resource: cut the background out of a finished image, leaving a transparent PNG. It explicitly distinguishes among source types (brand creative, public image URL, chat attachment, local filesystem) and names the sibling tools to use for each, so an agent can route correctly without opening another schema.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance and alternatives: use request_image_upload for pasted/attached chat images, upload_image_file for local filesystem images, and reuse sourceCreativeId instead of imageUrl for already-linked images. It also prescribes the dry-run-then-confirm workflow and the retry/idempotency behavior, leaving little to inference.

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

remove_competitorRemove competitorA
DestructiveIdempotent
Inspect

Stop tracking a competitor. Its ads leave the brand's competitor feed; the credits spent adding it are not refunded. Free.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
competitorIdYesA competitor id from list_competitors.

Output Schema

NameRequiredDescription
nameNo
removedYes
competitorIdYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds genuinely useful context beyond that: the concrete effect (ads leave the brand's competitor feed), the irreversibility of spend (credits not refunded), and that removal itself costs nothing.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action, then consequences, then cost. No filler and no repetition of schema or annotation content.

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

Completeness4/5

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

An output schema exists so return values need no explanation, and annotations cover destructiveness and idempotency. The description fills the remaining gap – what is actually lost by removing – though it doesn't say whether re-adding later re-incurs cost.

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

Parameters3/5

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

Schema description coverage is 100%, with both brandId and competitorId already documented including sourcing (get_workspace, list_brands, list_competitors) and the single-brand omission rule. The description adds nothing about parameters, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource combination ('Stop tracking a competitor') that clearly separates it from its sibling add_competitor. It doesn't name the sibling, but the pairing is unambiguous in context.

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

Usage Guidelines3/5

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

Usage is implied by the semantics of 'stop tracking', and 'Free' hints there's no credit cost to removing, but the description never states when to prefer this over alternatives or what prerequisites exist (e.g., needing a competitorId from list_competitors).

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

rename_creativeRename creativeA
Idempotent
Inspect

Rename a creative in the Library, so it is findable by name instead of by its generated title. Free.

NameRequiredDescriptionDefault
nameYesThe new display name. Cannot be empty.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
creativeIdYesA creative id from list_creatives, search_library, get_job or get_upload.

Output Schema

NameRequiredDescription
nameYes
creativeIdYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare non-destructive, idempotent, closed-world mutation, so the safety profile is covered. The description adds one genuinely new trait — 'Free', i.e. no credit cost — but says nothing about whether the original generated title is retained or whether renames propagate to existing publications.

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

Conciseness5/5

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

Two sentences, front-loaded with the action and the rationale, with the cost note isolated as a one-word sentence. No filler or restatement of the schema.

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

Completeness4/5

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

An output schema exists and all parameters are documented, so return values and inputs need no prose. The only real gap is the missing routing versus edit_creative for a tool set with many overlapping creative-mutation siblings.

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

Parameters3/5

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

Schema description coverage is 100%, with each of the three parameters documented including sourcing hints ('from list_creatives, search_library, get_job or get_upload') and the single-brand omission rule for brandId. The description adds nothing beyond that, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Rename a creative in the Library') plus the outcome ('findable by name instead of by its generated title'), so the effect is unambiguous. It does not differentiate from the closest sibling, edit_creative, which an agent could reasonably confuse this with.

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

Usage Guidelines3/5

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

The stated motivation (findability by name vs. generated title) implies when to use it, but there is no explicit when-not or named alternative such as edit_creative or tag_creative. The agent must infer the boundary from sibling names alone.

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

request_image_uploadRequest image uploadAInspect

Call this immediately, without asking first, whenever the user has pasted or attached an image in this chat and wants Rawa to do something with it (resize it for a platform, edit it, remove its background, sharpen it, publish it, make an ad from it). You cannot read the attachment yourself and must not ask the user to re-attach it, send it another way or confirm that they want to upload: opening the panel is how the image reaches Rawa. An attached image is not in the brand's library, whatever its filename: do not search or list the library for it. Pick the brand from the conversation or the image (the user's only brand, or the one named); ask which brand only when it is genuinely unclear, and then open the panel in the same turn as you get the answer. Where the panel is shown, ask the user to drop the image(s) in it; you will be told each creativeId as it lands (an image the brand's library already holds lands as that creative), and the panel sends you a message with all of them once the upload is done. Where no panel appears, send the user the uploadUrl instead and call get_upload with the uploadId once they say they are done. The link takes up to maxImages images and expires after an hour. Free: nothing is charged for the link or the upload.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
purposeNoWhat the images are for, shown on the upload page, e.g. 'Resize for Google Ads and Snapchat'.
maxImagesNoHow many images the link accepts. Defaults to 4.

Output Schema

NameRequiredDescription
nextYes
purposeNo
uploadIdYes
expiresAtYes
maxImagesYes
uploadUrlYes

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial behavioral context beyond the annotations: the upload is free, the link expires after an hour, the panel reports each creativeId as images land, and an already-owned image lands as an existing creative. It also explains what the agent should do when no panel appears. None of this contradicts 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.

Conciseness4/5

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

The opening imperative is front-loaded and nearly every sentence carries operational value. The single dense paragraph is long, but the length is justified by the multi-step upload workflow and fallback behavior.

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

Completeness5/5

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

Given the complexity, annotations, and output schema, the description covers the important cases: attached-image detection, immediate invocation, brand choice, panel versus URL fallback, creativeId reporting, maxImages, expiry, and cost. No critical agent decision is left unaddressed.

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

Parameters4/5

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 still adds useful meaning for brandId by explaining how to infer the brand from the conversation or image and when asking is appropriate, and it reinforces maxImages via the link capacity and one-hour expiry.

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

Purpose5/5

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

States a specific action and resource: request image upload by opening a panel or sending an upload URL so an attached image reaches Rawa. It clearly distinguishes this from searching the brand library and from the agent trying to read the attachment itself.

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

Usage Guidelines5/5

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

Explicitly says to call immediately when the user has pasted/attached an image and wants Rawa to act on it, and says not to ask the user to re-attach or confirm. It also names the fallback path: send uploadUrl and call get_upload with the uploadId, plus clear brand-selection rules.

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

resize_creativeResize an image or a videoAInspect

Resize an image or a video for a platform, an aspect ratio or, for an image, an exact pixel size the Rawa way, not by a crop, a stretch or a letterbox of your own. An image is re-framed generatively: the scene extends into the new shape and the subject, the text and the brand stay intact, delivered at exactly its pixels. A plain clip (an upload, a generated clip or an edit) is cut to each shape, its footage cropped shot by shot on what matters in each; a portrait clip going to a landscape shape has its footage extended by AI into the new width instead, at the same price. A Motion ad is re-laid out on each shape by Rawa's designer, keeping its layers and animation, and takes only 1:1, 4:5, 9:16 or 16:9. Use this whenever the user wants an image or a video resized, adapted or fitted to Snapchat, Google Ads, Stories, a feed, a banner, any ratio or any size; do not resize the pixels yourself. Name platforms, shapes, sizes or a mix; every canvas comes back as its own finished creative in the brand's library, and a shape the video already has is skipped. For an image, a placement makes each canvas that platform takes at its exact size (snapchat_ad is 1080x1920); an aspect ratio makes that shape at 2048 px on the long edge; a size makes exactly those pixels. Canvases are merged only when their pixels are the same, so naming 9:16 and snapchat_ad makes two canvases, 1152x2048 and 1080x1920: when the user names a platform, pass the placement alone. A video takes shapes and placements, not sizes or a format. The source is a creative of the brand (creativeId) or an image on the web (imageUrl: a direct, public URL to a JPEG, PNG or WebP file). An image the user pasted or attached in the chat has no such URL and you cannot read it yourself: call request_image_upload right away (do not ask them to re-attach it), and once the image has landed use its creativeId here. An image you hold as a file on your own filesystem (a coding agent in a project) goes through upload_image_file instead. A linked image is added to the brand's library first and its creativeId is returned as sourceCreativeId; an image the library already holds is not added again, and sourceCreativeId is that creative, with alreadyInLibrary: true. Reuse sourceCreativeId for any further work on the same image instead of passing imageUrl again. A video is resized only from the library, by its creativeId. Cost: An image costs 30 credits per canvas up to 4.2 MP (every placement canvas, and every aspect ratio at its default size), 50 credits per canvas above that. A clip costs per shape by its length: 564 credits for 6 s, 1410 credits for 15 s, 2820 credits for 30 s, less below 1080p. A Motion ad costs a Motion redo per shape, 40 credits a second: 240 at 6 s, 600 at 15 s, 1200 at 30 s. At most 6 canvases per call; the dry run quotes the exact price. Call with dryRun: true first and tell the user the cost. Once they agree, pass the quoted credits as expectedCredits; a call that would cost a different amount is refused. Give each new generation a new requestId, and repeat it unchanged only on a retry: a retry within 2 minutes returns the first result and is not charged again. Without a requestId, the same arguments within 2 minutes count as a retry. Needs generation allowed over MCP (see get_workspace); a dry run still quotes when it is not, and says why the call would be refused in wouldRefuse. Returns a jobId (for a Motion ad, jobs: one jobId per shape), creditsCharged and creditsRemaining; ready in 1 to 5 minutes, a clip longer. If a job panel shows, it tracks the work: do not poll, end your turn with one line saying it is under way, and later use show_creatives with the creativeIds you are told. Otherwise call wait_for_jobs with the jobIds until allFinal is true.

NameRequiredDescriptionDefault
sizesNoExact pixel sizes to deliver, when the user names pixels (1080x1920). Each side 100 to 3840 px, at most 3:1 and 8.3 MP.
dryRunNotrue: return the exact cost (credits, breakdown, balanceAfter) without charging or starting anything, and wouldRefuse when the organization's spending controls would refuse the real call.
formatNoThe file type of every canvas: png (the default) or jpeg, a much smaller file with no transparency. Use jpeg when the user asks for it or the platform caps the file size.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
imageUrlNoA direct, publicly reachable https URL of the image to work on, when it is not in the library yet.
requestIdNoYour own unique id for this request. Use a new one for every new request, even with the same arguments. Repeat it unchanged only to retry this exact call within 2 minutes; the retry returns the first result.
creativeIdNoA creative id from list_creatives, search_library, get_job or get_upload.
placementsNoPlatforms to produce every canvas of, each at its exact size; "Google Ads" is google_display, "Snapchat" is snapchat_ad (or snapchat for a Story). instagram_feed: Instagram / Facebook feed at 1080x1080, 1080x1350; instagram_story: Instagram / Facebook Stories at 1080x1920; instagram_story_ad: Instagram / Facebook Stories ad at 1080x1920; instagram_reels: Instagram Reels at 1080x1920; instagram_reels_ad: Instagram Reels ad at 1080x1920; tiktok_organic: TikTok (organic) at 1080x1920; tiktok_ad: TikTok in-feed ad at 1080x1920; snapchat: Snapchat Story at 1080x1920; snapchat_ad: Snapchat Snap Ad at 1080x1920; linkedin_feed: LinkedIn feed / sponsored (static) at 1200x1200, 1200x1500, 1200x628; linkedin_video: LinkedIn feed (video) at 1080x1920; linkedin_video_ad: LinkedIn sponsored (video) at 1080x1920; google_display: Google Display (responsive) at 1200x1200, 1200x628; youtube_instream: YouTube in-stream at 1920x1080; youtube_shorts: YouTube Shorts at 1080x1920; youtube_shorts_ad: YouTube Shorts ad at 1080x1920.
aspectRatiosNoShapes to produce at 2048 px on the long edge, by name or ratio ("9:16"). Only when the user names a shape and no platform or size.
expectedCreditsNoThe credits the dryRun quoted and the user agreed to. The call is refused if it would cost a different amount.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare the safety profile, and the description adds substantial operational context: exact credit costs, dryRun quoting, expectedCredits refusal behavior, requestId retry semantics, jobId returns, 1–5 minute readiness, and generation-permission checks via get_workspace. There is no contradiction with readOnlyHint=false, openWorldHint=true, idempotentHint=false, or destructiveHint=false.

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

Conciseness3/5

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

The purpose is front-loaded, and most sentences carry useful information, but the description is extremely long and dense as a single block. It would be easier to scan with clearer separation between purpose, source rules, cost, and job handling.

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

Completeness5/5

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

For a complex, multi-modal generation tool with cost and retry semantics, the description covers everything an agent needs to call it correctly, including source selection, sizing rules, dry-run pricing, expectedCredits, and post-call job handling. The presence of an output schema does not leave any material gap.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each parameter and its enum values. The description adds valuable cross-parameter semantics beyond the schema: platform alone vs. aspect-ratio plus placement, video restrictions on sizes/format, and sourceCreativeId reuse for linked images. Some of this duplicates the schema, preventing a 5.

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

Purpose5/5

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

The description names a specific verb and resource (resize an image or video) and explicitly distinguishes Rawa's generative re-framing from cropping, stretching, or letterboxing. It also differentiates image, clip, and Motion ad behavior so an agent can tell this apart from siblings like edit_creative or generate_image.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance ('Use this whenever the user wants an image or a video resized, adapted or fitted...') and a clear exclusion ('do not resize the pixels yourself'). It also routes edge cases to specific siblings: pasted images to request_image_upload, local files to upload_image_file, and videos only from the library via creativeId.

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

search_librarySearch libraryA
Read-onlyIdempotent
Inspect

Find creatives in the brand's library by what they are called and, where the workspace has semantic search, by what they show. Returns the same fields as list_creatives, and truncated when more match than limit. Use it to locate an existing creative before generating a new one, when the user asks for something they already have in Rawa. Not for an image the user pasted or attached in the chat: that is not in the library, so do not look for its filename here; call request_image_upload.

NameRequiredDescriptionDefault
limitNoHow many to return. Defaults to 20.
queryYesWhat to look for, e.g. 'ramadan lantern' or 'summer sale'.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
assetTypesNo

Output Schema

NameRequiredDescription
creativesYes
truncatedYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds real context: semantic search only exists in some workspaces, results mirror list_creatives' fields, and output is truncated when matches exceed limit. The one gap is that truncation is disclosed without saying how to retrieve the remainder beyond raising limit.

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

Conciseness5/5

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

Three sentences, no filler: capability first, then the positive use case, then the exclusion and its alternative. Each sentence changes agent behavior, and the routing-critical constraint is stated plainly rather than buried.

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

Completeness4/5

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

With an output schema present, return values needn't be detailed, and annotations cover safety; the description fills the remaining needs (capability variance, truncation, sibling routing). Only the undescribed assetTypes filter leaves a small hole for a four-parameter tool.

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

Parameters4/5

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

Schema coverage is 75%, so the schema already documents limit, query, and brandId. The description still adds meaning the schema lacks: that query matches both name/title and visual content, the latter only where semantic search is enabled — a distinction that changes how an agent should phrase queries. assetTypes remains undescribed in both places.

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

Purpose5/5

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

States a specific verb and resource (find creatives in the brand's library) and names both search modes: filename/title matching and, conditionally, semantic visual matching. It also distinguishes itself from list_creatives (same return shape) and request_image_upload, so an agent can route correctly 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.

Usage Guidelines5/5

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

Gives an explicit when-to-use (locate an existing creative before generating a new one, when the user asks for something they already own) and an explicit when-not (an image pasted/attached in chat is not in the library — call request_image_upload instead). This is the strongest possible routing guidance.

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

set_creative_favoriteFavorite creativeA
Idempotent
Inspect

Mark a creative as one of the user's favorites, or unmark it. Favorites are per person and show in the Library's Favorites view. Free.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
favoriteYestrue favorites, false unfavorites.
creativeIdYesA creative id from list_creatives, search_library, get_job or get_upload.

Output Schema

NameRequiredDescription
changedYes
favoriteYes
creativeIdYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare the write, idempotent, and non-destructive profile, so the bar is lower. The description adds genuine context beyond them: favorites are per-user scoped (not workspace-wide) and the operation consumes no credits, which affects whether an agent should worry about cost. What is missing is whether unfavoriting is reversible/persistent or any per-user auth implication.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action, then scope, then cost. Nothing is redundant and each sentence contributes distinct information.

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

Completeness4/5

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

With an output schema present, return values needn't be explained, and annotations plus 100% parameter coverage carry the rest. The only soft spot is the absence of guidance on the per-user/permission implications of favoriting on someone else's behalf, which is minor for a low-risk toggle.

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

Parameters3/5

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

Schema description coverage is 100%, so creativeId, brandId, and favorite are already fully documented with sourcing hints. The description's 'or unmark it' reinforces the boolean semantics but adds no sourcing or format detail beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Mark a creative as one of the user's favorites, or unmark it') and clarifies the set/unset duality that the name alone doesn't convey. It implicitly separates itself from sibling mutators like tag_creative or rename_creative by naming the Favorites concept, though it never explicitly contrasts with those siblings.

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

Usage Guidelines3/5

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

'Favorites are per person and show in the Library's Favorites view' implies when to use it (curating a personal shortlist visible in that view) and 'Free' signals no credit cost. There are no explicit when-not conditions or named alternatives such as tag_creative for organizational categorization, so usage is inferred rather than directed.

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

sharpen_creativeSharpen an imageAInspect

Improve a finished image's detail, sharpness and clarity. The result is a new version of it. The source is a creative of the brand (creativeId) or an image on the web (imageUrl: a direct, public URL to a JPEG, PNG or WebP file). An image the user pasted or attached in the chat has no such URL and you cannot read it yourself: call request_image_upload right away (do not ask them to re-attach it), and once the image has landed use its creativeId here. An image you hold as a file on your own filesystem (a coding agent in a project) goes through upload_image_file instead. A linked image is added to the brand's library first and its creativeId is returned as sourceCreativeId; an image the library already holds is not added again, and sourceCreativeId is that creative, with alreadyInLibrary: true. Reuse sourceCreativeId for any further work on the same image instead of passing imageUrl again. Cost: 30 credits. Call with dryRun: true first and tell the user the cost. Once they agree, pass the quoted credits as expectedCredits; a call that would cost a different amount is refused. Give each new generation a new requestId, and repeat it unchanged only on a retry: a retry within 2 minutes returns the first result and is not charged again. Without a requestId, the same arguments within 2 minutes count as a retry. Needs generation allowed over MCP (see get_workspace); a dry run still quotes when it is not, and says why the call would be refused in wouldRefuse. Returns a jobId, creditsCharged and creditsRemaining; ready in 1 to 5 minutes. If a job panel shows, it tracks the work: do not poll, end your turn with one line saying it is under way, and later use show_creatives with the creativeIds you are told. Otherwise call wait_for_jobs with the jobIds until allFinal is true.

NameRequiredDescriptionDefault
dryRunNotrue: return the exact cost (credits, breakdown, balanceAfter) without charging or starting anything, and wouldRefuse when the organization's spending controls would refuse the real call.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
imageUrlNoA direct, publicly reachable https URL of the image to work on, when it is not in the library yet.
requestIdNoYour own unique id for this request. Use a new one for every new request, even with the same arguments. Repeat it unchanged only to retry this exact call within 2 minutes; the retry returns the first result.
creativeIdNoA creative id from list_creatives, search_library, get_job or get_upload.
expectedCreditsNoThe credits the dryRun quoted and the user agreed to. The call is refused if it would cost a different amount.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond annotations: 30-credit cost, the dry-run/quote/confirm protocol, refusal on credit mismatch, requestId retry semantics with a 2-minute no-charge window, the generation-allowed-over-MCP prerequisite with wouldRefuse behavior, and 1-5 minute readiness. Annotations only say it is a non-read-only, non-idempotent, non-destructive operation; the description supplies the operational and financial consequences.

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

Conciseness4/5

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

Purpose is front-loaded and every sentence carries operative information, but the single dense paragraph bundles routing, cost, retry, gating and polling rules without line breaks, making it harder to scan than it needs to be.

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

Completeness5/5

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

For a paid, asynchronous, gated generation tool with an output schema, this covers everything an agent needs: input-source routing, cost confirmation, retry identity, refusal conditions and what to do while the job runs. The output schema already documents returns, and the description still names jobId, creditsCharged and creditsRemaining as a convenience.

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

Parameters4/5

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 semantics: expectedCredits must match the quoted amount or the call is refused, requestId must be new per request and repeated only on retry, and sourceCreativeId should be reused rather than re-passing imageUrl. That is meaningfully more than the field docs alone.

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

Purpose5/5

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

States a specific verb and resource ('Improve a finished image's detail, sharpness and clarity') and immediately distinguishes the outcome ('The result is a new version of it'). It is clearly separable from siblings like remove_background, resize_creative and generate_image 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.

Usage Guidelines5/5

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

Explicitly routes between the three input paths: creativeId for library creatives, imageUrl for public web files, request_image_upload for chat attachments (with 'do not ask them to re-attach it'), and upload_image_file for local files. It also prescribes the dryRun-then-expectedCredits flow and the wait_for_jobs vs job-panel branch, leaving nothing to inference.

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

show_creativesShow creativesA
Read-onlyIdempotent
Inspect

Show creatives to the user in the chat: Rawa's viewer renders each one at its own shape, with download, open and full-screen buttons. Call this whenever the user wants to see creatives, including a finished job's results (its creative ids) or ones found with list_creatives or search_library. The viewer is what the user sees, so after calling it say one short line; never paste the creatives' URLs or markdown images.

NameRequiredDescriptionDefault
creativeIdsYesThe creatives to show, in order, 1-24.

Output Schema

NameRequiredDescription
mediaYes
creativesYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely new behavioral context: the viewer is what the user actually sees, so the agent must follow up with one short line and must never paste URLs or markdown images. That post-invocation contract is not inferable from any structured field.

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

Conciseness5/5

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

Three sentences, front-loaded with what the tool does, then when to call it, then the required post-call behavior. Every sentence carries a distinct, actionable instruction with no filler.

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

Completeness5/5

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

For a one-parameter display tool with an output schema, an agent needs purpose, trigger, id source, and follow-up behavior — all four are present. Nothing material is left to inference.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter already documents the 1-24 range, ordering, and valid id sources (list_creatives, search_library, get_job, get_upload). The description's mention of 'a finished job's results (its creative ids)' largely restates the schema, so it adds little beyond the baseline.

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

Purpose5/5

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

States a specific verb and resource ('Show creatives to the user in the chat') and immediately clarifies the mechanism — Rawa's viewer renders each at its own shape with download, open and full-screen buttons. This clearly separates it from retrieval siblings like list_creatives, search_library and get_creative, which return data rather than display it.

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

Usage Guidelines4/5

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

'Call this whenever the user wants to see creatives' gives an explicit trigger, and it enumerates the upstream sources whose output feeds it (finished job creative ids, list_creatives, search_library). It doesn't state a when-not or contrast case explicitly, but the trigger and source routing are strong enough that an agent can select it confidently.

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

submit_publicationPublish creativeAInspect

Post one of the brand's creatives to a connected channel, publicly. Without scheduledAt it goes out immediately; with a future ISO 8601 timestamp carrying its offset, such as 2026-09-25T14:00:00+03:00 or 2026-09-25T11:00:00Z, it is scheduled. Confirm the channel, caption and time with the user before calling. Publishing costs no credits. Give each new post a new requestId, and repeat it unchanged only on a retry: a retry within 2 minutes returns the first post with its current status and deduplicated: true, and a requestId reused with different arguments is refused. Without a requestId, the same arguments within 2 minutes count as a retry. Needs an admin to allow publishing over MCP (see get_workspace). Pass connectionId from list_integrations (where publishWith submit_publication marks the accounts this takes), or just the platform when the brand has a single account there. The format is the channel's first that takes the creative (an image becomes a feed post, a clip a reel); pass format only to override it. Every format but a story needs a caption, and a story takes none. The picture is published as it is: if its shape does not fit the format the call fails and says so, and resize_creative can make a version that fits. Not for TikTok, where only the person posting may choose the post's settings and declarations: call prepare_tiktok_post, which opens a panel where the user does that and posts.

NameRequiredDescriptionDefault
formatNoOverride the format picked from the channel and the creative.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
captionNoThe post's caption, required for every format but a story. write_caption can draft one in the brand's voice.
platformNoInstead of connectionId, when the brand has exactly one account on that platform.
requestIdNoYour own unique id for this request. Use a new one for every new request, even with the same arguments. Repeat it unchanged only to retry this exact call within 2 minutes; the retry returns the first result.
creativeIdYesA creative id from list_creatives, search_library, get_job or get_upload.
scheduledAtNoWhen to publish, as an ISO 8601 timestamp with its offset, in the future. Omit to publish now.
connectionIdNoThe connected account to post to, from list_integrations.

Output Schema

NameRequiredDescription
formatYes
statusYes
captionYes
mediaUrlNo
platformYes
creativeIdYes
accountNameYes
scheduledAtNo
deduplicatedNo
accountHandleNo
publicationIdYes
publishingNowYes
creditsChargedYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say this is a non-read-only, open-world, non-idempotent write; the description adds substantial context beyond that: no credit cost, an admin must enable MCP publishing, a 2-minute dedupe window keyed on requestId, refusal when a requestId is reused with different arguments, and a hard failure when the creative's aspect ratio does not fit the format with resize_creative as the remedy. These are exactly the operational traits an agent cannot get from 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.

Conciseness4/5

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

The core action and the immediate-vs-scheduled rule are front-loaded, and essentially every sentence carries non-redundant information. It is dense, however, with several independent rules packed into long sentences, so an agent must parse carefully rather than skim a short list.

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

Completeness5/5

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

For an 8-parameter, open-world write with real side effects, the description covers preconditions (admin allowance), input sourcing, scheduling semantics, retry/idempotency behavior, format selection, caption rules and a concrete failure mode. An output schema exists, so the absence of return-value explanation is not a gap.

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

Parameters4/5

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 genuine meaning: scheduledAt must be a future ISO 8601 timestamp carrying its offset (with worked examples), format is normally inferred from channel + creative and should only be passed to override, and caption is mandatory for every format except a story. It does not restate requestId's schema text in more depth than the schema already does, which keeps it below a 5.

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

Purpose5/5

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

States a specific verb and resource ('Post one of the brand's creatives to a connected channel, publicly') and immediately separates immediate vs scheduled publishing. It explicitly carves out TikTok to prepare_tiktok_post, so an agent can distinguish it from submit_tiktok_post, cancel_publication and list_publications 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.

Usage Guidelines5/5

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

Gives explicit when-not guidance ('Not for TikTok... call prepare_tiktok_post'), a user-confirmation requirement before calling, and the decision rule between connectionId and platform. It also names the upstream tools that supply each argument (list_integrations, get_workspace, list_creatives), leaving little to inference.

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

submit_tiktok_postSubmit TikTok postA
Idempotent
Inspect

Internal to the Rawa TikTok panel: posts with the settings and declarations the user made there. Never call this yourself.

NameRequiredDescriptionDefault
tokenYes
captionYes
consentYes
disableDuetYes
privacyLevelYes
disableStitchYes
disableCommentYes
brandContentToggleYes
brandOrganicToggleYes

Output Schema

NameRequiredDescription
statusYes
accountNameYes
scheduledAtNo
deduplicatedNo
publicationIdYes
publishingNowYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare openWorldHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is largely covered. The description adds genuinely non-redundant context: this route is panel-internal and its payload is the user's own panel settings and declarations, so the agent must not synthesize them. It does not say what actually happens on publish (visibility, failure modes).

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

Conciseness5/5

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

Two short sentences with the scope stated first and the hard prohibition second; nothing is wasted and the most actionable constraint is front-loaded.

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

Completeness4/5

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

For a tool the agent is explicitly told never to invoke, the essential information is the prohibition and the panel origin, both present, and an output schema exists so return values need no explanation. The missing piece is the routing target when the agent does need to publish.

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

Parameters2/5

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

Nine required parameters with 0% schema description coverage, and the description supplies no per-parameter meaning, allowed values, or the semantics of token/consent/brand toggles. 'The settings and declarations the user made there' gestures at the origin of the values but does not compensate for the coverage gap.

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

Purpose4/5

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

States a specific verb and resource ('posts' a TikTok post) plus a scope qualifier ('Internal to the Rawa TikTok panel'), which implicitly separates it from the public prepare_tiktok_post/submit_publication route. It doesn't explicitly name those siblings, so an agent must infer the distinction rather than read it.

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

Usage Guidelines4/5

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

'Never call this yourself' is an unambiguous prohibition and the strongest possible when-not guidance. It stops short of a 5 because it never names the alternative the agent should use instead (presumably prepare_tiktok_post), leaving the redirect to inference.

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

tag_creativeTag creativeA
Idempotent
Inspect

Organise a creative in the Library by adding or removing tags, by name. A name the brand does not use yet becomes a new tag. Returns the creative's tags afterwards. Free.

NameRequiredDescriptionDefault
addNoTag names to add. Created if they do not exist.
removeNoTag names to remove. A tag the creative does not carry is ignored.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
creativeIdYesA creative id from list_creatives, search_library, get_job or get_upload.

Output Schema

NameRequiredDescription
tagsYes
addedYes
createdYes
removedYes
creativeIdYes

TDQS

A4.2/5.0
Behavior4/5

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

Goes beyond the annotations by disclosing a side effect the annotations don't cover: an unrecognised tag name silently creates a brand-level tag, not just an association on this creative. It also states the post-call state (returns the creative's tags afterwards) and that the operation is free, which is real cost information. Annotations already cover readOnly=false, idempotent, non-destructive.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and object before the side effect and return value. No filler and nothing repeated from structured fields unnecessarily.

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

Completeness4/5

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

With a full schema, an output schema, and rich annotations, the description only needs to add the non-obvious bits, which it does (auto-creation and cost). It stops short of covering the 20-item cap or how simultaneous add/remove of the same name resolves, both minor gaps given the schema carries the limits.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented, including the add/remove semantics and the brandId omission rule. The description's 'by name' phrasing and the auto-create note largely restate the schema's 'Created if they do not exist', adding little beyond the baseline.

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

Purpose5/5

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

States a specific verb pair (adding or removing) on a specific resource (a creative in the Library) and the mechanism (by name). An agent can immediately distinguish it from siblings like rename_creative, set_creative_favorite, or edit_creative, which do different things to the same object.

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

Usage Guidelines4/5

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

The description makes the operating context clear: tags are addressed by name, and unknown names are created rather than rejected. It does not name an alternative or state when-not to use it, but no sibling overlaps with tag mutation, so the routing risk is low.

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

update_calendar_eventUpdate calendar eventA
Idempotent
Inspect

Change one of the brand's own calendar events. Pass only the fields to change. Rawa-curated events (holidays, seasons, cultural moments) belong to every brand and cannot be changed. Free.

NameRequiredDescriptionDefault
dateNoThe day it starts. ISO date, e.g. 2026-09-21.
titleNo
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
endDateNoThe last day. ISO date, e.g. 2026-09-21.
eventIdYesA calendar event id from list_calendar_events. Rawa-curated events are not editable.
marketsNoMarket ids from get_brand.
descriptionNo

Output Schema

NameRequiredDescription
dateNo
titleYes
eventIdYes
deduplicatedNoThe same call was made in the last 2 minutes: this is its result, not charged again.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnly=false, destructive=false, idempotent=true), so the description's added value is the patch semantics and the hard restriction that Rawa-curated events are immutable. "Free" also discloses that the call consumes no credits, a non-obvious cost trait not present in any structured field. It does not describe what a partial update returns or whether omitted fields are preserved vs. cleared, which keeps 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.

Conciseness5/5

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

Four short sentences, front-loaded with the action and scope, then the update contract, then the exclusion, then cost. The "Free." fragment is terse but carries real information about credit consumption, so it earns its place.

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

Completeness4/5

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

The tool has an output schema and annotations, so return values and safety are covered elsewhere; the description fills in the two gaps an agent would otherwise trip on — partial-update semantics and the curated-event restriction. Only the treatment of cleared vs. preserved fields is left implicit.

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

Parameters3/5

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

With 71% schema description coverage, the schema already documents date, endDate, eventId, brandId, and markets. The description adds the crucial implication that all non-eventId fields are optional and only changed fields need sending, but it says nothing about title, description, or markets semantics. Baseline 3 is appropriate given the schema carries most of the load.

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

Purpose5/5

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

"Change one of the brand's own calendar events" states a specific verb and resource and immediately bounds the object set to brand-owned events. That scoping cleanly separates it from create_calendar_event, delete_calendar_event, and list_calendar_events without the agent needing to open a schema.

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

Usage Guidelines4/5

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

"Pass only the fields to change" tells the agent this is a partial-update operation, and the Rawa-curated exclusion states a concrete when-not condition. It stops short of naming a sibling to use for the curated case (there isn't one) or for creating events, so it is clear but not fully routed.

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

upload_image_fileUpload an image fileAInspect

Upload an image you hold as a file, with no action from the user: only for an agent that can run shell commands and has the file on its own filesystem (a coding agent such as Replit, Cursor or Claude Code working in a project). Pass the file's name as it is on disk; you get back a creativeId reserved for it and a curl command. Run the command: it posts the file to Rawa and answers {"creativeId": ...} once the image is in the brand's library. Use the creativeId the command prints, not the reserved one: when the library already holds the same image, it prints that creative's id with "alreadyInLibrary": true and adds no copy. Then pass that creativeId to resize_creative, edit_creative, remove_background, sharpen_creative or any other tool, in the same turn. Never use this for an image the user pasted or attached in a chat: you cannot read such an attachment and there is no file to post; call request_image_upload instead. For an image already at a public https URL, pass imageUrl to the tool directly and skip the upload. The file must be a JPEG, PNG, WebP, AVIF, HEIC or GIF of at most 25 MB. The command works for one hour and for one upload; if curl fails, call this tool again for a fresh command rather than retrying the same one. Free: nothing is charged for the upload.

NameRequiredDescriptionDefault
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
purposeNoWhat the image is for, kept with the upload, e.g. 'Resize for Snapchat'.
fileSizeNoThe file's size in bytes, when you know it.
filenameYesThe file's path or name as curl will read it from disk, e.g. 'assets/hero.png'.
mimeTypeNoThe file's type, e.g. image/png. Read from the extension when omitted.

Output Schema

NameRequiredDescription
curlYes
nextYes
maxBytesYes
mimeTypeYes
uploadIdYes
expiresAtYes
uploadUrlYes
creativeIdYes
uploadTokenYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only cover safety hints; the description adds the real behavior: a two-step reserve-then-curl flow, a one-hour single-use command, the dedupe behavior that prints alreadyInLibrary and adds no copy, the instruction to re-call on curl failure rather than retry, and that the upload is free. This is context an agent could not infer from annotations or schema.

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

Conciseness4/5

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

Front-loaded with the core action and the critical constraint (no user action, local filesystem only), then flows logically through reservation, execution, dedupe and downstream use. It is long and a few clauses (format list, free-upload note) could be trimmed, 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.

Completeness5/5

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

Given the two-step upload mechanic and the existence of an output schema, the description covers everything needed: prerequisites, accepted formats and size cap, failure recovery, dedupe semantics, and which creativeId to use next. No material gap remains for correct invocation.

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

Parameters3/5

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

Schema coverage is 100%, so parameters are already documented. The description reinforces that filename is the on-disk path and adds file-format and 25 MB constraints, but adds little about brandId, purpose, fileSize or mimeType beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (upload an image held as a file) and immediately scopes it to agents with shell access and a local file. It distinguishes itself from request_image_upload (pasted attachments) and from passing a public imageUrl directly, so an agent can route without opening schemas.

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

Usage Guidelines5/5

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

Explicit when-to-use (agent with file on its filesystem), explicit when-not-to-use (never for pasted/attached chat images; use request_image_upload), and an alternative path for public URLs. It also names the downstream tools that consume the resulting creativeId.

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

wait_for_jobsWait for jobsA
Read-onlyIdempotent
Inspect

Waits up to timeoutSeconds for generation jobs to finish, then answers once with each job's state (the fields get_job returns), a summary and the finished images as pictures. Jobs take 1-5 minutes. Use it when no job panel shows: pass every jobId you are waiting on, tell the user the work is under way between calls, and call it again with the jobs still running until allFinal is true. Show finished creatives with show_creatives. An id that is not found answers for itself without failing the others.

NameRequiredDescriptionDefault
jobIdsYesThe jobIds the generation tools returned (generate_design returns one per concept, generate_image one per entry in images).
brandIdNoOptional: the brand it belongs to, by id or name. Read from the id when omitted.
timeoutSecondsNoHow long to wait for every job to be final. Defaults to 15; 0 reads them at once.

Output Schema

NameRequiredDescription
jobsYes
nextYes
mediaYes
summaryYesJobs by status; failed includes rejected, errors counts ids that were not found.
allFinalYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly and idempotent annotations, the description discloses operational behavior: jobs take 1-5 minutes, the call answers once after waiting, repeated calls are needed until allFinal, and an unknown id fails only for itself. These are meaningful traits an agent needs before invoking it.

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

Conciseness5/5

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

The purpose is front-loaded in the first sentence, followed by practical timing, usage, display, and error-isolation details. Each sentence contributes useful information without waste.

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

Completeness5/5

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

With annotations, a fully described input schema, and an output schema, the description supplies the remaining operational context: timing expectations, polling loop, partial failure behavior, and when to use show_creatives. Nothing important for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents jobIds, brandId, and timeoutSeconds. The description reinforces jobIds and timeoutSeconds but does not add much beyond the schema and omits brandId, so baseline 3 applies.

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

Purpose5/5

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

The description states a specific verb and resource: wait up to timeoutSeconds for generation jobs to finish, then answer with each job's state, summary, and images. It also positions the tool relative to get_job and show_creatives, so an agent can distinguish its role from those siblings.

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

Usage Guidelines5/5

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

It gives explicit usage guidance: use when no job panel shows, pass every jobId being waited on, tell the user work is under way between calls, and call again until allFinal is true. It also names show_creatives for displaying finished creatives.

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

watch_jobsJob panel statusB
Read-onlyIdempotent
Inspect

Internal to the Rawa job panel: the state of the jobs it is tracking. Never call this yourself.

NameRequiredDescriptionDefault
tokensYes

Output Schema

NameRequiredDescription
jobsYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare the full safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds useful context that this is a panel-internal state feed rather than a user-initiated call, but says nothing about how the tokens are consumed or what happens with stale/expired tokens.

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

Conciseness4/5

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

Two short sentences with the internal scope front-loaded and the do-not-call warning in the strongest position. It is tight, though the terseness edges into under-specification rather than pure economy.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the do-not-call directive covers the main decision an agent must make. However, the unexplained "tokens" input and the absence of any pointer to the correct sibling tool leave gaps for an agent that hits this while looking for job status.

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

Parameters2/5

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

The single required parameter "tokens" (array of 1-12 non-empty strings) has 0% schema description coverage, and the description does not explain what a token represents, where it comes from, or whether missing/invalid tokens cause an error. With one undocumented parameter the schema and description together leave the agent unable to construct a valid call.

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

Purpose3/5

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

"The state of the jobs it is tracking" names a resource (jobs) and an implied status read, but the verb is nominal and the scope is circular ("jobs it is tracking"). It does not distinguish itself from siblings like get_job or wait_for_jobs, so the agent learns only that this is a job-panel-internal status feed.

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

Usage Guidelines4/5

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

"Never call this yourself" is an unambiguous, explicit exclusion — stronger than most usage guidance. It stops short of a full routing instruction because it never names the sibling the agent should use instead (wait_for_jobs or get_job) for legitimate job polling.

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

write_captionWrite captionA
Read-onlyIdempotent
Inspect

Write social captions in the brand's voice, ready to post: hook, body and hashtags, shaped for the platform. Pass a creativeId to caption a specific image or video (its products and look are read), a brief to say what the post is about, or both. Defaults to one Instagram feed caption. Free, and nothing is saved: the captions come back as text. Needs an admin who has allowed generation over MCP, and may be limited to admins.

NameRequiredDescriptionDefault
toneNoA tone hint, e.g. playful, premium, urgent.
briefNoWhat the post is about, in a sentence or two.
countNoHow many alternative captions to write. Defaults to 1.
marketNoThe market the post runs in, e.g. Saudi Arabia.
brandIdNoA brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand.
languageNoThe language to write in. Defaults to the brand's own.
platformNoDefaults to instagram.
postTypeNoDefaults to post.
creativeIdNoThe image or video the caption is for.

Output Schema

NameRequiredDescription
captionsYes
platformYes
postTypeYes

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: 'Free, and nothing is saved: the captions come back as text' confirms the read-only, non-persistent behavior implied by readOnlyHint/destructiveHint=false and tells the agent what the response is. It also discloses the auth prerequisite ('Needs an admin who has allowed generation over MCP') and the possibility of admin-only limiting, which is exactly the extra context annotations cannot express.

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

Conciseness5/5

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

Front-loads the core purpose, then adds input modes, defaults, behavior, and permissions in a tight sequence with no filler. Every sentence, including the final auth note, carries operational information.

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

Completeness5/5

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

For a 9-parameter generation tool with a 100%-covered schema, an output schema, and rich annotations, the description covers the non-obvious essentials: what gets read from a creative, defaults, non-persistence, and admin gating. Nothing material an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is already 100%, so the schema carries most parameter meaning; the description adds value by explaining that creativeId causes the image/video's products and look to be read, and by summarizing defaults for language, platform, postType, and count. It does not add much for tone, market, or brandId beyond what the schema already says, so it is an enhancement rather than a full restatement.

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

Purpose5/5

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

States a specific verb and resource ('Write social captions in the brand's voice') and describes the shape of the output (hook, body, hashtags) and platform tailoring. It also explains the two input modes (creativeId, brief, or both), which cleanly separates it from image-generation siblings like generate_design or generate_image.

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

Usage Guidelines4/5

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

Gives clear context for invoking it: pass a creativeId to caption a specific asset, a brief to state the topic, or both, and notes the default is one Instagram feed caption. It does not explicitly name a sibling tool as the alternative for any scenario, which keeps it out of 5 territory.

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.

  1. 1 tool update
    • Changedlist_recent_posts5 fields changed
      • addedOutput schema / properties / posts / items / properties / metrics / properties / day
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / posts / items / properties / metrics / properties / fetchedAt
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / posts / items / properties / metrics / properties / follows
        Added value: +{
        +  "type": "number"
        +}
      • removedOutput schema / properties / posts / items / properties / metrics / properties / impressions
        Removed value: -{
        -  "type": "number"
        -}
      • changedOutput schema / properties / posts / items / properties / metrics / required
        Previous value: -[
        -  "likes",
        -  "comments",
        -  "shares",
        -  "saves",
        -  "fetchedAt"
        -]New value: +[
        +  "day"
        +]
  2. 4 tool updates
    • Changedget_brand_analysis10 fields changed
      • addedInput schema / properties / account
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One connected account to read. Omit it for every connected analytics account; each comes back on its own, never combined.",
        +  "properties": {
        +    "accountId": {
        +      "description": "The account's id, as a result's account.accountId names it.",
        +      "maxLength": 200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "platform": {
        +      "description": "The account's platform, as a result's account.platform names it.",
        +      "enum": [
        +        "instagram",
        +        "facebook",
        +        "tiktok",
        +        "meta_ads",
        +        "linkedin",
        +        "linkedin_ads",
        +        "tiktok_ads",
        +        "google_ads",
        +        "snapchat_ads",
        +        "shopify"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "platform",
        +    "accountId"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / accounts
        Added value: +{
        +  "description": "The newest analysis of each connected analytics account.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "account": {
        +        "additionalProperties": false,
        +        "description": "The connected account every number beside it belongs to.",
        +        "properties": {
        +          "accountId": {
        +            "type": "string"
        +          },
        +          "accountName": {
        +            "type": "string"
        +          },
        +          "platform": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "platform",
        +          "accountId",
        +          "accountName"
        +        ],
        +        "type": "object"
        +      },
        +      "analysisType": {
        +        "type": "string"
        +      },
        +      "createdAt": {
        +        "type": "string"
        +      },
        +      "hasAnalysis": {
        +        "type": "boolean"
        +      },
        +      "headline": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "insights": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "evidence": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "metric": {
        +                    "type": "string"
        +                  },
        +                  "note": {
        +                    "type": [
        +                      "string",
        +                      "null"
        +                    ]
        +                  },
        +                  "source": {
        +                    "type": "string"
        +                  },
        +                  "value": {
        +                    "type": "number"
        +                  },
        +                  "windowDays": {
        +                    "type": [
        +                      "number",
        +                      "null"
        +                    ]
        +                  }
        +                },
        +                "required": [
        +                  "source",
        +                  "metric",
        +                  "value",
        +                  "windowDays",
        +                  "note"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "kind": {
        +              "enum": [
        +                "metric_fact",
        +                "actionable"
        +              ],
        +              "type": "string"
        +            },
        +            "narrative": {
        +              "type": "string"
        +            },
        +            "recommendation": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "title": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind",
        +            "title",
        +            "narrative",
        +            "evidence",
        +            "recommendation"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "omittedInsights": {
        +        "type": "number"
        +      },
        +      "summary": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "account",
        +      "hasAnalysis"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / analysisType
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / createdAt
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / hasAnalysis
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / headline
        Removed value: -{
        -  "type": [
        -    "string",
        -    "null"
        -  ]
        -}
      • removedOutput schema / properties / insights
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "evidence": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "metric": {
        -              "type": "string"
        -            },
        -            "note": {
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "source": {
        -              "type": "string"
        -            },
        -            "value": {
        -              "type": "number"
        -            },
        -            "windowDays": {
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            }
        -          },
        -          "required": [
        -            "source",
        -            "metric",
        -            "value",
        -            "windowDays",
        -            "note"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "kind": {
        -        "enum": [
        -          "metric_fact",
        -          "actionable"
        -        ],
        -        "type": "string"
        -      },
        -      "narrative": {
        -        "type": "string"
        -      },
        -      "recommendation": {
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "title": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "title",
        -      "narrative",
        -      "evidence",
        -      "recommendation"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / omittedInsights
        Removed value: -{
        -  "type": "number"
        -}
      • removedOutput schema / properties / summary
        Removed value: -{
        -  "type": [
        -    "string",
        -    "null"
        -  ]
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "hasAnalysis"
        -]New value: +[
        +  "accounts"
        +]
    • Changedget_creative_insights8 fields changed
      • addedInput schema / properties / account
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One connected account to read. Omit it for every connected analytics account; each comes back on its own, never combined.",
        +  "properties": {
        +    "accountId": {
        +      "description": "The account's id, as a result's account.accountId names it.",
        +      "maxLength": 200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "platform": {
        +      "description": "The account's platform, as a result's account.platform names it.",
        +      "enum": [
        +        "instagram",
        +        "facebook",
        +        "tiktok",
        +        "meta_ads",
        +        "linkedin",
        +        "linkedin_ads",
        +        "tiktok_ads",
        +        "google_ads",
        +        "snapchat_ads",
        +        "shopify"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "platform",
        +    "accountId"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / accounts
        Added value: +{
        +  "description": "One entry per connected analytics account, never combined.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "account": {
        +        "additionalProperties": false,
        +        "description": "The connected account every number beside it belongs to.",
        +        "properties": {
        +          "accountId": {
        +            "type": "string"
        +          },
        +          "accountName": {
        +            "type": "string"
        +          },
        +          "platform": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "platform",
        +          "accountId",
        +          "accountName"
        +        ],
        +        "type": "object"
        +      },
        +      "hasPerformanceData": {
        +        "type": "boolean"
        +      },
        +      "organicEngagementLifts": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "feature": {
        +              "type": "string"
        +            },
        +            "liftPct": {
        +              "type": "number"
        +            },
        +            "postsWith": {
        +              "type": "number"
        +            },
        +            "postsWithout": {
        +              "type": "number"
        +            },
        +            "value": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "feature",
        +            "value",
        +            "liftPct",
        +            "postsWith",
        +            "postsWithout"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "paidCtrLifts": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "feature": {
        +              "type": "string"
        +            },
        +            "liftPct": {
        +              "type": "number"
        +            },
        +            "postsWith": {
        +              "type": "number"
        +            },
        +            "postsWithout": {
        +              "type": "number"
        +            },
        +            "value": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "feature",
        +            "value",
        +            "liftPct",
        +            "postsWith",
        +            "postsWithout"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "placements": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "paidImpressions": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "placement": {
        +              "type": "string"
        +            },
        +            "roas": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "spend": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "placement",
        +            "paidImpressions",
        +            "roas",
        +            "spend"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "topPaidCreatives": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "aspectRatio": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "creativeAssetId": {
        +              "type": "string"
        +            },
        +            "paidImpressions": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "roas": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "spend": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "creativeAssetId",
        +            "roas",
        +            "spend",
        +            "paidImpressions",
        +            "aspectRatio"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "account",
        +      "hasPerformanceData",
        +      "paidCtrLifts",
        +      "organicEngagementLifts",
        +      "topPaidCreatives",
        +      "placements"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / hasPerformanceData
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / organicEngagementLifts
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "feature": {
        -        "type": "string"
        -      },
        -      "liftPct": {
        -        "type": "number"
        -      },
        -      "postsWith": {
        -        "type": "number"
        -      },
        -      "postsWithout": {
        -        "type": "number"
        -      },
        -      "value": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "feature",
        -      "value",
        -      "liftPct",
        -      "postsWith",
        -      "postsWithout"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / paidCtrLifts
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "feature": {
        -        "type": "string"
        -      },
        -      "liftPct": {
        -        "type": "number"
        -      },
        -      "postsWith": {
        -        "type": "number"
        -      },
        -      "postsWithout": {
        -        "type": "number"
        -      },
        -      "value": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "feature",
        -      "value",
        -      "liftPct",
        -      "postsWith",
        -      "postsWithout"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / placements
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "paidImpressions": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "placement": {
        -        "type": "string"
        -      },
        -      "roas": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "spend": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "placement",
        -      "paidImpressions",
        -      "roas",
        -      "spend"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / topPaidCreatives
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "aspectRatio": {
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "creativeAssetId": {
        -        "type": "string"
        -      },
        -      "paidImpressions": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "roas": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "spend": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "creativeAssetId",
        -      "roas",
        -      "spend",
        -      "paidImpressions",
        -      "aspectRatio"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "windowDays",
        -  "connectedPlatforms",
        -  "hasPerformanceData",
        -  "paidCtrLifts",
        -  "organicEngagementLifts",
        -  "topPaidCreatives",
        -  "placements",
        -  "competitors"
        -]New value: +[
        +  "windowDays",
        +  "connectedPlatforms",
        +  "accounts",
        +  "competitors"
        +]
    • Changedget_performance_overview12 fields changed
      • addedInput schema / properties / account
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One connected account to read. Omit it for every connected analytics account; each comes back on its own, never combined.",
        +  "properties": {
        +    "accountId": {
        +      "description": "The account's id, as a result's account.accountId names it.",
        +      "maxLength": 200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "platform": {
        +      "description": "The account's platform, as a result's account.platform names it.",
        +      "enum": [
        +        "instagram",
        +        "facebook",
        +        "tiktok",
        +        "meta_ads",
        +        "linkedin",
        +        "linkedin_ads",
        +        "tiktok_ads",
        +        "google_ads",
        +        "snapchat_ads",
        +        "shopify"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "platform",
        +    "accountId"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / accounts
        Added value: +{
        +  "description": "One entry per connected analytics account, never combined.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "account": {
        +        "additionalProperties": false,
        +        "description": "The connected account every number beside it belongs to.",
        +        "properties": {
        +          "accountId": {
        +            "type": "string"
        +          },
        +          "accountName": {
        +            "type": "string"
        +          },
        +          "platform": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "platform",
        +          "accountId",
        +          "accountName"
        +        ],
        +        "type": "object"
        +      },
        +      "audience": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "dimension": {
        +              "type": "string"
        +            },
        +            "segments": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "followers": {
        +                    "type": [
        +                      "number",
        +                      "null"
        +                    ]
        +                  },
        +                  "followersPct": {
        +                    "type": [
        +                      "number",
        +                      "null"
        +                    ]
        +                  },
        +                  "paidImpressions": {
        +                    "type": [
        +                      "number",
        +                      "null"
        +                    ]
        +                  },
        +                  "reach": {
        +                    "type": [
        +                      "number",
        +                      "null"
        +                    ]
        +                  },
        +                  "roas": {
        +                    "type": [
        +                      "number",
        +                      "null"
        +                    ]
        +                  },
        +                  "segment": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "segment",
        +                  "followers",
        +                  "followersPct",
        +                  "reach",
        +                  "paidImpressions",
        +                  "roas"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "dimension",
        +            "segments"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "currency": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "hasData": {
        +        "type": "boolean"
        +      },
        +      "kpiTotals": {
        +        "description": "Only the metrics the platform reports for the account; LinkedIn follower gain is two metrics, organicFollowerGain and paidFollowerGain. Meta counts ads inside organicReach and organicImpressions; organicReachAds and organicImpressionsAds are the part of each that came from ads.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "deltaPct": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "metric": {
        +              "type": "string"
        +            },
        +            "value": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "metric",
        +            "value",
        +            "deltaPct"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "kpiTrends": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "changePct": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "first": {
        +              "type": "number"
        +            },
        +            "firstDay": {
        +              "type": "string"
        +            },
        +            "last": {
        +              "type": "number"
        +            },
        +            "lastDay": {
        +              "type": "string"
        +            },
        +            "metric": {
        +              "type": "string"
        +            },
        +            "peak": {
        +              "type": "number"
        +            },
        +            "peakDay": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "metric",
        +            "firstDay",
        +            "lastDay",
        +            "first",
        +            "last",
        +            "peakDay",
        +            "peak",
        +            "changePct"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "organicBaselines": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "current": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "median": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "metric": {
        +              "type": "string"
        +            },
        +            "p25": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "p75": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "sampleSize": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "metric",
        +            "current",
        +            "median",
        +            "p25",
        +            "p75",
        +            "sampleSize"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "topPublications": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "engagementRate": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "impressions": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "performanceScore": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "platform": {
        +              "type": "string"
        +            },
        +            "publicationId": {
        +              "type": "string"
        +            },
        +            "rank": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "reach": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "roas": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "spend": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "publicationId",
        +            "platform",
        +            "performanceScore",
        +            "rank",
        +            "reach",
        +            "impressions",
        +            "engagementRate",
        +            "spend",
        +            "roas"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "account",
        +      "currency",
        +      "hasData",
        +      "kpiTotals",
        +      "kpiTrends",
        +      "topPublications",
        +      "organicBaselines",
        +      "audience"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / audience
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "dimension": {
        -        "type": "string"
        -      },
        -      "segments": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "followers": {
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "followersPct": {
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "paidImpressions": {
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "reach": {
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "roas": {
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "segment": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "segment",
        -            "followers",
        -            "followersPct",
        -            "reach",
        -            "paidImpressions",
        -            "roas"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "dimension",
        -      "segments"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / channels
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "channel": {
        -        "type": "string"
        -      },
        -      "ctr": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "engagementRate": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "followerCount": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "impressions": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "platform": {
        -        "type": "string"
        -      },
        -      "reach": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "reachDeltaPct": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "roas": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "spend": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "spendDeltaPct": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "platform",
        -      "channel",
        -      "reach",
        -      "impressions",
        -      "engagementRate",
        -      "followerCount",
        -      "spend",
        -      "roas",
        -      "ctr",
        -      "reachDeltaPct",
        -      "spendDeltaPct"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / currency
        Removed value: -{
        -  "type": [
        -    "string",
        -    "null"
        -  ]
        -}
      • removedOutput schema / properties / hasData
        Removed value: -{
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / kpiTotals
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "deltaPct": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "metric": {
        -        "type": "string"
        -      },
        -      "value": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "metric",
        -      "value",
        -      "deltaPct"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / kpiTrends
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "changePct": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "first": {
        -        "type": "number"
        -      },
        -      "firstDay": {
        -        "type": "string"
        -      },
        -      "last": {
        -        "type": "number"
        -      },
        -      "lastDay": {
        -        "type": "string"
        -      },
        -      "metric": {
        -        "type": "string"
        -      },
        -      "peak": {
        -        "type": "number"
        -      },
        -      "peakDay": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "metric",
        -      "firstDay",
        -      "lastDay",
        -      "first",
        -      "last",
        -      "peakDay",
        -      "peak",
        -      "changePct"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / organicBaselines
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "current": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "median": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "metric": {
        -        "type": "string"
        -      },
        -      "p25": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "p75": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "sampleSize": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "metric",
        -      "current",
        -      "median",
        -      "p25",
        -      "p75",
        -      "sampleSize"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / reachByChannel
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "channel": {
        -        "type": "string"
        -      },
        -      "platform": {
        -        "type": "string"
        -      },
        -      "reach": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "platform",
        -      "channel",
        -      "reach"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / topPublications
        Removed value: -{
        -  "items": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "engagementRate": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "impressions": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "performanceScore": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "platform": {
        -        "type": "string"
        -      },
        -      "publicationId": {
        -        "type": "string"
        -      },
        -      "rank": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "reach": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "roas": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "spend": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "publicationId",
        -      "platform",
        -      "performanceScore",
        -      "rank",
        -      "reach",
        -      "impressions",
        -      "engagementRate",
        -      "spend",
        -      "roas"
        -    ],
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "windowDays",
        -  "currency",
        -  "hasData",
        -  "kpiTotals",
        -  "kpiTrends",
        -  "channels",
        -  "reachByChannel",
        -  "topPublications",
        -  "organicBaselines",
        -  "audience"
        -]New value: +[
        +  "windowDays",
        +  "accounts"
        +]
    • Changedlist_recent_posts1 field changed
      • changedOutput schema / properties / posts / items / properties / metrics / required
        Previous value: -[
        -  "likes",
        -  "comments",
        -  "shares",
        -  "saves",
        -  "reach",
        -  "fetchedAt"
        -]New value: +[
        +  "likes",
        +  "comments",
        +  "shares",
        +  "saves",
        +  "fetchedAt"
        +]
  3. 1 tool update
    • Changedget_compliance1 field changed
      • addedOutput schema / properties / markets
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  4. 2 tool updates
    • Removedlist_signals
    • Changedresize_creative1 field changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "balanceAfter": {
        -        "type": "number"
        -      },
        -      "breakdown": {
        -        "type": "string"
        -      },
        -      "credits": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "dryRun": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "wouldRefuse": {
        -        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "dryRun",
        -      "credits",
        -      "breakdown",
        -      "balanceAfter"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "alreadyInLibrary": {
        -        "const": true,
        -        "description": "The brand's library already held this image, so no new creative was added: the id names that one.",
        -        "type": "boolean"
        -      },
        -      "creditsCharged": {
        -        "type": "number"
        -      },
        -      "creditsRemaining": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "jobId": {
        -        "type": "string"
        -      },
        -      "sourceCreativeId": {
        -        "type": "string"
        -      },
        -      "targets": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "watchToken": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "jobId",
        -      "watchToken",
        -      "creditsCharged",
        -      "creditsRemaining",
        -      "sourceCreativeId",
        -      "targets"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "balanceAfter": {
        +        "type": "number"
        +      },
        +      "breakdown": {
        +        "type": "string"
        +      },
        +      "credits": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "dryRun": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "wouldRefuse": {
        +        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "dryRun",
        +      "credits",
        +      "breakdown",
        +      "balanceAfter"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alreadyInLibrary": {
        +        "const": true,
        +        "description": "The brand's library already held this image, so no new creative was added: the id names that one.",
        +        "type": "boolean"
        +      },
        +      "creditsCharged": {
        +        "type": "number"
        +      },
        +      "creditsRemaining": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "jobId": {
        +        "type": "string"
        +      },
        +      "sourceCreativeId": {
        +        "type": "string"
        +      },
        +      "targets": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "watchToken": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "jobId",
        +      "watchToken",
        +      "creditsCharged",
        +      "creditsRemaining",
        +      "sourceCreativeId",
        +      "targets"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A Motion ad: one job per shape.",
        +    "properties": {
        +      "creditsCharged": {
        +        "type": "number"
        +      },
        +      "creditsRemaining": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "jobs": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "jobId": {
        +              "type": "string"
        +            },
        +            "target": {
        +              "description": "The shape this job re-lays the Motion ad out on.",
        +              "type": "string"
        +            },
        +            "watchToken": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "jobId",
        +            "target",
        +            "watchToken"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "sourceCreativeId": {
        +        "type": "string"
        +      },
        +      "targets": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "jobs",
        +      "sourceCreativeId",
        +      "targets",
        +      "creditsCharged",
        +      "creditsRemaining"
        +    ],
        +    "type": "object"
        +  }
        +]
  5. 47 tool updates
    • Changedadapt_design1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedadd_competitor1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedcancel_publication1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedcreate_calendar_event1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changeddelete_calendar_event1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changededit_creative2 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "balanceAfter": {
        -        "type": "number"
        -      },
        -      "breakdown": {
        -        "type": "string"
        -      },
        -      "credits": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "dryRun": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "wouldRefuse": {
        -        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "dryRun",
        -      "credits",
        -      "breakdown",
        -      "balanceAfter"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "creditsCharged": {
        -        "type": "number"
        -      },
        -      "creditsRemaining": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "jobId": {
        -        "type": "string"
        -      },
        -      "sourceCreativeId": {
        -        "type": "string"
        -      },
        -      "watchToken": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "jobId",
        -      "watchToken",
        -      "creditsCharged",
        -      "creditsRemaining",
        -      "sourceCreativeId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "balanceAfter": {
        +        "type": "number"
        +      },
        +      "breakdown": {
        +        "type": "string"
        +      },
        +      "credits": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "dryRun": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "wouldRefuse": {
        +        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "dryRun",
        +      "credits",
        +      "breakdown",
        +      "balanceAfter"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alreadyInLibrary": {
        +        "const": true,
        +        "description": "The brand's library already held this image, so no new creative was added: the id names that one.",
        +        "type": "boolean"
        +      },
        +      "creditsCharged": {
        +        "type": "number"
        +      },
        +      "creditsRemaining": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "jobId": {
        +        "type": "string"
        +      },
        +      "sourceCreativeId": {
        +        "type": "string"
        +      },
        +      "watchToken": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "jobId",
        +      "watchToken",
        +      "creditsCharged",
        +      "creditsRemaining",
        +      "sourceCreativeId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedgenerate_design3 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
      • addedInput schema / properties / concepts / items / properties / photoCreativeId
        Added value: +{
        +  "description": "Id of a finished image in the brand's library (from get_upload, list_creatives or search_library) to build this concept on, kept as it is: it is the design's image, only cropped, sized and placed, never filtered, tinted or redrawn, and the headline, copy and graphics are designed around it. Use it whenever the user wants text or a layout on their own photo. No other imagery is made for the concept. Only with format still. A photo the user pasted or attached in the chat goes through request_image_upload first.",
        +  "type": "string"
        +}
      • addedInput schema / properties / concepts / maxItems
        Added value: +12
    • Changedgenerate_image6 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
      • changedInput schema / properties / count / description
        Previous value: -"How many different images to make. Defaults to 1. Each one is charged."New value: +"How many variations of each entry to make. Defaults to 1. The call makes images × count images, each charged."
      • addedInput schema / properties / images
        Added value: +{
        +  "description": "Every image the user asked for, one entry per different image. Each becomes its own job.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "name": {
        +        "description": "A short name for this image, echoed back with its jobId as concept.",
        +        "type": "string"
        +      },
        +      "prompt": {
        +        "description": "What this image should show, in plain words.",
        +        "type": "string"
        +      },
        +      "referenceCreativeIds": {
        +        "description": "Ids of finished images in the brand's library (from list_creatives, search_library, get_upload or a job of this conversation) to build on: the one the user picked and wants another like, changed as the prompt says. Only images the user pointed at. A carousel is sent as every one of its pages, and each page counts toward the images one generation takes.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "prompt"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 12,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • removedInput schema / properties / prompt
        Removed value: -{
        -  "description": "What the image should show, in plain words.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "prompt",
        -  "aspectRatio"
        -]New value: +[
        +  "images",
        +  "aspectRatio"
        +]
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "balanceAfter": {
        -        "type": "number"
        -      },
        -      "breakdown": {
        -        "type": "string"
        -      },
        -      "credits": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "dryRun": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "wouldRefuse": {
        -        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "dryRun",
        -      "credits",
        -      "breakdown",
        -      "balanceAfter"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "creditsCharged": {
        -        "type": "number"
        -      },
        -      "creditsRemaining": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "jobId": {
        -        "type": "string"
        -      },
        -      "watchToken": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "jobId",
        -      "watchToken",
        -      "creditsCharged",
        -      "creditsRemaining"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "balanceAfter": {
        +        "type": "number"
        +      },
        +      "breakdown": {
        +        "type": "string"
        +      },
        +      "credits": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "dryRun": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "wouldRefuse": {
        +        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "dryRun",
        +      "credits",
        +      "breakdown",
        +      "balanceAfter"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "creditsCharged": {
        +        "type": "number"
        +      },
        +      "creditsRemaining": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "jobs": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "concept": {
        +              "type": "string"
        +            },
        +            "jobId": {
        +              "type": "string"
        +            },
        +            "watchToken": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "jobId",
        +            "watchToken"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "jobs",
        +      "creditsCharged",
        +      "creditsRemaining"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedget_brand1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedget_brand_analysis1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedget_competitor_analyses1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedget_competitor_audience1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedget_competitor_creative_mix1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedget_compliance1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedget_creative2 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"Optional: the brand it belongs to. Read from the id when omitted."New value: +"Optional: the brand it belongs to, by id or name. Read from the id when omitted."
      • addedOutput schema / properties / media / items / properties / previewUrl
        Added value: +{
        +  "description": "A small WebP of it to look at; url is the full size to hand over.",
        +  "type": "string"
        +}
    • Changedget_creative_insights1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedget_credit_status1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedget_job2 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"Optional: the brand it belongs to. Read from the id when omitted."New value: +"Optional: the brand it belongs to, by id or name. Read from the id when omitted."
      • addedOutput schema / properties / media / items / properties / previewUrl
        Added value: +{
        +  "description": "A small WebP of it to look at; url is the full size to hand over.",
        +  "type": "string"
        +}
    • Changedget_performance_overview1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedget_upload3 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"Optional: the brand it belongs to. Read from the id when omitted."New value: +"Optional: the brand it belongs to, by id or name. Read from the id when omitted."
      • addedOutput schema / properties / creatives / items / properties / alreadyInLibrary
        Added value: +{
        +  "const": true,
        +  "description": "The brand's library already held this image, so no new creative was added: the id names that one.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / media / items / properties / previewUrl
        Added value: +{
        +  "description": "A small WebP of it to look at; url is the full size to hand over.",
        +  "type": "string"
        +}
    • Changedlist_audiences1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedlist_calendar_events1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedlist_competitor_ads1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedlist_competitors1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedlist_creatives3 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
      • changedInput schema / properties / includeImages / description
        Previous value: -"Also show the pictures themselves, for the first 3 of the page. Off by default: ask for it when the user wants to look at the creatives rather than read about them."New value: +"Also show the pictures themselves, for the first 6 of the page. Off by default: ask for it when the user wants to look at the creatives rather than read about them."
      • addedOutput schema / properties / media / items / properties / previewUrl
        Added value: +{
        +  "description": "A small WebP of it to look at; url is the full size to hand over.",
        +  "type": "string"
        +}
    • Changedlist_design_systems1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedlist_entities1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedlist_integrations1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedlist_publications1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedlist_recent_posts1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedlist_signals1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedprepare_tiktok_post1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedremove_background2 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "balanceAfter": {
        -        "type": "number"
        -      },
        -      "breakdown": {
        -        "type": "string"
        -      },
        -      "credits": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "dryRun": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "wouldRefuse": {
        -        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "dryRun",
        -      "credits",
        -      "breakdown",
        -      "balanceAfter"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "creditsCharged": {
        -        "type": "number"
        -      },
        -      "creditsRemaining": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "jobId": {
        -        "type": "string"
        -      },
        -      "sourceCreativeId": {
        -        "type": "string"
        -      },
        -      "watchToken": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "jobId",
        -      "watchToken",
        -      "creditsCharged",
        -      "creditsRemaining",
        -      "sourceCreativeId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "balanceAfter": {
        +        "type": "number"
        +      },
        +      "breakdown": {
        +        "type": "string"
        +      },
        +      "credits": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "dryRun": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "wouldRefuse": {
        +        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "dryRun",
        +      "credits",
        +      "breakdown",
        +      "balanceAfter"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alreadyInLibrary": {
        +        "const": true,
        +        "description": "The brand's library already held this image, so no new creative was added: the id names that one.",
        +        "type": "boolean"
        +      },
        +      "creditsCharged": {
        +        "type": "number"
        +      },
        +      "creditsRemaining": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "jobId": {
        +        "type": "string"
        +      },
        +      "sourceCreativeId": {
        +        "type": "string"
        +      },
        +      "watchToken": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "jobId",
        +      "watchToken",
        +      "creditsCharged",
        +      "creditsRemaining",
        +      "sourceCreativeId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedremove_competitor1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedrename_creative1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedrequest_image_upload1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedresize_creative6 fields changed
      • changedInput schema / properties / aspectRatios / description
        Previous value: -"Shapes to produce outright, by name or ratio (\"9:16\")."New value: +"Shapes to produce at 2048 px on the long edge, by name or ratio (\"9:16\"). Only when the user names a shape and no platform or size."
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
      • addedInput schema / properties / format
        Added value: +{
        +  "description": "The file type of every canvas: png (the default) or jpeg, a much smaller file with no transparency. Use jpeg when the user asks for it or the platform caps the file size.",
        +  "enum": [
        +    "png",
        +    "jpeg"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / placements / description
        Previous value: -"Platforms to produce every shape for; \"Google Ads\" is google_display, \"Snapchat\" is snapchat_ad (or snapchat for a Story). instagram_feed: Instagram / Facebook feed (1:1 or 4:5); instagram_story: Instagram / Facebook Stories (9:16); instagram_story_ad: Instagram / Facebook Stories ad (9:16); instagram_reels: Instagram Reels (9:16); instagram_reels_ad: Instagram Reels ad (9:16); tiktok_organic: TikTok (organic) (9:16); tiktok_ad: TikTok in-feed ad (9:16); snapchat: Snapchat Story (9:16); snapchat_ad: Snapchat Snap Ad (9:16); linkedin_feed: LinkedIn feed / sponsored (static) (1:1, 4:5 or 1.91:1); linkedin_video: LinkedIn feed (video) (9:16); linkedin_video_ad: LinkedIn sponsored (video) (9:16); google_display: Google Display (responsive) (1:1 or 1.91:1); youtube_instream: YouTube in-stream (16:9); youtube_shorts: YouTube Shorts (9:16); youtube_shorts_ad: YouTube Shorts ad (9:16)."New value: +"Platforms to produce every canvas of, each at its exact size; \"Google Ads\" is google_display, \"Snapchat\" is snapchat_ad (or snapchat for a Story). instagram_feed: Instagram / Facebook feed at 1080x1080, 1080x1350; instagram_story: Instagram / Facebook Stories at 1080x1920; instagram_story_ad: Instagram / Facebook Stories ad at 1080x1920; instagram_reels: Instagram Reels at 1080x1920; instagram_reels_ad: Instagram Reels ad at 1080x1920; tiktok_organic: TikTok (organic) at 1080x1920; tiktok_ad: TikTok in-feed ad at 1080x1920; snapchat: Snapchat Story at 1080x1920; snapchat_ad: Snapchat Snap Ad at 1080x1920; linkedin_feed: LinkedIn feed / sponsored (static) at 1200x1200, 1200x1500, 1200x628; linkedin_video: LinkedIn feed (video) at 1080x1920; linkedin_video_ad: LinkedIn sponsored (video) at 1080x1920; google_display: Google Display (responsive) at 1200x1200, 1200x628; youtube_instream: YouTube in-stream at 1920x1080; youtube_shorts: YouTube Shorts at 1080x1920; youtube_shorts_ad: YouTube Shorts ad at 1080x1920."
      • addedInput schema / properties / sizes
        Added value: +{
        +  "description": "Exact pixel sizes to deliver, when the user names pixels (1080x1920). Each side 100 to 3840 px, at most 3:1 and 8.3 MP.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "height": {
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "width": {
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "width",
        +      "height"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "balanceAfter": {
        -        "type": "number"
        -      },
        -      "breakdown": {
        -        "type": "string"
        -      },
        -      "credits": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "dryRun": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "wouldRefuse": {
        -        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "dryRun",
        -      "credits",
        -      "breakdown",
        -      "balanceAfter"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "creditsCharged": {
        -        "type": "number"
        -      },
        -      "creditsRemaining": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "jobId": {
        -        "type": "string"
        -      },
        -      "sourceCreativeId": {
        -        "type": "string"
        -      },
        -      "targets": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "watchToken": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "jobId",
        -      "watchToken",
        -      "creditsCharged",
        -      "creditsRemaining",
        -      "sourceCreativeId",
        -      "targets"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "balanceAfter": {
        +        "type": "number"
        +      },
        +      "breakdown": {
        +        "type": "string"
        +      },
        +      "credits": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "dryRun": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "wouldRefuse": {
        +        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "dryRun",
        +      "credits",
        +      "breakdown",
        +      "balanceAfter"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alreadyInLibrary": {
        +        "const": true,
        +        "description": "The brand's library already held this image, so no new creative was added: the id names that one.",
        +        "type": "boolean"
        +      },
        +      "creditsCharged": {
        +        "type": "number"
        +      },
        +      "creditsRemaining": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "jobId": {
        +        "type": "string"
        +      },
        +      "sourceCreativeId": {
        +        "type": "string"
        +      },
        +      "targets": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "watchToken": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "jobId",
        +      "watchToken",
        +      "creditsCharged",
        +      "creditsRemaining",
        +      "sourceCreativeId",
        +      "targets"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedsearch_library1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedset_creative_favorite1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedsharpen_creative2 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "balanceAfter": {
        -        "type": "number"
        -      },
        -      "breakdown": {
        -        "type": "string"
        -      },
        -      "credits": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "dryRun": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "wouldRefuse": {
        -        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "dryRun",
        -      "credits",
        -      "breakdown",
        -      "balanceAfter"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "creditsCharged": {
        -        "type": "number"
        -      },
        -      "creditsRemaining": {
        -        "type": "number"
        -      },
        -      "deduplicated": {
        -        "const": true,
        -        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        -        "type": "boolean"
        -      },
        -      "jobId": {
        -        "type": "string"
        -      },
        -      "sourceCreativeId": {
        -        "type": "string"
        -      },
        -      "watchToken": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "jobId",
        -      "watchToken",
        -      "creditsCharged",
        -      "creditsRemaining",
        -      "sourceCreativeId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "balanceAfter": {
        +        "type": "number"
        +      },
        +      "breakdown": {
        +        "type": "string"
        +      },
        +      "credits": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "dryRun": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "wouldRefuse": {
        +        "description": "Set when the organization's MCP spending controls would refuse the real call: the refusal it would get.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "dryRun",
        +      "credits",
        +      "breakdown",
        +      "balanceAfter"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alreadyInLibrary": {
        +        "const": true,
        +        "description": "The brand's library already held this image, so no new creative was added: the id names that one.",
        +        "type": "boolean"
        +      },
        +      "creditsCharged": {
        +        "type": "number"
        +      },
        +      "creditsRemaining": {
        +        "type": "number"
        +      },
        +      "deduplicated": {
        +        "const": true,
        +        "description": "The same call was made in the last 2 minutes: this is its result, not charged again.",
        +        "type": "boolean"
        +      },
        +      "jobId": {
        +        "type": "string"
        +      },
        +      "sourceCreativeId": {
        +        "type": "string"
        +      },
        +      "watchToken": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "jobId",
        +      "watchToken",
        +      "creditsCharged",
        +      "creditsRemaining",
        +      "sourceCreativeId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedshow_creatives2 fields changed
      • addedOutput schema / properties / media
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "kind": {
        +        "enum": [
        +          "image",
        +          "video"
        +        ],
        +        "type": "string"
        +      },
        +      "mimeType": {
        +        "type": "string"
        +      },
        +      "previewUrl": {
        +        "description": "A small WebP of it to look at; url is the full size to hand over.",
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "url",
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "creatives"
        -]New value: +[
        +  "creatives",
        +  "media"
        +]
    • Changedsubmit_publication1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedtag_creative1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedupdate_calendar_event1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedupload_image_file1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
    • Changedwait_for_jobs3 fields changed
      • changedInput schema / properties / brandId / description
        Previous value: -"Optional: the brand it belongs to. Read from the id when omitted."New value: +"Optional: the brand it belongs to, by id or name. Read from the id when omitted."
      • changedInput schema / properties / jobIds / description
        Previous value: -"The jobIds the generation tools returned (generate_design returns one per concept)."New value: +"The jobIds the generation tools returned (generate_design returns one per concept, generate_image one per entry in images)."
      • addedOutput schema / properties / media / items / properties / previewUrl
        Added value: +{
        +  "description": "A small WebP of it to look at; url is the full size to hand over.",
        +  "type": "string"
        +}
    • Changedwrite_caption1 field changed
      • changedInput schema / properties / brandId / description
        Previous value: -"A brand id from get_workspace or list_brands. Omit it when the organization has a single brand."New value: +"A brand id from get_workspace or list_brands, or the brand's name. Omit it when the organization has a single brand."
  6. 2 tool updates
    • Changedgenerate_design1 field changed
      • changedInput schema / properties / audienceId / description
        Previous value: -"An audience id from list_audiences; the designs then read that audience's markets, voice and photography."New value: +"An audience id from list_audiences; the designs then read that audience's age, gender, language, markets, voice and photography."
    • Changedlist_audiences3 fields changed
      • addedOutput schema / properties / audiences / items / properties / ageRange
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "max": {
        +      "type": "number"
        +    },
        +    "min": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / audiences / items / properties / gender
        Added value: +{
        +  "enum": [
        +    "women",
        +    "men"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / audiences / items / properties / language
        Added value: +{
        +  "description": "The language the audience reads, e.g. 'Arabic'.",
        +  "type": "string"
        +}
  7. 52 tool updates
    • First observedadapt_design
    • First observedadd_competitor
    • First observedcancel_publication
    • First observedcreate_calendar_event
    • First observeddelete_calendar_event
    • First observededit_creative
    • First observedgenerate_design
    • First observedgenerate_image
    • First observedget_brand
    • First observedget_brand_analysis
    • First observedget_competitor_analyses
    • First observedget_competitor_audience
    • First observedget_competitor_creative_mix
    • First observedget_compliance
    • First observedget_creative
    • First observedget_creative_insights
    • First observedget_credit_status
    • First observedget_job
    • First observedget_performance_overview
    • First observedget_tiktok_draft
    • First observedget_upload
    • First observedget_workspace
    • First observedlist_audiences
    • First observedlist_brands
    • First observedlist_calendar_events
    • First observedlist_competitor_ads
    • First observedlist_competitors
    • First observedlist_creatives
    • First observedlist_design_systems
    • First observedlist_entities
    • First observedlist_integrations
    • First observedlist_publications
    • First observedlist_recent_posts
    • First observedlist_signals
    • First observedprepare_tiktok_post
    • First observedremove_background
    • First observedremove_competitor
    • First observedrename_creative
    • First observedrequest_image_upload
    • First observedresize_creative
    • First observedsearch_library
    • First observedset_creative_favorite
    • First observedsharpen_creative
    • First observedshow_creatives
    • First observedsubmit_publication
    • First observedsubmit_tiktok_post
    • First observedtag_creative
    • First observedupdate_calendar_event
    • First observedupload_image_file
    • First observedwait_for_jobs
    • First observedwatch_jobs
    • First observedwrite_caption

Publisher details

Operator
Rawa AI Limited · Publisher source
Operator website
https://rawa.ai
Vendor relationship
First-party
Documentation
https://rawa.ai/mcp
Trust center
Not available
Restrictions
Not available

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Remote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    23 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources