Skip to main content
Glama

Server Details

AI ad studio: competitor ad research, video + image ads, social publishing, campaigns. 262 tools.

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
hermoso-ai/hermoso
GitHub Stars
0
Server Listing
Hermoso

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.6/5 across 208 of 248 tools scored. Lowest: 3.7/5.

Server CoherenceB
Disambiguation4/5

The vast majority of tools are clearly distinguished by platform prefixes (google_ads_, meta_, linkedin_ads_, reddit_ads_, etc.) and by distinct actions (create, list, set, delete). The handful of overlapping tools, such as search_threads vs. search_threads_keyword and the multiple research tools (research_ads, pull_competitor_ads, competitor_teardown), are described well enough that an agent can select correctly, but a few near-duplicates create minor ambiguity.

Naming Consistency4/5

The dominant naming convention is consistent: verb_noun with platform prefixes (create_google_ads_campaign, list_meta_ads, set_reddit_ads_status, post_to_x), and the ad-platform tools follow a clear pattern. Deviations exist, such as google_ads_keyword_ideas (missing verb), make_template_ad vs. generate_image, and report tools named as platform_report instead of get_platform_report, but these are minor and don't obscure the overall structure.

Tool Count1/5

At 248 tools, this is an extreme count, far exceeding the 50+ threshold that indicates a lack of focus. While the server aims to cover a broad multi-platform advertising and content-creation domain, the sheer number makes it unwieldy for an agent to discover and select the right tool, and many tools could be consolidated or hidden behind higher-level workflows.

Completeness4/5

For its stated purpose as a cross-platform ad creative and publishing suite, the tool surface is remarkably complete: it covers campaign/ad-group/ad lifecycle for seven ad platforms, organic posting to eight social channels, content generation and editing, research, reporting, brand management, scheduling, and billing. Minor gaps exist, such as the lack of update-targeting tools for Google and Microsoft Ads after creation, no TikTok or X advertising support, and no email marketing, but these are acceptable given the explicit platform scope.

Available Tools

344 tools
add_google_ads_assetsAdd sitelinks / callouts / structured snippets to a Google Ads campaignAInspect

Add SITELINKS, CALLOUTS or STRUCTURED SNIPPETS to a Google Ads campaign or ad group — and ATTACH them, which is the part that makes them do anything (an asset sitting in the account library shows nothing at all). Sitelinks are the highest-CTR free win on Search: extra links under the ad, each with its own landing page. Pass assetType plus assets[]: SITELINK needs {linkText (≤25 chars), finalUrl, and optionally description1 / description2}; CALLOUT needs {calloutText (≤25)}; STRUCTURED_SNIPPET needs {header, values[] — at least 3}. Or link assets that already exist with assetResourceNames[]. Assets and links go up in ONE atomic operation, so a rejected link never strands an orphan asset, and the links are READ BACK from Google before you are told they exist. Attaching a live asset to a LIVE (ENABLED) campaign changes what that ad shows on the very next auction — show the user what would appear, get an explicit yes, then pass confirm:true. On a paused campaign it never needs confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNowhere to attach it — default campaign
assetsNothe assets to CREATE and attach
dryRunNovalidate against Google and create NOTHING
statusNothe LINK status — default ENABLED
confirmNoset true ONLY after the user approved changing what a LIVE campaign shows
adGroupIdNoad group id (level:"adGroup")
assetTypeYeswhat kind of asset to create and attach
campaignIdNocampaign id (level:"campaign")
customerIdNo10-digit account id (dashes ok) — omit to use the brand’s selected default account
loginCustomerIdNomanager id if operating through an MCC
assetResourceNamesNoattach assets that ALREADY exist instead of creating new ones

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
linkedNo
createdNo
fieldTypeNo
Behavior5/5

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

Annotations declare mutating and non-idempotent, and the description adds crucial behavior: atomic operation, read-back from Google before reporting success, effect on next auction for live campaigns, and required user confirmation. This goes far beyond annotations.

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

Conciseness4/5

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

The description is longer than ideal but each section earns its place, covering asset types, required fields, and operational caveats. It is front-loaded with the action. Slightly verbose but efficient for a tool with 11 parameters.

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, the description covers all necessary operational context: atomicity, read-back, confirmation workflow, and behavior on live vs paused campaigns. Output schema exists, so return values need not be explained. Complete for an agent to select and invoke correctly.

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

Parameters5/5

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

Schema covers 100% of parameters, but description enriches them: specifies character limits for linkText/calloutText, minimum 3 values for snippets, and explains that assets[] is the creation path while assetResourceNames is the attach-existing path. It also clarifies the confirm parameter's purpose, which is not evident from schema 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?

The description clearly states the tool adds SITELINKS, CALLOUTS, or STRUCTURED SNIPPETS to a Google Ads campaign or ad group and attaches them. It distinguishes from sibling tools like upload_google_ads_asset by emphasizing that attachment is what makes assets functional.

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

Usage Guidelines4/5

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

Provides clear guidance on when to use: pass assetType plus assets[] for new assets, or assetResourceNames for existing ones. It also details confirmation requirements for live campaigns vs paused. However, it does not explicitly name alternative tools like upload_google_ads_asset, so it loses a point for not stating exclusionary guidance.

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

add_google_ads_keywordsAdd Google Ads keywordsAInspect

Add keywords — and NEGATIVE keywords — to a Google Ads ad group. A Search ad group with no keywords never shows. Each keyword takes text (≤80 chars, ≤10 words) and matchType EXACT | PHRASE | BROAD (default PHRASE). Set negative:true to BLOCK a term instead of targeting it, which is the cheapest way to stop wasted spend. Read back from Google before you are told they exist. If the parent campaign and ad group are already LIVE, a positive keyword starts bidding real money at once — get an explicit yes and pass confirm:true, or add it with paused:true. Negative keywords only restrict spend and never need confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNo
confirmNoset true ONLY after the user explicitly approved starting spend — required when the parent campaign is already LIVE (ENABLED) and this object would serve immediately
keywordsYesthe keywords to add
adGroupIdYesthe ad group to add them to
customerIdNoomit to use the brand’s selected default account
loginCustomerIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
countNo
adGroupIdNo
Behavior5/5

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

The description is rich with behavioral disclosures beyond the annotations: it warns that live campaigns start spending real money immediately, explains the confirm:true requirement, offers paused:true as a safe alternative, and clarifies that negative keywords never need confirmation. It also notes to 'Read back from Google before you are told they exist,' which is crucial post-condition behavior. The annotations provide no behavioral details, so the description fully carries this burden.

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 efficiently structured, front-loading the primary action and then layering constraints and warnings. Every sentence serves a purpose—no fluff. It packs critical safety information into a compact paragraph.

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 (spending money, confirmation safeguards, negative keywords), the description covers all essential safety and behavioral aspects. The output schema exists, so return format explanation is unnecessary. The description is complete enough for an agent to select and invoke this tool correctly.

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 description adds meaningful semantics beyond the schema: explains text constraints (≤80 chars, ≤10 words), matchType default, negative:true behavior, and the confirm flag's purpose. However, it doesn't cover dryRun, customerId, or loginCustomerId, despite schema coverage being only 67%. The added value is strong for the core keyword parameters but not comprehensive.

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 specific verb and resource: 'Add keywords — and NEGATIVE keywords — to a Google Ads ad group.' This clearly distinguishes it from sibling tools like add_microsoft_ads_keywords and add_google_ads_assets. It also states the core purpose in a way that leaves no ambiguity.

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 provides strong contextual guidance: 'A Search ad group with no keywords never shows' explains why you'd use this tool. It gives explicit conditions for when to use confirm:true vs paused:true, and distinguishes positive from negative keyword usage. However, it does not explicitly name alternative tools or say when not to use this tool, so it stops short of a 5.

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

add_microsoft_ads_keywordsAdd Microsoft Advertising keywordsAInspect

Add keywords to a Microsoft Advertising ad group. Match types are Exact, Phrase and Broad — Microsoft has no broad-match-modifier. Keywords are added Paused unless you set status:"Active"; an Active keyword on a live ad group makes the campaign bid on a new term immediately, so that needs confirm:true. Note that per-keyword bids are honoured but ad-group / keyword BID STRATEGIES are silently ignored by Microsoft — they inherit the campaign’s. Only the keywords Microsoft confirms on the read-back are reported as added.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true to add an Active keyword to a LIVE ad group
keywordsYesthe keywords
accountIdNoMicrosoft ad account id — omit to use the brand’s single shared account
adGroupIdYesthe ad group to add them to

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
addedNo
countNo
adGroupIdNo
Behavior5/5

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

The description goes far beyond the annotations, which already indicate a mutating, externally visible operation. It discloses critical behavioral traits: default status is Paused unless Active is set, Active keywords on live ad groups require confirm:true, bid strategies are silently ignored and inherit the campaign's, and only confirmed keywords are reported. This gives the agent a thorough understanding of side effects and expectations, making it exceptional.

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 four sentences, each serving a distinct purpose: purpose, match types, status/confirm, and bids/reporting. It is front-loaded with the core action, contains no filler, and packs essential information efficiently. Given the tool's complexity, this is appropriately sized and well-structured.

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?

The description is remarkably complete for a tool with 4 parameters and an output schema. It covers the key operational details: match types, default status, the confirm requirement, bid strategy behavior, and reporting semantics. Since an output schema exists, return values are not needed in the description. The description addresses all likely pitfalls an agent might encounter, making it fully sufficient.

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 input schema has 100% description coverage for all parameters, so the baseline is 3. The description adds extra meaning by explaining why confirm:true is necessary and that bid strategies are ignored (affecting the bid parameter). It also clarifies the match type options, but these are already in the schema. The additional context about reporting only confirmed keywords provides semantic value beyond the schema, justifying a 4.

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 specific verb+resource statement: "Add keywords to a Microsoft Advertising ad group." This precisely identifies the operation and distinguishes it from sibling tools like create_microsoft_ads_ad_group or add_google_ads_keywords. The rest of the description clarifies scope and constraints, leaving no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool (adding keywords to a Microsoft ad group) and includes Microsoft-specific nuances (match types, no broad-match-modifier, bid strategy inheritance) that an agent must know. However, it does not explicitly name alternatives (e.g., add_google_ads_keywords) or state when not to use it. Since the sibling list includes similar tools, an explicit exclusion would strengthen this, but the context is sufficiently clear for a 4.

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

add_x_ads_targetingTarget an X ads line itemAInspect

Add targeting criteria to an X LINE ITEM. Targeting does NOT attach to a campaign on X — a campaign carries only budget and funding. Pass locationIds resolved with x_ads_geo_search, and/or criteria[] for any of X's other 37 targeting vocabularies when you already hold the ids. X takes ONE criterion per API call, so a set is several calls: each is reported individually, a partial failure NAMES what did not apply, and the line item's FULL targeting is read back afterwards so the answer is what the line item carries rather than what was sent. Adds no spend — the line item stays PAUSED.

ParametersJSON Schema
NameRequiredDescriptionDefault
criteriaNo[{targetingType, targetingValue, operatorType?}] — operatorType defaults to EQ
accountIdYes
lineItemIdYes
locationIdsNoopaque ids from x_ads_geo_search

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
failedNo
appliedNo
accountIdNo
lineItemIdNo
targetingOnLineItemNo
Behavior5/5

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

With only an openWorldHint annotation, the description carries the burden of behavioral disclosure and exceeds expectations. It reveals critical behaviors: one criterion per API call, individual reporting of each call, partial failures naming unapplied criteria, reading back the line item's full targeting after the operation, and the line item remaining PAUSED. These details provide valuable context beyond the annotation.

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

Conciseness5/5

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

The description is concise yet dense, with each sentence providing essential information: the core action, the campaign/line-item distinction, parameter usage, batching semantics, error reporting, response behavior, and spend safety. It is front-loaded with the primary purpose and avoids unnecessary fluff.

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?

Despite a vague openWorldHint annotation, the description covers all key aspects needed to use the tool correctly: where targeting applies, how to specify locations and criteria, per-call limits, failure naming, the final state read-back, and that the line item remains paused. With an output schema present, return values are already documented, so the description is complete for the tool's complexity.

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

Parameters4/5

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

Schema description coverage is 50%, with accountId and lineItemId lacking descriptions. The description compensates by explaining that locationIds must come from x_ads_geo_search and that criteria[] covers X's 37 targeting vocabularies. While accountId and lineItemId are not elaborated, their names are self-explanatory and they are required parameters, so the added semantics are sufficient.

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

Purpose5/5

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

The description clearly states the tool adds targeting criteria to an X line item, using a specific verb ('Add') and resource ('targeting criteria', 'X LINE ITEM'). It also distinguishes from siblings by noting targeting does not attach to campaigns, which differentiates this from create_x_ads_campaign and set_x_ads_status.

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 provides clear context on when to use the tool, including how to obtain locationIds via x_ads_geo_search, the need to hold IDs for other targeting vocabularies, and the one-criterion-per-call behavior. It also clarifies exclusions (no campaign attachment, no spend). However, it does not explicitly name alternative tools for modifying targeting, so it stops short of full when-not/alternatives guidance.

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

analyze_videoAnalyze videoA
Read-only
Inspect

Break a video ad down into its structure: the verbatim transcript (voiceover + on-screen text) with a beat list, plus duration and sampled frame timestamps. Use to study a reference/competitor ad before remixing its structure. Costs ~a transcription call; no ScrapeCreators credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesthe video URL (a served /generated/ path or a public http(s) video)

Output Schema

ParametersJSON Schema
NameRequiredDescription
frameTimesNotimestamps (seconds) of the sampled frames
transcriptNoverbatim voiceover + on-screen text with a beat list (null when silent/unreachable)
durationSecondsNothe video length in seconds
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only nature is covered. The description adds value beyond annotations by disclosing the cost behavior (transcription call) and the type of outputs (transcript, beat list, timestamps). This is useful context without contradicting 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?

The description is two sentences, front-loaded with the core purpose and deliverables, followed by usage and cost. Every sentence earns its place, with no unnecessary repetition or 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?

Even though an output schema exists, the description still summarizes key return contents (transcript, beat list, duration, timestamps) and provides cost/use-case context. With one parameter, clear annotations, and this description, the agent has enough to select and invoke accurately.

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?

The schema already provides full coverage with a detailed description of the single parameter: 'the video URL (a served /generated/ path or a public http(s) video).' The tool description does not add meaning beyond that, so the baseline of 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 clearly states the tool's function: 'Break a video ad down into its structure' with specific outputs (verbatim transcript, beat list, duration, sampled frame timestamps). It distinguishes itself from siblings like pull_competitor_ads or competitor_teardown by focusing on structural analysis of a single video ad, not on pulling or broader teardown.

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 provides a use case: 'Use to study a reference/competitor ad before remixing its structure.' It also gives a cost signal ('Costs ~a transcription call; no ScrapeCreators credits') which helps with tool selection. However, it does not explicitly mention alternatives or when not to use, so a small gap remains.

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

answer_google_business_questionAnswer a question on a Google Business listingA
DestructiveIdempotent
Inspect

Post the business’s answer to a public question on the brand’s Google Business Profile listing, or delete the answer already there. THIS IS AN UPSERT — one answer per account, so answering again REPLACES the previous one rather than adding a second. Deleting is public and immediate and is confirm-gated. Needs Google Business Profile connected and the project approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNothe answer — required unless deleting
deleteNo
confirmNorequired for delete:true
locationIdNo
questionIdYesfrom list_google_business_questions

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
deletedNo
questionIdNo
Behavior5/5

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

Annotations already indicate destructive and idempotent behavior, but the description adds crucial context: answering replaces the prior answer, deletion is public and immediate, and confirmation is required. This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

Three sentences with no filler. The key action is front-loaded, and critical warnings (UPSERT, confirm-gated) are emphasized clearly and concisely.

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 prerequisites, upsert behavior, deletion implications, and confirmation requirements. Since an output schema exists, return values need not be described. The description provides all necessary operational context for a mutation 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?

The description reinforces that 'text' is the answer content and explains the delete mode with confirmation gating. However, with 60% schema coverage, the locationId parameter remains unexplained, though the upsert behavior adds important semantic meaning to the text parameter.

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

Purpose5/5

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

The description clearly states the tool posts or deletes an answer to a public question on a Google Business Profile listing. It specifies the exact resource and action, distinguishing it from siblings like post_to_google_business or reply_to_google_business_review.

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

Usage Guidelines4/5

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

Provides clear context including prerequisites (Google Business Profile connected, project approved) and important behavior (upsert replaces previous answer, deletion is public and confirm-gated). It does not explicitly name alternative tools, but the guidance is sufficient for proper usage.

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

append_to_docAppend text to a Google DocAInspect

Append text to the end of a Google Doc Hermoso can reach — one it created (pass the documentId from create_doc) or one the user handed over with the Google file picker in the app (find its id with list_drive_files).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYestext to append at the end of the doc
documentIdYesthe document id from create_doc

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
documentIdNo
Behavior4/5

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

The description adds value beyond annotations by clarifying that it appends to the end and limiting reachable docs to those Hermoso created or the user shared. Annotations already indicate readOnly=false and idempotent=false, aligning with the action; no contradiction.

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

Conciseness5/5

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

The description is a single, well-structured sentence that includes the action, target scope, and ID sourcing guidance with no redundant content. It is appropriately concise for a simple tool.

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 2-parameter append tool with an output schema and informative annotations, the description fully covers the action, eligible documents, and ID retrieval. No significant gaps remain for an agent to use it correctly.

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 schema covers both parameters at 100%, but the description adds meaning by noting that documentId can come from list_drive_files in addition to create_doc. This extra context helps agents select the correct parameter value.

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 starts with a specific action ('Append text to the end of a Google Doc') and clearly defines the resource and scope. It distinguishes this tool from siblings like create_doc and read_doc by specifying append-to-end behavior and which docs are accessible.

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 context on valid target documents (created by Hermoso or user-shared via file picker) and how to source the documentId (from create_doc or list_drive_files). It does not explicitly list when not to use it, but the action is unambiguous.

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

append_to_sheetAppend rows to a Google SheetAInspect

Append rows to a Google Sheet Hermoso can reach — one it created (pass the spreadsheetId from create_sheet) or one the user handed over with the Google file picker in the app (find its id with list_drive_files). rows = array of row arrays.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsYesrows to append — array of row arrays
rangeNorange to append at (default A1 / first sheet)
spreadsheetIdYesthe spreadsheet id from create_sheet

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
appendedNo
updatedRangeNo
spreadsheetIdNo
Behavior4/5

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

With readOnlyHint=false and destructiveHint=false, the description adds access context (which sheets are reachable) and how to reference user-provided sheets via the file picker. 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.

Conciseness5/5

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

Two sentences, front-loaded with purpose, no fluff. Every sentence earns its place.

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?

A simple 3-param tool with output schema; the description covers purpose, access, and parameter sources, making it complete for the agent.

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 descriptions cover 100% of parameters, but the description expands spreadsheetId beyond the schema's narrow 'from create_sheet' by mentioning list_drive_files and user-handled files, adding meaning.

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 specific verb+resource ('Append rows to a Google Sheet') and clarifies the scope ('Hermoso can reach'), distinguishing it from append_to_doc (docs) and read_sheet. It is specific and unambiguous.

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 provides clear context: to append rows to a Google Sheet, and explains how to obtain the spreadsheetId (from create_sheet or list_drive_files). It doesn't explicitly exclude alternatives but the context is adequate.

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

backfill_postsImport a channel’s past postsA
Idempotent
Inspect

Import this brand's PAST posts from a channel into the performance record, so 'which hook works' can draw on history rather than only on what was published since Hermoso started recording. Supports facebook, instagram, threads, youtube, tiktok and pinterest; the others say plainly why they cannot (LinkedIn and Reddit have no enumerate-my-posts endpoint on our grant, and X bills per read so it is excluded from bulk import). BOUNDED, RESUMABLE AND QUOTED: it runs as a DRY RUN by default and tells you how many posts it found and what reading them will cost — pass confirm:true to import, and pass the returned cursor to continue. AN IMPORTED POST IS WEAKER EVIDENCE THAN A RECORDED ONE and is labelled 'backfilled': its hook is recovered ONLY where the post matches a Hermoso creation by asset or caption. A post made outside Hermoso stays UNATTRIBUTED — it counts toward channel and format totals but never votes on which hook works. Never guess a hook from a caption. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many posts this page (default 50, max 200)
cursorNoresume from a previous run
channelYeswhich channel to import from
confirmNoactually import — omit for a dry run that only quotes the cost
accountRefNowhich Page / account, when the brand has more than one

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
quoteNo
cursorNo
dryRunNo
channelNo
matchedNo
importedNo
wouldImportNo
unattributedNo
Behavior5/5

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

The description goes far beyond annotations by disclosing the dry-run default, confirm:true requirement, resumable cursor behavior, cost quoting, and the crucial caveat that imported posts are weaker evidence and never guessed by caption. This fully complements the annotations (readOnly false, idempotent true, etc.) without contradiction.

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

Conciseness4/5

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

The description is dense and front-loaded with purpose, but it is lengthy and uses CAPS for emphasis. Every sentence carries substantive information (channels, dry-run behavior, evidence limitations), so it earns its length. Minor verbosity (e.g., 'Free.' at the end) keeps it from a 5.

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 moderate-high complexity (multi-channel support, dry-run vs. confirmed import, resumability, evidence semantics) and the presence of an output schema, the description covers all essential behavioral context: what it does, how to invoke it, why some channels are unsupported, and the interpretive rules for imported data. It is complete for an agent to use correctly.

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 adds meaningful context for key parameters: confirm triggers the actual import, cursor resumes a prior run, and the channel list is expanded with supported platforms. This enriches the schema without redundant restating.

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 specific verb+resource: 'Import this brand's PAST posts from a channel into the performance record.' It clearly distinguishes this from sibling listing/posting tools by stating the goal ('which hook works' can draw on history) and explicitly listing supported channels.

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 establishes the context for use ('draw on history') and explains why certain channels are excluded (LinkedIn/Reddit lack endpoints on the grant, X costs per read). However, it does not explicitly contrast with alternatives like list_meta_posts or state when NOT to use it, so it's 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.

billing_statusBilling statusA
Read-only
Inspect

Show this account's billing at a glance: current plan (id + label + monthly price), credit balance, whether auto-reload is on, whether a card is on file, and whether YOU (this key) have ADMIN rights to change billing. Read-only, free. Call it before upgrade_plan / set_auto_reload to know what's possible — members have read-only billing. IN A SHARED TEAM WORKSPACE A MEMBER SEES THE PLAN AND THE BALANCE ONLY: the workspace owner's payment card and auto-reload belong to them and are not reported (billingScope:'member'). Never tell a member there is no card on file — the honest answer is that you cannot see it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardNothe saved card ({brand, last4}) when present AND you are allowed to see it
planNothe current plan ({id, label, monthlyUsd})
roleNothis key’s billing role (admin/member)
isAdminNowhether this key can change billing
autoReloadNoauto-reload config ({enabled, thresholdCredits, reloadCredits, available}); {withheld:true} for a member of a shared workspace
billingNoteNowhy those fields are absent
billingScopeNo'full', or 'member' when the payment instrument is deliberately withheld
balanceCreditsNothe current credit balance
billingWithheldNothe fields withheld because they belong to the workspace owner
paymentMethodOnFileNowhether a card is saved for one-click charges; NULL means withheld (you are a member of someone else’s workspace), which is NOT the same as false
Behavior5/5

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

Beyond readOnlyHint=true, the description discloses that member-scoped responses omit the owner's card and auto-reload, and explains the billingScope:'member' behavior. It also warns against false conclusions, adding critical non-obvious behavior.

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 front-loaded with the core purpose and then adds only essential usage warnings and member-specific caveats. No filler; every sentence earns its place.

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 still adds necessary operational context: pricing, membership visibility limitations, and pre-call positioning. It covers both normal and edge-case usage, making it self-sufficient for an agent.

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

Parameters5/5

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

Tool has zero parameters; the description is the sole source of semantics. It thoroughly describes the response contents (plan id/label/price, balance, auto-reload, card presence, admin rights), fully compensating for the empty input 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?

Description clearly states it 'Show this account's billing at a glance' and enumerates specific fields (plan, balance, auto-reload, card, admin rights). It distinguishes from siblings by positioning as a read-only pre-check for upgrade_plan/set_auto_reload.

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 instructs 'Call it before upgrade_plan / set_auto_reload to know what's possible' and clarifies that members have read-only billing, plus a specific command 'Never tell a member there is no card on file'. This is precise when-to-use guidance.

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

buy_creditsBuy creditsAInspect

Out of credits? Top up with a credit PACK. Call with no argument to list the available packs (id · credits · price). If the account has a saved card and you have billing-admin rights, calling with pack quotes the exact charge and calling again with confirm:true AND the quote's quote_token charges the saved card instantly (same one-click top-up as the app — no redirect). If there's no saved card yet, you get a Stripe checkout URL to hand your human for the FIRST purchase; their card saves for one-click after that. Packs only; subscriptions are managed by a person in Settings → Billing. To stop running out entirely, turn on auto-reload with set_auto_reload (admin) — low balances then top themselves up from the saved card automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
packNothe pack id to buy (e.g. pack-2k) — omit to list the available packs first
confirmNoset true to actually charge the saved card for `pack` (required for the one-click charge; ignored on the checkout-link path)
quote_tokenNothe quoteToken returned by the quote step — REQUIRED (with confirm:true) to charge; it binds the exact pack + price you quoted (10-minute validity) and makes a retried confirm idempotent

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNotrue when a one-click top-up charge succeeded
urlNoStripe checkout URL for a first purchase (no saved card yet)
packsNoavailable credit packs ({id, credits, priceUsd}) when listing
quoteNothe one-click charge quote ({packId, credits, priceUsd, card}) awaiting confirm:true
packIdNothe pack id the checkout link buys
creditsNocredits added by a completed top-up (or bought by the checkout link)
amountUsdNoUSD amount of the checkout link
Behavior5/5

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

Beyond the annotations (readOnlyHint:false, openWorldHint:true), the description discloses the mutating nature of the tool: it charges a saved card, creates a Stripe checkout URL for first purchases, and requires billing-admin rights. It also reveals the quote_token's 10-minute validity, the idempotency of retried confirms, and the one-click top-up behavior (no redirect). This is rich behavioral context that the annotations alone do not provide.

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

Conciseness5/5

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

The description is longer than typical, but every sentence adds operational value: the trigger, the list/quote/confirm flow, the no-saved-card variant, the pack-only restriction, and the auto-reload alternative. It is front-loaded with the main purpose and flows logically from simple to complex scenarios, with no redundant or filler 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?

Given the tool's multi-step nature and the presence of an output schema, the description is remarkably complete. It covers all paths (with/without saved card), prerequisites (billing-admin rights), the exact token requirement, the 10-minute validity, and the distinction from subscriptions and auto-reload. There are no significant gaps for an agent to get stuck on.

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

Parameters5/5

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

Although the schema already describes all three parameters comprehensively (100% coverage), the tool description adds crucial sequencing: omit `pack` to list, use `pack` to get a quote, and use `confirm:true` with `quote_token` to execute the charge. It explains how the parameters interact, which is essential for correct invocation and goes beyond the schema descriptions.

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 uses the specific verb 'buy' and resource 'credits,' and goes further to explain the full scope: listing packs (no args), quoting a pack, and confirming the charge. It explicitly contrasts with subscriptions and set_auto_reload, clearly distinguishing it from sibling tools like upgrade_plan and set_auto_reload.

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?

The description opens with 'Out of credits?' as a clear trigger, then outlines step-by-step when to call with no argument, with `pack`, and with `confirm:true` + `quote_token`. It explicitly warns that subscriptions are managed by a person in Settings → Billing and recommends set_auto_reload as an alternative, giving clear when-to-use vs. when-not-to-use guidance.

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

cancel_scheduledCancel a scheduled postA
DestructiveIdempotent
Inspect

Remove a queued post before it goes out. Get the id from list_scheduled. Only works while it is still queued — something already published cannot be unsent (use manage_meta_post to delete a Facebook/Instagram post after the fact).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe scheduled post id from list_scheduled

Output Schema

ParametersJSON Schema
NameRequiredDescription
cancelledNo
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the destructive nature is known. The description adds the crucial constraint that cancellation only works while queued and clarifies irreversibility for published posts, which is valuable beyond the annotations.

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

Conciseness5/5

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

Two sentences, front-loaded with the primary action, then essential context about id source and limitations. Every sentence serves a purpose with no redundancy.

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?

The tool is simple with one parameter and an output schema. The description covers purpose, source of the id, the queued-only restriction, and the fallback for published posts. Combined with annotations, the description is fully self-sufficient.

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?

The schema covers the single parameter 'id' with a description referencing list_scheduled, and the description reinforces this. Since schema coverage is 100%, the description adds no new parameter semantics beyond restating the source, but it does not need to compensate.

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

Purpose5/5

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

The description clearly states the action (Remove a queued post) and the resource (a queued post before it goes out). It explicitly distinguishes this tool from siblings by sourcing the id from list_scheduled and pointing to manage_meta_post for already published posts.

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 provides explicit when-to-use ('while it is still queued') and when-not-to-use scenarios ('already published'), plus the alternative tool (manage_meta_post). The id source (list_scheduled) is specified, giving clear instructions for invocation.

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

change_voiceChange narrator voiceAInspect

Swap the narration of a finished video into a different voice — keeps the performance, lip-sync, and background sound. Use when the user likes the video but wants a different narrator voice; use dub_video only for language translation. Paid; returns the served URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
videoYesthe source video URL
voiceNotarget narrator voice preset name, e.g. 'Aria', 'George', 'Rachel', 'Sarah', 'Brian', 'Charlotte' (defaults to a warm female read)

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior4/5

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

Annotations are all false (not read-only, not idempotent, not destructive), so the description carries the transparency burden. It discloses key behavioral traits: preserves performance/lip-sync/background sound, requires payment, and returns a served URL. It could add more about reversibility or original video handling, but the disclosed details are meaningful.

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 pack purpose, usage guidance, alternative tool, cost, and return value with no filler. Front-loaded with the primary action, then supporting details.

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, the description need not explain return values. It covers purpose, when to use, differentiation from a key sibling, cost, and the returned URL. Minor gap: no mention of prerequisites beyond 'finished video', but overall complete for a tool of this complexity.

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% (both video and voice are described). The description adds no additional parameter meaning beyond what the schema provides, though the examples in the schema are adequate. Baseline 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Swap') with a clear resource ('the narration of a finished video') and outcome ('into a different voice'), while also detailing what is preserved (performance, lip-sync, background sound). This distinguishes it from siblings like dub_video and edit_video.

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 states when to use ('when the user likes the video but wants a different narrator voice') and provides a direct alternative ('use dub_video only for language translation'). The cost and return URL are also noted, giving clear operational context.

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

check_ad_policyCheck ad policyA
Read-only
Inspect

Pre-flight ad copy against Meta's REAL, live Advertising Standards before you run it — a flat 1-credit check. Pulls Meta's actual policy pages and returns a verdict (pass / fix / block) where every flagged issue QUOTES Meta's own policy text verbatim plus a compliant rewrite that keeps the sell. It's a check, not an edit — it never changes the creative. Especially worth running for regulated-adjacent categories (health/supplements, weight-loss or beauty results claims, finance/crypto/insurance, alcohol, dating, gambling) or ANY strong/absolute/guaranteed claim.

ParametersJSON Schema
NameRequiredDescriptionDefault
copyYesthe ad copy / script / on-screen text to check
claimsNothe claims / proof points the ad makes
categoryNothe product category — helps pick the relevant policy pages
imageDescriptionNoa description of the creative / image when relevant

Output Schema

ParametersJSON Schema
NameRequiredDescription
anchorsNothe Meta policy pages consulted ({url, …})
summaryNoone-line verdict summary
verdictNopass / fix / block
findingsNoflagged issues ({severity, issue, policy_quote, fix_suggestion, where_in_ad})
Behavior5/5

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

Discloses behavioral details beyond annotations: 'flat 1-credit check,' 'Pulls Meta's actual policy pages' (live data), and the guaranteed output structure with verbatim quotes and compliant rewrites. Consistently reinforces readOnlyHint/destructiveHint without contradicting them.

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

Conciseness5/5

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

Three sentences that are dense but efficient: main purpose, output characteristics, and trigger scenarios. No filler or repetition.

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?

Strong coverage given annotations and output schema: it describes the verdict type, quote guarantee, rewrite behavior, and cost. It doesn't discuss limits or image handling beyond having an imageDescription param, but the schema covers parameter details.

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 baseline is 3. The description adds context around category ('helps pick the relevant policy pages' is already in schema; description reinforces with regulated-adjacent examples) but doesn't provide new parameter-level syntax or semantics.

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 'Pre-flight ad copy against Meta's REAL, live Advertising Standards' — a specific verb, resource, and scope. It distinguishes itself from sibling creation/preview tools by clarifying 'It's a check, not an edit — it never changes the creative' and specifies the verdict format (pass/fix/block).

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

Usage Guidelines4/5

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

Provides clear applicability signals: 'Especially worth running for regulated-adjacent categories... or ANY strong/absolute/guaranteed claim.' Also establishes a when-not boundary with 'not an edit — it never changes the creative,' though it doesn't name alternative tools explicitly.

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

clear_sheet_rangeClear a range in a Google SheetA
DestructiveIdempotent
Inspect

Empty a range of cells in a Google Sheet, leaving the rows themselves in place. DESTRUCTIVE: call it WITHOUT confirm first and nothing is cleared — you get back the real number of filled cells in that exact range. Show the user that number, get an unambiguous yes, then call again with confirm:true AND confirmCells set to it. The echo is not ceremony: it is what catches naming A1:Z1000 when you meant A1:Z10, which is the mistake that actually happens. There is deliberately NO default range. The clear is read back and reported as confirmed only if the range really is empty afterwards. To remove a whole tab instead, use manage_sheet_tabs.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYesthe range to clear, e.g. "A2:D50" or "Sheet1!A2:D50"
confirmNo
sheetUrlNo
confirmCellsNoecho back the filled-cell count the unconfirmed call reported
spreadsheetIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
noteNo
rangeNo
clearedNo
verifiedNo
spreadsheetIdNo
Behavior5/5

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

Annotations already flag destructiveHint and readOnlyHint, but the description goes far beyond by disclosing the no-op first call, the confirmCells echo as a safety mechanism against wrong ranges, deliberately no default range, and the post-clear read-back verification. This adds substantial behavioral context with no contradiction to 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.

Conciseness5/5

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

Every sentence is load-bearing: definition, destructive protocol, safety rationale, no-default warning, and verification/alternative. It is front-loaded with purpose before procedural detail, and the length is appropriate for a destructive tool where caution is essential.

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?

This complex destructive tool is fully specified: the two-phase confirmation sequence, the exact role of confirmCells, the no-default behavior, and the read-back verification. Since an output schema exists, the description does not need to explain return values. It covers the main real-world failure modes (wrong range, premature confirmation) and names an alternative 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 description coverage is only 40% (range and confirmCells have descriptions), so the description must compensate. It adds meaningful semantics for range ('deliberately NO default range'), confirm (must become true only after an unconfirmed call), and confirmCells (must equal the reported filled-cell count). However, it does not clarify sheetUrl/spreadsheetId selection or precedence, leaving a small gap.

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 'Empty a range of cells in a Google Sheet, leaving the rows themselves in place' — a specific verb, resource, and scope. It explicitly distinguishes this from removing a whole tab by pointing to manage_sheet_tabs, so it stands apart from similar sheet 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 a complete when/how-to-use protocol: first call without confirm to get the filled-cell count, show the user, get unambiguous confirmation, then call with confirm:true and confirmCells set to the count. It also names the alternative for whole-tab deletion, providing clear when-not guidance.

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

clip_videoClip a long videoAInspect

Cut ONE long video into several RANKED, ready-to-post short clips (podcast, webinar, interview, conference talk, long ad cut → Reels/Shorts/TikTok). Transcribes the source with timestamps, picks the strongest SELF-CONTAINED moments, then cuts + reframes each with ffmpeg — no video model renders anything, which is why it's fast and cheap. ACCEPTS: (a) a YouTube link (or Vimeo / Loom / Dailymotion / Streamable / Rumble / Wistia / Twitch / TED) — the server pulls the video down itself; (b) a direct https .mp4/.mov/.webm; (c) a Hermoso /generated/ URL (upload_file turns a local file into one). NOT supported: TikTok / Instagram / Facebook links, and anything age-restricted, private, members-only, geo-blocked or still LIVE — those fail fast with the real reason and are fully refunded, so ask for a direct file or an upload rather than retrying. Source must be at least ~15s and under ~600MB; only the first ~40 minutes is analysed (the result reports truncated:true when it hits that). Cost: a ~7-credit hold, settled to the exact transcription + encode cost, plus the clip-selection model's tokens billed as their own small event. RETURNS clips[] — each with its OWN served mp4 URL, title, hook, ready-to-post caption, 0-100 score and source timecode — not a single video.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNohow many clips to cut, 1-8 (default 4)
videoYesthe long video to clip — a YouTube/Vimeo/Loom/Dailymotion/Streamable/Rumble/Wistia/Twitch/TED watch URL, a direct https .mp4/.mov/.webm, or a Hermoso /generated/ URL
aspectRatioNoclip shape — '9:16' (default) vertical for Reels/Shorts/TikTok; 'keep' leaves the source framing untouched

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior5/5

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

With all annotations false (no read-only, idempotence, or destructive hints), the description carries the full burden and does so excellently. It discloses the internal process (transcription, timestamping, ffmpeg cutting, no rendering), the cost model (7-credit hold, transcription/encode costs, model tokens), failure behavior (fails fast, fully refunded), and return format (clips[] with URLs, captions, scores). This is far more transparent than annotations alone would provide.

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 well-structured with clear ACCEPTS, NOT supported, cost, and RETURNS sections. It is front-loaded with the core purpose. While some redundancy with the schema exists (e.g., URL types), the additional detail on constraints and behavior earns most sentences their place. It is appropriately sized for the tool's complexity, though not as minimal as a two-sentence ideal.

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?

Given the tool's complexity and the presence of an output schema, the description covers inputs, constraints, cost, failure handling, and return shape. It even highlights the truncated:true edge case. It does not explicitly state whether the operation is synchronous or estimate runtime, but the mention of 'RETURNS' and cost settle suggests immediate results, making it sufficiently complete for agent selection.

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 schema already provides 100% parameter description coverage, giving a baseline of 3. The tool description adds meaningful constraints not in the schema: source length (~15s), size (~600MB), analysis limit (first ~40 minutes with truncated:true), and the role of upload_file for converting local files to /generated/ URLs. These go beyond the schema's basic descriptions and clarify how to correctly set the video parameter.

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 specific verb and resource: 'Cut ONE long video into several RANKED, ready-to-post short clips'. It clearly distinguishes this from siblings by emphasizing ranking, self-contained moments, and ready-to-post output, and further differentiates from video generation tools by noting 'no video model renders anything'. The purpose is unmistakable.

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 explicit accepted input types (YouTube, Vimeo, direct mp4, Hermoso /generated/ URL), unsupported types (TikTok, Instagram, age-restricted, private, etc.), and constraints (~15s, ~600MB, first 40 min). It also advises 'ask for a direct file or an upload rather than retrying' for unsupported inputs. However, it does not name alternative sibling tools for different video operations, so it misses the highest bar for explicit alternatives.

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

collect_post_metricsRead how the recorded posts performedA
Idempotent
Inspect

Fetch fresh performance numbers for this brand's recorded posts and store them as a time-series. Metrics ACCRUE, so a post is read at ~24 hours and again at ~7 days; this collects whichever readings are due and skips the ones already taken. A channel that cannot report a metric records it as ABSENT with the reason — never as zero — and a read that fails is recorded as 'could not tell', which contributes to nothing. X IS SKIPPED BY DEFAULT because X bills us per API call: pass includeMetered:true to include it, and tell the user it costs credits BEFORE you do. The skip is always reported so a channel missing from the numbers is never mistaken for one that performed badly. Free except for X.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxNocap how many posts to read in this run (default 40)
includeMeteredNoalso read X, which BILLS CREDITS per post read — ask the user first

Output Schema

ParametersJSON Schema
NameRequiredDescription
dueNo
windowsNo
collectedNo
remainingNo
meteredNoteNo
couldNotTellNo
skippedMeteredNo
Behavior5/5

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

The description goes far beyond the annotations by explaining the accrual schedule, how missing metrics are recorded as ABSENT (never zero), how failed reads become 'could not tell', the default skip of X due to cost, and the requirement to ask the user before including X. This rich context is consistent with idempotentHint and readOnlyHint:false.

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 dense but every sentence serves a purpose: purpose, accrual logic, missing data semantics, cost implications, and fallback reporting. It is front-loaded with the primary action and avoids 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?

The description covers the tool's behavior, edge cases, cost, and output semantics well. It does not detail the output schema, but since an output schema exists, the description need not explain return values. Minor omission: no mention of how to retrieve the stored time-series, but that may be outside this tool's scope.

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?

Although the input schema covers 100% of parameters, the description adds meaningful context to includeMetered by explaining why it is skipped by default (cost) and instructing the agent to warn the user about credit charges. It also clarifies the 'max' parameter's role via the cap mention, enhancing the schema 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?

The description clearly states the tool's function: 'Fetch fresh performance numbers for this brand's recorded posts and store them as a time-series.' It uses a specific verb (fetch/store) and specific resource (recorded posts), distinguishing it from siblings like x_post_metrics or post_performance by emphasizing the time-series accrual process.

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

Usage Guidelines3/5

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

The description implies when to use the tool (when readings are due at ~24 hours and ~7 days, skipping already-taken readings), but it does not explicitly contrast it with alternative tools such as real-time metrics tools. It lacks explicit 'use this instead of X' guidance or exclusions.

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

competitor_teardownCompetitor teardownA
Read-only
Inspect

Tear a competitor's ad strategy down into an actionable playbook: their opening-hook MIX, longest-running campaign THEMES, the WHITE SPACE nobody in their set runs, 2-3 render-ready COUNTER-PLAYS, and the territories they own that you should avoid. Pass competitor {name, domain?}. CONTRACT: supply ads (raw ad objects from a prior pull_competitor_ads / search_meta_ads call) to tear exactly those down, OR omit ads and this pulls the competitor's real Meta ads first (spends ~1-2 ScrapeCreators credits, longest-running = proven winners). Auto-tailors the white space + counter-plays to YOUR saved brand. Spends LLM tokens (0 SC credits when you pass ads).

ParametersJSON Schema
NameRequiredDescriptionDefault
adsNoad objects to tear down (from pull_competitor_ads / search_meta_ads). Omit to auto-pull their Meta ads first.
languageNooutput language (default English)
competitorYesthe competitor to tear down

Output Schema

ParametersJSON Schema
NameRequiredDescription
adCountNohow many ads were analyzed
teardownNothe playbook — hook_taxonomy, campaigns, white_space, counter_plays, not_saying
Behavior5/5

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

Beyond the readOnly/openWorld annotations, the description discloses credit consumption (~1-2 ScrapeCreators credits when omitting ads, 0 SC credits with ads), the auto-pull behavior with 'longest-running = proven winners' rationale, and auto-tailoring to the saved brand. These are non-obvious behavioral traits that help the agent anticipate side-effects and costs.

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 but well-structured with a purpose statement, a CONTRACT block, and cost notes. Every clause adds operational detail, though the heavy use of caps and jargon makes it slightly less scannable. Still, it earns its length.

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 tool with nested objects and an output schema, the description covers purpose, inputs, two usage modes, cost implications, behavior with vs. without ads, tailoring to saved brand, and expected outputs. Nothing critical is left implied, and the output schema handles return-value documentation.

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?

The input schema already describes every parameter with 100% coverage. The description adds minimal semantic value beyond the schema: it repeats the ads contract and competitor requirements without introducing new detail. Baseline 3 is appropriate because the schema carries 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 opens with a specific verb+resource: 'Tear a competitor's ad strategy down into an actionable playbook,' listing concrete outputs (opening-hook MIX, THEMES, WHITE SPACE, COUNTER-PLAYS, territories). This clearly differentiates it from siblings like pull_competitor_ads or research_ads, which fetch or analyze ads but do not produce a teardown playbook.

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 'CONTRACT' section explicitly states when to supply `ads` versus omit them, including credit costs for auto-pull. It references prior pull_competitor_ads / search_meta_ads calls, giving clear context. It doesn't explicitly name alternatives to avoid, but the usage conditions are strong enough for an agent to decide when to use this tool.

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

convert_onedrive_fileConvert a OneDrive file to PDF or JPGA
Read-only
Inspect

Turn a file already in the user’s OneDrive into a PDF or a JPG — Microsoft does the conversion on its own servers, so nothing is re-encoded here and nothing is lost in a screenshot. It reads about 130 source formats, which is the point: PowerPoint and Word decks, Excel, Photoshop PSD, Illustrator AI, Sketch, 3D (fbx/glb/obj), video (mp4/mov/webm), HEIC from an iPhone, and the raw camera formats (CR2, NEF, ARW, DNG) that nothing else in this product can open. Use it to turn a client’s deck into images you can actually put in an ad, to get a usable JPG out of a designer’s PSD or a photographer’s raw file, or to hand someone a PDF of a spreadsheet. CONVERTING TO JPG REQUIRES BOTH width AND height — Microsoft refuses the call without them. The result is stored at a durable Hermoso URL you can pass straight to a render or a post; Microsoft’s own conversion link expires within minutes, so do not hand that one to anyone. Needs OneDrive connected — no new permission.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNoREQUIRED for jpg — output width in pixels
fileIdYesthe OneDrive item id, from list_onedrive_files
formatNodefault pdf
heightNoREQUIRED for jpg — output height in pixels

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
noteNo
bytesNo
fileIdNo
formatNo
sourceNameNo
Behavior5/5

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

Discloses that conversion happens on Microsoft's servers (no re-encoding), that output is a durable Hermoso URL while Microsoft's link expires within minutes, and that no new permission is needed. These go well beyond the readOnlyHint and openWorldHint annotations, offering critical operational context.

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 longer than typical but every sentence serves a purpose: purpose, technical guarantee, supported formats, use cases, a critical constraint in caps, output handling, and permission note. It front-loads the core action and uses formatting to highlight warnings. Slightly verbose but efficiently organized.

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 (130 source formats, JPG dimension requirement, URL durability), the description covers purpose, use cases, limitations, output behavior, and prerequisites. Since an output schema exists, not detailing return values is acceptable. The description is complete enough for an agent to invoke it correctly.

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 already covers all 4 parameters with descriptions, so baseline is 3. The description strengthens this by highlighting that 'CONVERTING TO JPG REQUIRES BOTH width AND height — Microsoft refuses the call without them,' and clarifies fileId's origin. This adds meaning 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?

The description opens with a specific verb+resource: 'Turn a file already in the user’s OneDrive into a PDF or a JPG.' It clearly distinguishes from sibling tools like list/get/update/save by focusing on conversion, and even notes it handles formats 'nothing else in this product can open.'

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

Usage Guidelines4/5

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

Provides explicit use cases: 'turn a client’s deck into images you can actually put in an ad,' 'get a usable JPG out of a designer’s PSD or a photographer’s raw file,' and 'hand someone a PDF of a spreadsheet.' It also states the prerequisite of OneDrive connected. It doesn't explicitly name alternative tools, but the context is clear.

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

create_brandCreate a brand workspaceA
Idempotent
Inspect

Add a NEW brand workspace (a separate brand/client on this account) and switch to it. Each workspace has its OWN brand profile, memory, swipefile, Library, avatars, skills, playbooks and connectors — nothing leaks between them. Use this for a second brand or a new client; use draft_brand to FILL a workspace, and update_brand to edit one. Re-running with the same name returns the existing workspace instead of a duplicate. Free (the ~50-credit research cascade only starts when you then run draft_brand).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesthe brand / client name for the new workspace
activateNoswitch this connection to the new brand (default true) — everything you do next scopes to it

Output Schema

ParametersJSON Schema
NameRequiredDescription
brandNo
activeNo
createdNo
Behavior5/5

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

Adds significant context beyond annotations: workspace isolation, automatic switching, idempotent behavior (re-running returns existing), and cost/free status. These are not inferable from readOnlyHint/idempotentHint/destructiveHint alone. 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.

Conciseness5/5

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

Three dense sentences that front-load the action and follow with essential caveats (isolation, alternatives, idempotency, cost). No wasted words; every clause earns its place.

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?

Despite having an output schema (which covers return values), the description covers all key decision factors: when to use, what happens (switch, isolation), re-run safety, and associated costs. A complete, well-rounded description for a tool of this complexity.

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 fully documents both parameters. The description implies switching behavior but adds little beyond the schema's own parameter descriptions. Baseline 3 applies since structured data carries 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?

The description clearly states 'Add a NEW brand workspace' with a specific verb and resource, and distinguishes it from siblings like draft_brand (fill) and update_brand (edit). It also explains the concept of a brand workspace as a separate client, making intent 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?

Explicitly directs when to use: 'Use this for a second brand or a new client' and provides alternatives: 'use draft_brand to FILL a workspace, and update_brand to edit one.' Also notes cost implications relative to draft_brand, further guiding appropriate usage.

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

create_docCreate a Google DocAInspect

Create a new Google Doc in the user’s Drive with a title + optional body text — e.g. export ad copy, a creative brief, or a report. Returns the document id + URL. Needs Google Drive connected (Settings ▸ Connectors ▸ Google Drive — one connection covers Drive, Sheets and Docs).

ParametersJSON Schema
NameRequiredDescriptionDefault
textNobody text to insert
titleNodocument title

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
titleNo
documentIdNo
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the description's 'Create' action aligns. The description adds valuable context beyond annotations by disclosing the authentication requirement ('Needs Google Drive connected') and noting that one connection covers Drive, Sheets, and Docs. It also mentions the return of id and URL, though that is partially covered by the output schema.

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 sentences, front-loaded with the primary action, and every sentence earns its place: the first states the action, examples, and return; the second provides the prerequisite. No fluff or redundancy.

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 creation tool with only two optional parameters and an output schema, the description covers purpose, examples, return values, and the connection prerequisite. It is complete for typical use, though it could have explicitly mentioned not to use for editing existing docs, but that is implied by 'new'.

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 clear descriptions for 'text' and 'title'. The description adds context via examples (ad copy, brief, report) but does not provide additional parameter-level semantics beyond what the schema already offers, so it stays at 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?

The description clearly states the tool creates a new Google Doc in the user's Drive with a title and optional body text. It provides concrete use-case examples (export ad copy, creative brief, report) and distinguishes from siblings like append_to_doc by explicitly saying 'new'.

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 usage context through examples (ad copy, creative brief, report) and mentions the prerequisite of having Google Drive connected. However, it does not explicitly name alternative tools or state when not to use this tool, so it stops short of a full 5.

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

create_drive_folderCreate a Drive folderAInspect

Create a folder in the user’s Google Drive (optionally nested under parentId) to organize saved files. Returns the folder id + webViewLink. Use that ID as update_drive_file’s moveToFolderId or as parentId for a nested folder. NOTE: save_to_drive’s folder is a NAME, not this id — it find-or-creates a folder by that name, so pass the folder NAME there (or omit and just save, then move with update_drive_file).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesfolder name
parentIdNoparent folder id for a nested folder (default: Drive root)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
webViewLinkNo
Behavior4/5

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

Annotations already mark this as a non-read-only, non-idempotent operation. The description adds useful behavioral context beyond the annotations: it mentions the return value ('folder id + webViewLink') and explains the parentId nesting behavior, which is not implied by annotations. 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.

Conciseness5/5

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

The description is three sentences, each necessary and valuable. The first states purpose and return, the second explains how to use the output with related tools, and the third clarifies a critical cross-tool distinction. No redundant wording.

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?

Despite being a simple 2-parameter create tool, the description is complete for selection and invocation. It covers purpose, return value, integration with update_drive_file and save_to_drive, and the open-world annotation is supported by the note about alternative usage patterns.

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?

The input schema already documents both parameters with 100% coverage, so the baseline is 3. The description reinforces parentId's optionality and default, but doesn't add significant new parameter-level 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?

The description clearly states the action ('Create a folder in the userʼs Google Drive') and the specific resource. It also distinguishes itself from sibling tools like create_onedrive_folder and save_to_drive by emphasizing Google Drive and the distinction between folder ID and folder name.

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?

The description explicitly explains when to use this tool (to organize saved files) and provides clear alternatives: 'Use that ID as update_drive_fileʼs moveToFolderId or as parentId for a nested folder.' It also warns against a common mistake with save_to_drive, telling the agent to pass the folder NAME there, not the ID.

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

create_google_ads_adCreate a Google Ads adAInspect

Create the actual AD inside a Google Ads ad group — this is the object that carries the creative; a campaign or ad group alone shows nothing. On a SEARCH campaign it builds a RESPONSIVE SEARCH AD: 3–15 headlines (≤30 chars), 2–4 descriptions (≤90 chars), at least one finalUrl, optional path1/path2. On a DISPLAY campaign it builds a RESPONSIVE DISPLAY AD: headlines, longHeadline, descriptions, businessName plus BOTH a landscape (1.91:1) and a square (1:1) image asset from upload_google_ads_asset. The right format is chosen from the campaign's channel. Created PAUSED and read back from Google. If the parent campaign is already LIVE (ENABLED), creating this ENABLED starts REAL AD SPEND immediately — show the user what would begin serving, get an explicit yes, then pass confirm:true. Leaving it PAUSED never needs confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
path1NoSEARCH only — display-URL path segment, ≤15 chars
path2NoSEARCH only — second display-URL path segment, ≤15 chars
dryRunNo
statusNodefault PAUSED
confirmNoset true ONLY after the user explicitly approved starting spend — required when the parent campaign is already LIVE (ENABLED) and this object would serve immediately
adGroupIdYesthe ad group this ad lives in
finalUrlsNothe landing page(s) — at least one is required
headlinesNoSEARCH: 3–15 headlines, each ≤30 characters. DISPLAY: 1–5. Pass a plain string, or {text, pin} to PIN one to a fixed slot (a brand name or legal line).
customerIdNoomit to use the brand’s selected default account
logoImagesNoDISPLAY only — logo asset resource names
businessNameNoDISPLAY only — ≤25 characters
descriptionsNoSEARCH: 2–4 descriptions, each ≤90 characters. DISPLAY: 1–5. Pass a plain string, or {text, pin} to pin it.
longHeadlineNoDISPLAY only — ≤90 characters
loginCustomerIdNo
marketingImagesNoDISPLAY only — landscape 1.91:1 asset resource names from upload_google_ads_asset
squareMarketingImagesNoDISPLAY only — square 1:1 asset resource names

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
adIdNo
noteNo
typeNo
statusNo
adResourceNameNo
Behavior5/5

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

The description richly discloses behavioral traits beyond the sparse annotations: created PAUSED by default, read back from Google, format auto-selected from campaign channel, and the critical warning that enabling on a live campaign starts real ad spend requiring explicit user confirmation (confirm:true). This greatly exceeds the bare annotation flags and provides safety-critical context.

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?

Despite being long, every sentence earns its place: purpose, format variants, asset requirements, default status, and the spend-confirmation warning are all essential. The description is front-loaded with the core purpose and flows logically from general to specific, maintaining efficiency with 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?

The description covers the most important behavioral and asset requirements, and the presence of an output schema reduces the need to document return values. However, it omits mention of the dryRun parameter (which also lacks a schema description) and does not discuss customerId/loginCustomerId selection beyond what the schema provides, leaving a small but notable gap in completeness.

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 high (88%) and most parameters have inline descriptions, but the description adds extra semantic value by specifying character/quantity constraints for search headlines and descriptions, requiring both landscape and square images for display, and clarifying the confirm parameter's purpose. It does not repeat everything, but meaningfully supplements 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?

The description clearly identifies the tool as creating the actual AD inside a Google Ads ad group, emphasizing that a campaign or ad group alone is insufficient. It specifically distinguishes between responsive search ads and responsive display ads with concrete requirements, making its purpose unambiguous and distinct from sibling creation tools.

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 provides strong contextual guidance: it establishes the tool as the step after campaign/ad group creation, explains the two ad formats based on channel, and points to upload_google_ads_asset for display image assets. It also warns about the live-campaign confirmation flow. However, it does not explicitly name alternative tools or state when-not-to-use scenarios, keeping it below a 5.

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

create_google_ads_ad_groupAdd an ad group to a Google Ads campaignAInspect

Add an ad group to an EXISTING Google Ads campaign — the level between a campaign and its ads. Google requires it: a campaign with no ad group cannot serve. Optionally build its ad and keywords in the same ATOMIC call. The ad-group type is taken from the campaign's channel automatically. Created PAUSED and read back from Google before you are told it exists. If the parent campaign is already LIVE (ENABLED), creating this ENABLED starts REAL AD SPEND immediately — show the user what would begin serving, get an explicit yes, then pass confirm:true. Leaving it PAUSED never needs confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
adNobuild the ad in the same atomic call
nameYesad group name
dryRunNo
statusNodefault PAUSED
confirmNoset true ONLY after the user explicitly approved starting spend — required when the parent campaign is already LIVE (ENABLED) and this object would serve immediately
keywordsNoa SEARCH ad group with no keywords never shows
cpcBidUsdNomax CPC for this ad group — omit to inherit the campaign bidding
campaignIdYesthe campaign this ad group belongs to
customerIdNoomit to use the brand’s selected default account
loginCustomerIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
adGroupIdNo
adGroupResourceNameNo
Behavior5/5

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

The description goes well beyond the annotations. It reveals that the ad group is 'Created PAUSED and read back from Google before you are told it exists,' explains the atomicity of optionally building ads/keywords, and gives a critical warning about real ad spend: 'If the parent campaign is already LIVE (ENABLED), creating this ENABLED starts REAL AD SPEND immediately' with a mandatory confirmation step. These are meaningful behavioral traits not present in 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.

Conciseness5/5

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

The description is a single focused paragraph with no filler. Each sentence earns its place: purpose, hierarchy, necessity, atomicity, default state, validation, and the spend-confirmation rule. It is front-loaded with the core action and then expands with critical caveats, all in compact, unambiguous language.

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 (10 parameters, nested objects, output schema present), the description covers the essential operational context: hierarchy, when creation is necessary, default state, read-back validation, atomic ad/keyword construction, and the critical confirmation requirement for live campaigns. The output schema covers return values, so the description does not need to. This is a highly complete description for AI agent decision-making.

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 high (80%), so a baseline of 3 is appropriate. The description adds extra semantic value by clarifying the relationship between status and confirm ('Created PAUSED...' and 'pass confirm:true' after explicit approval), and by framing the ad and keywords parameters as part of the same atomic call. It does not systematically explain every parameter, but the schema already does that, and the description enriches the key decision-making 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 opens with a specific verb-resource pair: 'Add an ad group to an EXISTING Google Ads campaign.' It clarifies the tool's place in the hierarchy ('the level between a campaign and its ads') and distinguishes it from sibling tools like create_google_ads_campaign or create_google_ads_ad. It also states when this tool is required ('a campaign with no ad group cannot serve'), making the purpose unmistakable.

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

Usage Guidelines4/5

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

The description provides strong context for when to use the tool (to make a campaign serve, to create an ad group hierarchy) and mentions an optional approach ('Optionally build its ad and keywords in the same ATOMIC call'), hinting at alternatives. However, it does not explicitly name sibling tools (e.g., add_google_ads_keywords) or state when to use them instead, so it falls just short of a full 5.

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

create_google_ads_campaignBuild a Google Ads campaign (paused)AInspect

Build a campaign on a connected Google Ads account. ALWAYS created PAUSED — it spends NOTHING until you enable it with set_google_ads_status(confirm:true). Google's object graph is campaign → ad group → ad, so a campaign ON ITS OWN CANNOT SERVE AN IMPRESSION: pass adGroup{name, ad{headlines,descriptions,finalUrls}, keywords[]} and this builds budget + campaign + location/language targeting + ad group + ad + keywords in ONE ATOMIC operation (if any part is rejected, nothing at all is created — no half-built campaign to clean up). Also here: bidding strategy, locations by NAME ("United States", "Toronto" — resolved for you), languages, and start/end dates. Google requires 3–15 headlines (≤30 chars) and 2–4 descriptions (≤90 chars) on a search ad. Everything is READ BACK from Google before you are told it exists; print the returned note verbatim, and if it says the campaign cannot serve yet, say that rather than calling it a finished ad.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYescampaign name
dryRunNovalidate the WHOLE tree against Google without creating anything. Nothing is written and no budget is consumed
adGroupNobuild the serving tree in the same atomic call — WITHOUT this you get a campaign shell that can never show an ad
biddingNohow the campaign bids — default MANUAL_CPC
endDateNoYYYY-MM-DD
languagesNoISO language codes, e.g. ["en","fr"]
locationsNolocation NAMES to target, e.g. ["United States"] or ["Toronto","Vancouver"]. WITHOUT this the campaign runs WORLDWIDE — the most expensive default in Google Ads
startDateNoYYYY-MM-DD
customerIdNo10-digit account id (from list_google_ads_campaigns) — omit to use the brand’s selected default account
channelTypeNodefault SEARCH
dailyBudgetUsdNodaily budget USD (1–100000) — creates a budget inline; required unless budgetResourceName is given
searchPartnersNoSEARCH only — also serve on Google search partners (default false)
loginCustomerIdNomanager id if operating through an MCC
excludedLocationsNolocation names to EXCLUDE
budgetResourceNameNoreuse an existing budget instead of creating one
containsEuPoliticalAdsNoEU Political Advertising Regulation declaration. Google REQUIRES one on every campaign. Default false (a normal commercial ad) — set true ONLY for genuine EU political advertising

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
campaignIdNo
budgetResourceNameNo
campaignResourceNameNo
Behavior5/5

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

The description discloses several critical behaviors not visible in annotations: campaigns are ALWAYS created PAUSED and spend nothing until explicitly enabled; the whole operation is atomic (any rejection means nothing is created); and results are read back from Google before the campaign is confirmed to exist. These are high-impact behavioral details that an agent must know, and they are not contradicted by 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.

Conciseness5/5

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

The description is dense but every sentence earns its place: the paused-safety warning is front-loaded, followed by atomicity, architecture reasoning, content requirements, and the read-back/return protocol. For a tool with 16 parameters and complex nested objects, this is remarkably efficient and logically structured.

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 rich input schema and presence of an output schema, the description provides the missing contextual layer: what atomicity implies, how this fits into the broader workflow (enable later, read-back before reporting success), and the key constraint that a campaign alone cannot serve. No significant gaps are apparent.

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 input schema has 100% coverage with detailed descriptions for every parameter, so the baseline is 3. The description adds value by explaining why adGroup is essential ('WITHOUT this you get a campaign shell that can never show an ad'), that locations are resolved by name, and the specific Google count/length requirements for headlines and descriptions. This goes beyond the schema's individual param descriptions.

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

Purpose5/5

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

The description clearly states 'Build a campaign on a connected Google Ads account' and elaborates that it constructs the entire campaign object graph (budget, targeting, ad group, ad, keywords) in one atomic operation. This specific verb+resource pair, combined with the atomicity detail, strongly distinguishes it from sibling create_*_ads_campaign tools and even from create_google_ads_ad/ad_group.

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 explains when to use this tool (to build the complete campaign with ad group and ads in a single atomic call) and contrasts with the alternative of creating just a shell if adGroup is omitted. It also references enabling via set_google_ads_status, giving clear workflow context. While it doesn't explicitly say 'use create_google_ads_ad for ad-only changes,' the guidance is sufficient for an agent to choose correctly.

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

create_google_ads_conversion_actionCreate a Google Ads conversion actionAInspect

Create a CONVERSION ACTION — the thing that tells Google what counts as a result on this account. This is a PREREQUISITE, not a nicety: MAXIMIZE_CONVERSIONS, MAXIMIZE_CONVERSION_VALUE, TARGET_CPA, TARGET_ROAS and every Performance Max campaign are undeliverable without one, because Google has nothing to optimise toward. type WEBPAGE (a purchase / lead / signup on the site — the normal choice), UPLOAD_CLICKS or UPLOAD_CALLS; every other Google conversion type (Firebase, Google Analytics 4, Floodlight, store visits) is READ-ONLY and is created in those products, not here. Set category to what actually happened (PURCHASE, SUBMIT_LEAD_FORM, SIGNUP, BOOK_APPOINTMENT…) and defaultValueUsd when a conversion has a known worth — TARGET_ROAS has nothing to maximise without a value. Created ENABLED and counted in "conversions" by default, because a conversion action that is neither records nothing. It CANNOT SERVE AN AD and cannot spend a cent, so it needs no confirmation. A WEBPAGE action records NOTHING until its Google tag is installed on the site — say that when you report it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYeswhat the user calls this result, e.g. "Purchase", "Demo request"
typeNodefault WEBPAGE — a conversion that happens on the website
dryRunNovalidate against Google and create NOTHING
statusNodefault ENABLED — anything else records nothing
categoryNowhat kind of result this is — default DEFAULT
customerIdNo10-digit account id (dashes ok) — omit to use the brand’s selected default account
countingTypeNoONE_PER_CLICK for leads, MANY_PER_CLICK for sales — defaults by category
primaryForGoalNodefault true — whether this action is biddable for its category
defaultValueUsdNowhat one conversion is worth — required in practice for TARGET_ROAS
loginCustomerIdNomanager id if operating through an MCC
defaultCurrencyCodeNo3-letter ISO code, e.g. USD
alwaysUseDefaultValueNoignore any value sent with the conversion and always use the default
viewThroughLookbackDaysNo1–30 days
clickThroughLookbackDaysNo1–90 days
includeInConversionsMetricNodefault true — false makes smart bidding IGNORE it

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
conversionActionIdNo
conversionActionResourceNameNo
Behavior5/5

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

The description goes well beyond the annotations by revealing default behaviors: the action is created ENABLED, counted in conversions, cannot serve ads, and spends no money. It also discloses that a WEBPAGE action records nothing until the Google tag is installed, which is critical operational context.

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 earns its place, densely packing purpose, usage, exclusions, defaults, and behavioral consequences. It opens with a clear subject and distinct clauses, making it structured despite being a single paragraph.

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 15 parameters, a rich schema, and an output schema, the description covers all essential context: when to use, what types are supported, defaults, limitations, and what happens if not done. No critical operational detail appears missing.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds meaningful semantics: defaultValueUsd is required for TARGET_ROAS (nothing to maximize without a value), countingType defaults by category, and includeInConversionsMetric=false makes smart bidding ignore the action. These insights go beyond the schema's basic field descriptions.

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

Purpose5/5

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

The description clearly states the tool creates a conversion action, the thing that tells Google what counts as a result. It distinguishes itself from other Google Ads create tools by explaining the three supported types (WEBPAGE, UPLOAD_CLICKS, UPLOAD_CALLS) and explicitly excludes read-only types created elsewhere.

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?

The description provides explicit when-to-use guidance: it frames the conversion action as a prerequisite for smart-bidding strategies and Performance Max. It also gives a clear exclusion: Firebase, GA4, Floodlight, and store visit conversions are read-only and must be created in those products, not this tool.

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

create_google_ads_performance_max_campaignCreate a Google Ads Performance Max campaignAInspect

Build a PERFORMANCE MAX campaign — Google’s cross-surface campaign type (Search, YouTube, Display, Discover, Gmail, Maps) and the one Google pushes hardest at small advertisers. ALWAYS created PAUSED; it spends NOTHING until you enable it with set_google_ads_status(confirm:true). PMax has NO manual bidding and NO keywords: it bids only on conversions, so the account MUST already have a conversion action — check with list_google_ads_conversion_actions, because this REFUSES rather than build a campaign that cannot optimise. Creative lives in an ASSET GROUP, and Google’s minimums are enforced before anything is sent: 3–15 headlines (≤30 chars), 1–5 longHeadlines (≤90), 2–5 descriptions (≤90), one businessName (≤25), at least one LOGO (1:1), one MARKETING_IMAGE (1.91:1) and one SQUARE_MARKETING_IMAGE (1:1) — upload the images with upload_google_ads_asset first and pass their asset resource names. A YouTube video is optional (Google generates one from the asset group if you omit it). Brand guidelines: since Google Ads API v21 they are ON by default for new PMax campaigns, which means the businessName and LOGO assets are linked to the CAMPAIGN (CampaignAsset), not to the asset group — Hermoso does that for you. Leave brandGuidelinesEnabled alone unless the user wants the older asset-group layout, and pass false for that. Budget, campaign, location/language targeting, the asset group and every asset link go up in ONE ATOMIC operation — if any part is rejected, nothing at all is created — and the whole tree is READ BACK from Google before you are told it exists. Print the returned note verbatim; if it says the campaign cannot serve, say that instead of calling it finished. RETAIL / Shopping Performance Max (a Merchant Center product feed with listing groups) is NOT supported here and is refused by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYescampaign name
dryRunNovalidate the whole tree against Google and create NOTHING
biddingNo
endDateNoYYYY-MM-DD
languagesNoISO codes, e.g. ["en"]
locationsNoplace NAMES ("United States", "Toronto") — resolved for you
startDateNoYYYY-MM-DD
assetGroupYesthe creative — Google requires every field above before a PMax campaign can serve
customerIdNo10-digit account id (dashes ok) — omit to use the brand’s selected default account
countryCodeNo2-letter hint to disambiguate a city name
dailyBudgetUsdNodaily budget in USD (1–100000) — or pass budgetResourceName
loginCustomerIdNomanager id if operating through an MCC
excludedLocationsNoplaces to block
budgetResourceNameNoan existing budget to reuse
brandGuidelinesEnabledNodefault TRUE, matching Google’s own default since v21: businessName + logos are linked to the CAMPAIGN. Pass false only for the pre-v21 layout, where they sit on the asset group instead
containsEuPoliticalAdsNotrue ONLY for genuine EU political advertising

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
campaignIdNo
assetGroupResourceNameNo
brandGuidelinesEnabledNo
Behavior5/5

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

The description discloses key behaviors beyond annotations: campaign is ALWAYS created PAUSED, spends nothing until enabled; the operation is atomic (all-or-nothing) and read-back from Google; asset minimums enforced; and it REFUSES if no conversion action exists. Annotations only indicate non-read-only/non-destructive, so this adds substantial value.

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 with the core purpose. Every paragraph covers a necessary aspect: paused state, prerequisites, asset requirements, brand guidelines, atomicity, and exclusions. While dense, it is appropriately sized for a tool with many constraints, though a few contextual phrases could be trimmed.

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 tool with 16 parameters, nested objects, and an output schema, the description is remarkably complete. It covers prerequisites, asset minimums, atomicity, verification, return handling, and the unsupported retail case, so an agent has enough context to invoke correctly.

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 description coverage is 94%, so the schema already documents most parameters. The description adds workflow context (upload assets first, pass resource names) and explains the brandGuidelinesEnabled default and when to pass false. This goes beyond schema but is not essential for every parameter.

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 'Build a PERFORMANCE MAX campaign' and clearly defines it as Google's cross-surface campaign type, listing the surfaces. It distinguishes from siblings by explicitly excluding RETAIL/Shopping PMax and emphasizing the performance max specialization versus generic Google Ads campaign tools.

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/when-not: requires a conversion action and says the tool refuses without one, instructs to upload assets first via upload_google_ads_asset, mentions enabling later with set_google_ads_status, and states RETAIL/Shopping PMax is not supported here. This gives the agent clear selection and prerequisite guidance.

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

create_linkedin_ads_campaignCreate a LinkedIn campaign (draft)AInspect

Create a LinkedIn campaign inside an existing campaign group. Created DRAFT — it spends NOTHING until activated with set_linkedin_ads_status(confirm:true) — and a campaign on its own carries no creative, so it cannot serve an impression. Budget amounts are in the ad account’s currency; tell the user that LinkedIn may spend UP TO 150% of a daily budget on a high-opportunity day before they pick a number. Two LinkedIn behaviours to repeat rather than hide: on manual, target-cost or cost-cap bidding a unitCost of 0 means the campaign never delivers, and LinkedIn DEFERS some validation on DRAFT objects, so a clean create can still fail at activation — never promise it will run. TARGETING IS MANDATORY on LinkedIn — a campaign with no audience is refused outright — so pass locations (and optionally include/exclude facets like titles, industries, seniorities or staffCountRanges), or a raw targetingCriteria. Resolve every targeting value with search_linkedin_ads_targeting first: they are opaque URNs and MUST NOT be invented. LinkedIn’s own enums for type, objectiveType and costType are passed straight through, and LinkedIn’s refusal is surfaced verbatim if one is wrong. Read back before you are told it exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
typeNoLinkedIn campaign type, e.g. SPONSORED_UPDATES
formatNo
localeNo
statusNodefault DRAFT
confirmNoREQUIRED true to create it ACTIVE under a LIVE campaign group
countryNocampaign locale country, default US — this is the ad UI language market, NOT geo targeting. NEVER derive it from where the ad should run: targeting Canada still uses the US/en locale (LinkedIn refuses en_CA). Leave it alone unless the user explicitly asks for a different interface language.
endDateNoYYYY-MM-DD; omit for an open-ended run
excludeNofacets to exclude, same shape
includeNofurther targeting facets ANDed onto locations, e.g. {titles:[…], industries:[…], seniorities:[…], staffCountRanges:[…]}
costTypeNoCPM / CPC / CPV
languageNocampaign locale language, default en
unitCostNothe bid
locationsNoREQUIRED unless targetingCriteria is given — geo URNs or bare geo ids from search_linkedin_ads_targeting
startDateNoYYYY-MM-DD; defaults to today
adAccountIdNo
dailyBudgetNo
runScheduleNo
totalBudgetNo
currencyCodeNo
objectiveTypeNoLinkedIn objective, e.g. WEBSITE_VISIT
organizationIdNothe LinkedIn company Page this campaign advertises — LinkedIn REQUIRES it for Sponsored Content, Dynamic and Lead Gen campaigns
campaignGroupIdYesthe campaign group this campaign lives in — LinkedIn requires one
politicalIntentNo
excludeLocationsNo
targetingCriteriaNoLinkedIn’s raw targeting object — passed through and overrides locations/include/exclude
offsiteDeliveryEnabledNoalso serve on the LinkedIn Audience Network; default false
optimizationTargetTypeNo
audienceExpansionEnabledNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
campaignIdNo
campaignGroupIdNo
Behavior5/5

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

Beyond the annotations (readOnly=false, openWorldHint=true), the description discloses many non-obvious behaviors: DRAFT spends nothing until activated, LinkedIn may spend 150% of daily budget, unitCost=0 prevents delivery, deferred validation can cause activation failures, targeting is mandatory, and URNs must not be invented. These are crucial details not captured in annotations.

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

Conciseness5/5

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

Although long, every sentence delivers critical information. It is front-loaded with the main purpose, then organized by behavior warnings, targeting requirements, and validation caveats. For a tool with 29 parameters and many platform quirks, the length is justified and not wasteful.

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, the description covers the full lifecycle: creation as DRAFT, activation, budget considerations, targeting mandates, URN resolution, enum validation, and the need to read back. Combined with an output schema and annotations, it is comprehensively complete for safe and correct invocation.

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

Parameters5/5

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

With only 59% schema coverage, the description compensates richly: it explains budget currency, the unitCost=0 trap, targeting structures (locations, include/exclude, targetingCriteria), enum passthrough for type/objectiveType/costType, organizationId requirements, and the confirm flag for ACTIVE status. This adds substantial meaning beyond the raw 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?

The description opens with a specific verb+resource+scope: 'Create a LinkedIn campaign inside an existing campaign group.' It clearly distinguishes from related tools like create_linkedin_ads_campaign_group and create_linkedin_ads_creative by emphasizing it creates a draft campaign only, with no creative attached.

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 workflow instructions: activate with set_linkedin_ads_status(confirm:true), resolve targeting URNs via search_linkedin_ads_targeting, and read back after creation. It also warns against promising delivery and explains the need for a separate creative, making the when-to-use context exceptionally clear.

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

create_linkedin_ads_campaign_groupCreate a LinkedIn campaign group (draft)AInspect

Create a LinkedIn CAMPAIGN GROUP — the container LinkedIn has required every campaign to live inside since 2020. Created DRAFT, which is LinkedIn’s own structural safety net: it REFUSES to hold an ACTIVE campaign inside a DRAFT group, so while the group is a draft nothing beneath it can serve whatever its own status says. Creating it ACTIVE removes that protection and therefore requires confirm:true. LinkedIn REQUIRES a run schedule on a campaign group: it starts today unless you pass startDate, and if you set totalBudget you MUST also pass endDate — that pairing is LinkedIn’s own rule and it is refused here before anything is created. Read back from LinkedIn before you are told it exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYescampaign group name
statusNodefault DRAFT
confirmNoREQUIRED true to create it ACTIVE
endDateNoYYYY-MM-DD — REQUIRED by LinkedIn whenever totalBudget is set
startDateNoYYYY-MM-DD — when campaigns under this group may start; defaults to today
adAccountIdNo
runScheduleNoLinkedIn raw runSchedule object, passed through; startDate/endDate are easier
totalBudgetNooptional group-level total budget, in the ad account’s currency
currencyCodeNomust match the ad account’s currency or LinkedIn refuses it

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
campaignGroupIdNo
Behavior5/5

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

The description discloses rich behavioral traits beyond annotations: DRAFT groups refuse ACTIVE campaigns, ACTIVE requires confirm:true, LinkedIn's mandatory run schedule with startDate/endDate rules, and the tool reads back from LinkedIn before confirming existence. This complements annotations (readOnlyHint: false, openWorldHint: true) and does not contradict them.

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

Conciseness5/5

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

While the description is lengthy, every sentence delivers essential information: purpose, safety net, confirm requirement, schedule rules, and read-back behavior. It is front-loaded with the main action and efficiently structured with no fluff or repetition.

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 complex creation tool with 9 parameters and an output schema, the description covers the critical behavioral constraints and validation rules thoroughly. It misses some practical details like how adAccountId is determined, but the output schema and annotations fill most gaps, making it sufficiently complete for correct invocation.

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 high (89%), and the description reinforces key parameter relationships (e.g., totalBudget requires endDate, default DRAFT status, confirm for ACTIVE). It explains the rationale behind parameters like runSchedule/startDate/endDate, providing added meaning beyond the schema. However, adAccountId remains unexplained in both schema and description.

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

Purpose5/5

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

The description clearly states the tool creates a LinkedIn CAMPAIGN GROUP and explains its role as the required container for campaigns, distinguishing it from related tools like create_linkedin_ads_campaign. The verb 'Create' and resource 'CAMPAIGN GROUP' are specific, and the context about LinkedIn's 2020 requirement adds clarity.

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 context on when to use this tool (when creating a campaign group, noting it's the container campaigns must live in) and provides safety guidance about using DRAFT vs ACTIVE status. However, it does not explicitly name alternatives or when-not cases, such as pointing to create_linkedin_ads_campaign for campaign creation.

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

create_linkedin_ads_creativeCreate a LinkedIn ad (creative, draft)AInspect

Create the AD ITSELF on LinkedIn — a CREATIVE inside an existing campaign. A LinkedIn campaign holds no copy and no visual, so until this runs the campaign CANNOT show an impression no matter what its status says; say that rather than calling a campaign "live". Two ways in: pass postUrn to sponsor a post that already exists (LinkedIn’s "boost this post"), or pass text and/or imageUrl / videoUrl to author a DIRECT SPONSORED CONTENT post — a real post by a company Page the user administers that is NEVER shown on the Page’s feed and exists only as an ad. Created DRAFT: it spends nothing until you activate it with set_linkedin_ads_status(level:"creative", status:"ACTIVE", confirm:true). Creating it ACTIVE under an already-live campaign starts REAL AD SPEND on the very next auction and therefore requires confirm:true. The whole tree — group, campaign and every creative — is read back from LinkedIn before you are told anything exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNothe creative’s name in Campaign Manager
textNothe ad copy
titleNo
altTextNo
confirmNoREQUIRED true to create it ACTIVE under a LIVE campaign (real spend)
postUrnNosponsor an EXISTING post — urn:li:share:… / urn:li:ugcPost:… (what post_to_linkedin_page returned)
imageUrlNoa Hermoso-hosted image to attach — a render, or the user’s OWN creative put through upload_file first (an arbitrary external host is refused)
videoUrlNoa Hermoso-hosted video to attach — a render, or the user’s own footage via upload_file
campaignIdYesthe campaign this ad belongs to
adAccountIdNo
allowReshareNo
intendedStatusNodefault DRAFT
organizationIdNothe company Page that authors the Direct Sponsored Content post; omit only when the connection administers exactly one Page

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
isServingNo
referenceNo
campaignIdNo
creativeIdNo
intendedStatusNo
Behavior5/5

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

Discloses beyond annotations: DRAFT spends nothing until activated; ACTIVE under a live campaign starts real ad spend and requires confirm:true; direct sponsored content never appears on the Page feed; and the entire tree is read back before claiming existence. No contradiction with readOnlyHint=false.

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?

Every sentence provides essential operational or financial context; the description is dense but front-loaded with the core purpose. The use of capitalization and structured clauses makes warnings and requirements stand out without padding.

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 (13 params, two modes, financial implications, external side effects), the description covers the full lifecycle: creation, draft vs active status, activation path, spend warning, and verification behavior. Output schema exists, so return details are not needed.

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

Parameters5/5

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

Adds significant meaning beyond schema by explaining the postUrn vs text/imageUrl/videoUrl branching, the Hermoso-hosted constraint for image/video URLs, and the confirm requirement for ACTIVE creation. It compensates for the some undocumented params like allowReshare/adAccountId by clarifying the core decision 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?

Description opens with 'Create the AD ITSELF on LinkedIn — a CREATIVE inside an existing campaign,' clearly identifying the specific verb, resource, and context. It differentiates from sibling campaign/group creation tools by requiring an existing campaign and describing the creative's role.

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 presents two mutually exclusive modes ('pass postUrn to sponsor... or pass text and/or imageUrl/videoUrl'), gives activation instructions via set_linkedin_ads_status, and warns against calling a campaign 'live' until a creative exists. Provides clear alternatives and follow-up actions.

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

create_meta_adBuild a full Meta ad (campaign → ad set → ad, paused)AInspect

Build a complete, ready-to-run Meta ad: campaign → ad set (FULL targeting + budget + schedule + bidding) → creative → ad(s), ALL created PAUSED — it spends NOTHING until you activate the campaign with set_meta_campaign_status(confirm:true). This is the "create a campaign and put the ads on it" path. IMAGE, VIDEO (uploaded, transcoded and thumbnailed for you) and CAROUSEL (format:"carousel", 2–10 cards each with its own headline/description/link) all work. Targeting is the targeting object: geo down to cities with a radius, age, gender, interests, behaviours, custom audiences and lookalikes, languages, placements, devices and OS. For a conversion objective pass pixelId + conversionEvent and the ad set optimizes for that conversion. Schedule with startTime/endTime + dayparting; bid with bidStrategy + bidAmountUsd/minRoas; use lifetimeBudgetUsd (with endTime) for a fixed flight. Attach to an existing campaign with campaignId or an existing ad set with adSetId. Everything is READ BACK from Meta before you are told it exists — print the returned summary verbatim (it now carries Meta-rendered PREVIEW LINKS for the first ad, valid 24 hours — hand them to the user so they can see the ad; preview_meta_ad renders any ad in any placement). Needs ads-management on the connected account.

ParametersJSON Schema
NameRequiredDescriptionDefault
ctaNocall-to-action, e.g. SHOP_NOW / LEARN_MORE / SIGN_UP (default LEARN_MORE)
linkNodestination URL (defaults to the brand domain)
nameNobase name for the campaign/ad set/ads
cardsNocarousel cards in order — each may set its own headline/description/link
formatNoauto = one ad per asset (image or video); carousel = ONE multi-card ad
pageIdNoPage id from list_meta_pages; omit = first Page
adSetIdNoattach the ad(s) to an EXISTING ad set (skips ad-set creation)
countryNo2-letter shorthand when you are not passing full targeting (default US)
endTimeNoREQUIRED with lifetimeBudgetUsd
messageNoprimary ad text
minRoasNoREQUIRED for LOWEST_COST_WITH_MIN_ROAS, e.g. 1.1
pixelIdNoMeta Pixel id — with this the ad set optimizes for a real CONVERSION instead of falling back to link clicks
headlineNoheadline
imageUrlNopublic https image URL for the ad creative
videoUrlNoa video URL → a real Meta VIDEO ad (uploaded + transcoded + thumbnailed for you)
imageUrlsNoseveral image URLs → one ad each, or the carousel cards in order
objectiveNodefault OUTCOME_TRAFFIC
startTimeNoISO-8601 with offset, e.g. 2026-08-01T09:00:00-0700
targetingNofull Meta ad-set targeting — age, gender, geo, interests, behaviours, audiences, languages, placements, devices. Use EXACTLY these key names: an unrecognised one (e.g. geoLocations) is REFUSED by name — it is never dropped, because a dropped geo key used to fall back to targeting the United States.
campaignIdNoattach to an existing campaign instead of creating one
adAccountIdYesad account id (act_… or digits — from list_meta_pages)
bidStrategyNo
descriptionNothe smaller description line under the headline
bidAmountUsdNoREQUIRED for a bid cap / cost cap
billingEventNodefault IMPRESSIONS
thumbnailUrlNocustom video thumbnail (otherwise Meta picks a frame)
adsetScheduleNodayparting — minutes from midnight (0–1440), days 0=Sunday…6=Saturday
applicationIdNoapp-promotion ads
dailyBudgetUsdNoad-set daily budget USD (1–10000, default 10) — spends only once ACTIVE
objectStoreUrlNo
attributionSpecNoe.g. [{event_type:"CLICK_THROUGH",window_days:7}]
carouselEndCardNoappend the Page end card to a carousel
conversionEventNoPURCHASE | LEAD | COMPLETE_REGISTRATION | ADD_TO_CART | INITIATED_CHECKOUT | …
instagramUserIdNorun it on Instagram under the brand’s own handle
optimizationGoalNooverride, e.g. OFFSITE_CONVERSIONS / LANDING_PAGE_VIEWS / THRUPLAY / VALUE
lifetimeBudgetUsdNoa fixed total instead of a daily budget — REQUIRES endTime
customConversionIdNo
specialAdCategoriesNolegally required when the ad falls in one of these categories — it restricts targeting

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
countNo
statusNo
adSetIdNo
summaryNo
previewsNo
campaignIdNo
dailyBudgetUsdNo
previewExpiresHoursNo
Behavior5/5

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

Beyond annotations, it reveals that all objects are created paused and spend nothing until activated, that images/videos are transcoded/thumbnailed, that everything is read back from Meta before confirmation, and that returned preview links are valid for 24 hours. It also states the permission requirement (ads-management), adding valuable context beyond readOnlyHint/destructiveHint.

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?

Despite its length, each sentence adds value—format support, targeting capabilities, scheduling, bidding, attachment, readback, preview links, permissions. The structure starts with the core purpose and the 'paused' safety, then systematically covers options without redundant 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?

The description covers all major aspects: creation pipeline, media formats, targeting, conversion optimization, scheduling, bidding, budget types, attaching to existing objects, readback behavior, preview handling, and permissions. An output schema exists, yet the description still explains how to handle the returned preview links, making it complete for a complex 38-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 description coverage is 92%, so the baseline is 3. The description enhances this by explaining parameter relationships: pairing pixelId+conversionEvent for conversion optimization, grouping startTime/endTime+dayparting, bidStrategy+bidAmountUsd/minRoas, and requiring endTime with lifetimeBudgetUsd. It also explains targeting key strictness and the refusal of unrecognized keys.

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

Purpose5/5

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

The description clearly states it builds a complete Meta ad pipeline (campaign → ad set → creative → ads), explicitly calling it the 'create a campaign and put the ads on it' path. This distinguishes it from sibling tools like create_meta_campaign and create_meta_adset, and it specifies the resource and action.

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 provides explicit when-to-use guidance: this is the full pipeline path; you can attach to an existing campaign/ad set via campaignId/adSetId. It also names activation via set_meta_campaign_status and preview via preview_meta_ad, offering clear alternatives and next steps.

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

create_meta_adsetCreate a Meta ad set (audience + budget + schedule)AInspect

Create an AD SET on an EXISTING Meta campaign — the level that holds the audience, budget, schedule and bidding. Use it to hang SEVERAL ad sets off ONE campaign, which is how you actually test audiences on Meta (one ad set per audience, same campaign, same creative). Takes the same full targeting, pixelId/conversionEvent, bidStrategy, schedule and budget fields as create_meta_ad. Created PAUSED and read back from Meta. It has NO ads until you call create_meta_ad(adSetId:…).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoad set name
pageIdNoPage id; omit = first Page
countryNo2-letter shorthand when you are not passing full targeting (default US)
endTimeNoREQUIRED with lifetimeBudgetUsd
minRoasNoREQUIRED for LOWEST_COST_WITH_MIN_ROAS, e.g. 1.1
pixelIdNoMeta Pixel id — with this the ad set optimizes for a real CONVERSION instead of falling back to link clicks
startTimeNoISO-8601 with offset, e.g. 2026-08-01T09:00:00-0700
targetingNofull Meta ad-set targeting — age, gender, geo, interests, behaviours, audiences, languages, placements, devices. Use EXACTLY these key names: an unrecognised one (e.g. geoLocations) is REFUSED by name — it is never dropped, because a dropped geo key used to fall back to targeting the United States.
campaignIdYesthe campaign this ad set belongs to
adAccountIdYesad account id (act_… or digits)
bidStrategyNo
bidAmountUsdNoREQUIRED for a bid cap / cost cap
billingEventNodefault IMPRESSIONS
adsetScheduleNodayparting — minutes from midnight (0–1440), days 0=Sunday…6=Saturday
applicationIdNoapp-promotion ads
dailyBudgetUsdNoad-set daily budget USD (1–10000, default 10) — spends only once ACTIVE
objectStoreUrlNo
attributionSpecNoe.g. [{event_type:"CLICK_THROUGH",window_days:7}]
conversionEventNoPURCHASE | LEAD | COMPLETE_REGISTRATION | ADD_TO_CART | INITIATED_CHECKOUT | …
optimizationGoalNooverride, e.g. OFFSITE_CONVERSIONS / LANDING_PAGE_VIEWS / THRUPLAY / VALUE
lifetimeBudgetUsdNoa fixed total instead of a daily budget — REQUIRES endTime
customConversionIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
adSetIdNo
summaryNo
campaignIdNo
Behavior5/5

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

Beyond the annotations, the description discloses important behaviors: 'Created PAUSED and read back from Meta' and 'It has NO ads until you call create_meta_ad'. This adds significant context about the tool's side effects and lifecycle, exceeding what annotations alone provide.

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 four tight sentences, front-loaded with the core purpose, followed by usage, parameter relationship, and behavioral notes. Every sentence earns its place with no redundancy.

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?

Given the tool's complexity (22 parameters, nested objects) and the presence of an output schema and detailed field descriptions, the description covers the essential context: purpose, usage pattern, relationship to create_meta_ad, and the paused-at-creation behavior. It doesn't cover error cases or prerequisites beyond 'EXISTING campaign', but that's a minor gap for a create tool.

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 high (86%), so the baseline is 3. The description adds some value by grouping key fields (targeting, pixelId/conversionEvent, bidStrategy, schedule, budget) and referencing create_meta_ad, but it doesn't add syntax or format details beyond what the schema already 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 clearly identifies the tool as creating an ad set on an existing Meta campaign, specifying it as the level holding audience, budget, schedule and bidding. It distinguishes itself from siblings like create_meta_ad and create_meta_campaign by explicitly stating it creates an ad set, not an ad or campaign.

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 explicitly tells when to use this tool: 'Use it to hang SEVERAL ad sets off ONE campaign, which is how you actually test audiences on Meta'. It also provides sequencing guidance by noting that the ad set has no ads until create_meta_ad is called, and names create_meta_ad as a related tool.

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

create_meta_audienceCreate a Meta custom audience or lookalikeAInspect

Build a retargeting audience on a connected Meta ad account. Three kinds: kind:"website" (people whose visited URL contains urlContains, seen by pixelId — pass the brand’s own domain for "all visitors"; retentionDays up to 180), kind:"engagement" (people who did event on the brand’s Facebook Page, or its Instagram business profile with source:"instagram"; retentionDays up to 730), or kind:"lookalike" (sourceAudienceId + country + ratio 0.01–0.20, lookalikeType "similarity" or "reach"). CREATING AN AUDIENCE SPENDS NOTHING — it is a definition; money only moves when an ad set targets it and that campaign is activated through set_meta_campaign_status(confirm:true). Meta needs roughly 30 minutes and ~1,000 people before a new audience can be targeted, so a fresh one reporting no size is normal. Customer-list uploads are deliberately NOT supported here (hashed personal data + Meta’s Custom Audience Terms) — send the user to Ads Manager for those.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYeswhich kind of audience to build
nameYesaudience name
eventNoengagement: page_engaged | page_visited | page_liked | page_messaged | page_cta_clicked | page_or_post_save | page_post_interaction — or ig_business_profile_all | ig_business_profile_engaged | ig_user_messaged_business | ig_business_profile_visit
ratioNolookalike: 0.01–0.20 = the top 1%–20% most similar people in that country (default 0.01)
pageIdNoengagement: which connected Page (required only if the brand has several)
sourceNoengagement: Facebook Page (default) or the linked Instagram business profile
countryNolookalike: 2-letter country to build it in
pixelIdNowebsite: the Meta Pixel that sees the traffic
prefillNowebsite/engagement: seed it with activity from BEFORE the audience existed (default true)
adAccountIdYesad account id (act_… or digits)
descriptionNo
urlContainsNowebsite: the URL fragment that defines the audience (your domain = all visitors)
lookalikeTypeNolookalike: similarity (tighter) or reach (broader) — default similarity
retentionDaysNohow long someone stays in it — website max 180, engagement max 730 (default 30)
startingRatioNolookalike: optional lower bound, must be less than ratio
sourceAudienceIdNolookalike: the existing audience to model (from list_meta_audiences)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
kindNo
summaryNo
audienceNo
verifiedNo
audienceIdNo
Behavior5/5

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

Beyond the readOnlyHint:false annotation, the description discloses critical behaviors: 'CREATING AN AUDIENCE SPENDS NOTHING — it is a definition', the 30-minute/1,000-person targeting delay, and that a fresh audience with no size is normal. It also explains why customer-list uploads are excluded (hashed data + Meta's terms). This adds significant behavioral context not present in 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.

Conciseness5/5

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

The description is dense but well-structured: it leads with the core purpose, breaks down the three kinds in a compact parenthetical style, then covers cost behavior, timing expectations, and exclusions. Every sentence delivers unique information without redundancy. Despite its length, it earns its place with high information density.

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 tool with 16 parameters and three audience types, this description is remarkably complete. It covers purpose, per-kind parameter requirements, behavioral caveats, timing, and an explicit exclusion. The output schema exists, so return values need no explanation. The only minor gap is not detailing every individual parameter, but the schema covers that, so the description fills the right contextual gaps.

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 description coverage is 94%, so baseline is 3. The description adds value by grouping parameters per kind and explaining their interrelationships: for website, urlContains + pixelId define the audience; for lookalike, sourceAudienceId + country + ratio work together; it also clarifies defaults like ratio 0.01–0.20 and retentionDays caps. This goes beyond individual schema descriptions to explain how parameters operate as a system.

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 specific verb and resource: 'Build a retargeting audience on a connected Meta ad account.' It then enumerates the three distinct kinds (website, engagement, lookalike), clearly distinguishing this tool from siblings like create_meta_adset or create_meta_campaign. The purpose is unambiguous and specific.

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?

The description provides explicit usage context: use for retargeting audiences, and for lookalikes. It explicitly states when NOT to use it ('Customer-list uploads are deliberately NOT supported here') and directs users to Ads Manager as an alternative. It also explains the workflow tie-in with set_meta_campaign_status, clarifying when spend actually happens. This is strong guidance with clear exclusions.

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

create_meta_campaignCreate a Meta ad campaign (paused)AInspect

Create a campaign on a connected Meta ad account. Always created PAUSED — it spends NOTHING until you activate it with set_meta_campaign_status(confirm:true). Optionally set a dailyBudgetUsd. Pass adAccountId (from list_meta_pages) + an objective. Needs ads-management permission on the connected account.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYescampaign name
objectiveNodefault OUTCOME_TRAFFIC
adAccountIdYesad account id (digits or act_… — from list_meta_pages)
dailyBudgetUsdNooptional campaign daily budget in USD (1–10000); real spend once ACTIVE

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
statusNo
campaignIdNo
dailyBudgetUsdNo
Behavior4/5

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

Beyond annotations, the description discloses the critical paused-state behavior: it spends nothing until activated, which is essential for safe use. It also mentions the permission requirement, adding context not present in annotations.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the crucial paused-state fact, and every clause contributes useful information without redundancy.

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 full output schema, 100% schema coverage, and annotations, the description adds essential operational context: always paused, permission requirement, and the activation path. This is sufficient for an agent to correctly invoke the tool.

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?

The input schema covers all 4 parameters with detailed descriptions, so the baseline is met. The tool description adds that dailyBudgetUsd is optional and only affects spend when active, but this is already reflected in the schema's 'real spend once ACTIVE' note. Thus little extra value beyond 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?

The description clearly states the tool creates a campaign on a connected Meta ad account, using a specific verb and resource. It distinguishes from sibling tools by emphasizing 'Always created PAUSED' and referencing activation via set_meta_campaign_status.

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 provides clear context: needs ads-management permission, adAccountId from list_meta_pages, and that activation happens through set_meta_campaign_status(confirm:true). However, it doesn't explicitly contrast with create_meta_ad or create_meta_adset, so alternatives aren't named.

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

create_microsoft_ads_adCreate a Microsoft responsive search adAInspect

Create the actual AD inside a Microsoft Advertising ad group — this is the object that carries the creative; a campaign or ad group alone shows nothing. It builds a RESPONSIVE SEARCH AD: 3–15 headlines (≤30 chars), 2–4 descriptions (≤90 chars), at least one finalUrl, optional path1/path2. Expanded text ads CANNOT be created any more — Microsoft rejects them outright. Created Paused; if the parent ad group and campaign are both Active, creating this Active starts REAL AD SPEND immediately — get an explicit yes and pass confirm:true. Read back from Microsoft, including its editorial status, before you are told it exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
path1Nodisplay-URL path segment, ≤15 chars, no "/"
path2Nosecond display-URL path segment (only with path1)
statusNodefault Paused
confirmNoREQUIRED true to create this Active in a LIVE ad group
accountIdNoMicrosoft ad account id — omit to use the brand’s single shared account
adGroupIdYesthe ad group this ad lives in
finalUrlsNothe landing page(s) — at least one is required
headlinesNo3–15 headlines, each ≤30 characters
descriptionsNo2–4 descriptions, each ≤90 characters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
adIdNo
noteNo
statusNo
adGroupIdNo
editorialStatusNo
Behavior5/5

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

It reveals that ads are Created Paused, that Active status in active parent objects triggers real ad spend, that an explicit yes and confirm:true are required, and that the tool reads back Microsoft's editorial status before confirming existence. These details go well beyond the annotation hints and are not contradictory.

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 compact despite its length, front-loading the core purpose and then packing constraints, safety warnings, and post-creation behavior into a few dense sentences. No sentence is redundant with the schema's parameter descriptions.

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 presence of an output schema and the tool's 9 parameters, the description covers the essential operational context: when to use it, what it creates, character/format constraints, activation risk, and verification behavior. It does not need to describe return values because the output schema exists.

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?

The input schema provides complete descriptions of all 9 parameters at 100% coverage, and the description largely recaps the same constraints (headline/description counts, character limits, at least one finalUrl, optional path1/path2). The description adds no new parameter-level semantics beyond the schema, so a baseline of 3 is appropriate.

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

Purpose5/5

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

The description states 'Create the actual AD inside a Microsoft Advertising ad group' and clarifies that the ad is the object that carries the creative, distinguishing it from sibling creation tools for other platforms and from campaign/ad group creation. It also specifies the ad type (responsive search ad), making the tool's purpose unmistakable.

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 context: a campaign or ad group alone shows nothing, so this tool is needed to add creative. It warns that expanded text ads cannot be created and explains the confirm:true requirement for activating in a live ad group, but it does not explicitly name an alternative sibling tool or a 'use this vs. that' comparison beyond the ad-group distinction.

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

create_microsoft_ads_ad_groupAdd a Microsoft Advertising ad groupAInspect

Add an ad group to an existing Microsoft Advertising campaign — optionally with its responsive search ad and keywords in the same call. Created Paused by default. If the parent campaign is already LIVE (Active), creating this ad group Active starts REAL AD SPEND on the next auction, exactly like activating it — show the user what would begin serving, get an explicit yes, then pass confirm:true. Leaving it Paused never needs confirmation. Read back from Microsoft before you are told it exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
adNocreate the responsive search ad in the same call
nameYesad group name, ≤256 characters
cpcBidNodefault max CPC in the account currency
statusNodefault Paused
confirmNoREQUIRED true to create this Active under a LIVE campaign
keywordsNo
languageNorequired if the campaign has no language set
accountIdNoMicrosoft ad account id — omit to use the brand’s single shared account
campaignIdYesthe campaign this ad group belongs to

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
adGroupIdNo
campaignIdNo
Behavior5/5

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

Annotations already mark the call as mutating and non-idempotent, but the description adds critical behavior: ad groups are Paused by default, Active creation under a LIVE campaign 'starts REAL AD SPEND on the next auction,' and confirm:true must follow an explicit user yes. It also requires reading back from Microsoft before confirming existence, going well beyond the structured hints.

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 four tight, front-loaded sentences with no filler: purpose, optional extras, default state, critical spend/confirmation warning, and verification step. Every sentence earns its place.

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?

This complex 9-parameter tool with nested ad/keyword objects benefits from the description's focus on the highest-risk behavior: real ad spend, confirmation, and read-back verification. Combined with the strong input schema and output schema, the description covers the decisive practical context an agent needs.

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 high at 89%, so the baseline is 3. The description adds meaningful semantics for status and confirm by linking 'Created Paused by default' and 'confirm:true' to real ad spend, which helps the agent understand the stakes, though it does not detail other params beyond what the schema already 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 opens with 'Add an ad group to an existing Microsoft Advertising campaign,' clearly naming the verb, resource, and scope. It also notes the optional responsive search ad and keywords, distinguishing this bundled creation tool from separate ad/keyword tools.

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 explicitly frames use for existing campaigns and signals when the bundled ad/keyword creation is possible. It gives clear context for the dangerous Active-under-LIVE path, but it does not explicitly name sibling tools as alternatives when you only need an ad or keywords separately.

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

create_microsoft_ads_campaignBuild a Microsoft Advertising campaign (paused)AInspect

Build a campaign on a connected Microsoft Advertising (Bing Ads) account. ALWAYS created Paused — it spends NOTHING until you activate it with set_microsoft_ads_status(confirm:true). Microsoft’s object graph is campaign → ad group → responsive search ad → keywords, so a campaign ON ITS OWN CANNOT SERVE AN IMPRESSION: pass adGroup{name, ad{headlines,descriptions,finalUrls}, keywords[]} and this builds the whole tree. Microsoft has NO atomic multi-object write (unlike Google), so the levels are created in sequence and the campaign is DELETED again if anything below it is rejected — you never inherit a half-built campaign. Microsoft requires 3–15 headlines (≤30 chars) and 2–4 descriptions (≤90 chars); expanded text ads can no longer be created at all. dailyBudget is in the ACCOUNT’S currency, not necessarily USD. LOCATION TARGETING: pass locations[] (country / region / city names, ISO country codes, or numeric Microsoft location ids). A Microsoft campaign has NO geo targeting unless it is set, and Microsoft does not require any — so if you pass none, the campaign IS CREATED and serves WORLDWIDE (Microsoft’s own default), and the returned note says so loudly. That is safe at this stage because the campaign is Paused and spends nothing; it is NOT safe to activate without telling the user, so relay the warning. Nothing is created when a location you DID name cannot be resolved (call microsoft_ads_geo_search to disambiguate, then pass the id). Pass worldwide:true to record that everywhere was deliberate and suppress the nudge. The locations are written and READ BACK inside the same rollback as the rest of the tree, so a campaign is either targeted as asked or does not exist. Everything is READ BACK from Microsoft before you are told it exists; print the returned note verbatim, and if it says the campaign cannot serve yet, say that rather than calling it a finished ad.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYescampaign name, ≤128 characters
adGroupNobuild the serving tree in the same call — WITHOUT this you get a campaign shell that can never show an ad
timeZoneNoMicrosoft time-zone enum — Microsoft requires one; default PacificTimeUSCanadaTijuana
accountIdNoMicrosoft ad account id — omit to use the brand’s single shared account
languagesNocampaign languages, e.g. ["English"]
locationsNowhere the ads may serve — omit for worldwide (Microsoft’s default, warned about in the read-back), e.g. ["United States"] or ["Seattle, Washington, United States","CA"]. Resolved to Microsoft location ids BEFORE anything is created; an ambiguous or unknown one refuses the whole create and names it
worldwideNoset true when the user DELIBERATELY wants to serve everywhere. Omitting locations already creates a worldwide campaign; this only records that it was intended, so the read-back stops nudging you to add locations
budgetTypeNodefault DailyBudgetStandard; Accelerated is Audience-campaign only
dailyBudgetYesdaily budget in the account’s currency
campaignTypeNodefault Search
locationIntentNodefault PeopleInOrSearchingForOrViewingPages — someone OUTSIDE the target still sees the ad if they search for the place; PeopleIn restricts to people physically there
excludeLocationsNolocations to EXCLUDE from the targeted set

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
accountIdNo
campaignIdNo
Behavior5/5

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

Beyond annotations (which only indicate read-only=false), the description discloses major behavioral traits: campaigns are always created Paused, creation is non-atomic with rollback deletion on failure, and results are read back from Microsoft before being reported. It also explains the worldwide default and the warning relay requirement, adding substantial context that annotations do not capture.

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

Conciseness4/5

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

The description is long but information-dense; each sentence introduces a distinct behavioral or usage point. It front-loads the most critical fact (always Paused). Minor redundancy exists (e.g., 'spends nothing' and 'safe because Paused' appear twice, and read-back is mentioned multiple times), but the complexity of the tool justifies the length.

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 high complexity (12 params, nested objects) and an output schema (not shown), the description fills in critical process details: rollback behavior, read-back verification, location resolution failure handling, and the requirement to relay the worldwide warning. It covers edge cases thoroughly, making it complete for an agent to operate correctly.

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

Parameters5/5

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

Despite 100% schema coverage, the description enriches parameter understanding: it clarifies dailyBudget is in the account's currency, locations can be names/ISO codes/IDs and are resolved before creation, worldwide=true suppresses the warning, and adGroup is mandatory for a serving campaign. It even adds constraints like 'expanded text ads can no longer be created at all' that are not in 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?

The description opens with a specific verb+resource: 'Build a campaign on a connected Microsoft Advertising (Bing Ads) account.' It further distinguishes itself from sibling tools like create_microsoft_ads_ad_group by stating 'this builds the whole tree' and that a campaign on its own cannot serve, making its unique purpose 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?

The description provides explicit when-to-use guidance: it must be used to build the complete campaign tree, and it references the activation tool set_microsoft_ads_status. It also names microsoft_ads_geo_search for location disambiguation and explains that omitting adGroup yields a campaign shell, effectively telling the user when this tool is the right choice.

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

create_onedrive_folderCreate a OneDrive folderAInspect

Create a folder in the user’s OneDrive (optionally nested under parentId) to organize saved files. Returns the folder id + webViewLink. Use that id as update_onedrive_file’s moveToFolderId or as parentId for a nested folder. NOTE: save_to_onedrive’s folder is a NAME (find-or-created), not this id.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesfolder name
parentIdNoparent folder id for a nested folder (default: OneDrive root)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
webViewLinkNo
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description adds the return format (id + webViewLink) and clarifies that the id is not a display name, but doesn't mention permissions, duplicate behavior, or rate limits. This is adequate but not particularly rich beyond the annotations.

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

Conciseness5/5

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

Three sentences, each with a distinct purpose: core action + optional nesting, return value, and usage integration note. No redundancy or fluff. The most important information 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?

The description covers purpose, nesting, return value, and relations to update_onedrive_file and save_to_onedrive. Given an output schema exists and annotations are adequate, this is nearly complete for a low-complexity tool. It could explicitly distinguish from Google Drive folder creation, but the name and content already make that evident.

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 explains both `name` and `parentId`. The description reinforces parentId's meaning and adds cross-tool context about the return id being a folder id, not a name, which indirectly clarifies the `name` parameter. This is marginal value over the schema, hence 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?

The description clearly states the verb+resource: 'Create a folder in the user’s OneDrive' and differentiates from siblings like create_drive_folder (Google Drive) and save_to_onedrive (which works by name). It also specifies optional nesting and the return value, making the tool's purpose unambiguous.

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 explicitly explains how to use the returned folder id ('Use that id as update_onedrive_file’s moveToFolderId or as parentId for a nested folder') and warns against confusing it with save_to_onedrive's name parameter. It doesn't explicitly say when to choose this over create_drive_folder, but the OneDrive scoping makes that obvious.

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

create_openai_ads_adCreate a ChatGPT Ads adAInspect

Create the actual AD inside a ChatGPT Ads ad group — the object that carries the creative; a campaign or ad group alone shows nothing at all. The creative is a TEXT + IMAGE CARD: a title of 3–50 characters, body copy of 100 characters maximum, one landing page URL and one still image. THERE IS NO VIDEO FORMAT ON THIS PLATFORM — a video URL is refused outright, so never offer one. Created paused; creating it active inside a live ad group starts REAL AD SPEND, so that needs confirm:true. OpenAI REVIEWS every ad (usually a few minutes) and the ad is read back with its review status: until that says approved the ad CANNOT show, so report the review status rather than calling it live. The landing page is also checked against robots.txt for OAI-AdsBot / OAI-SearchBot blocks — a page that blocks those agents cannot run ChatGPT ads at all, and the note says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNointernal name — defaults to the title
statusNodefault paused
confirmNoREQUIRED true to create this ACTIVE in a live ad group (real spend)
creativeYes
adGroupIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
adNo
okNo
adIdNo
noteNo
Behavior5/5

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

With annotations already indicating a write operation, the description adds substantial behavioral context: created paused, real ad spend requires confirm:true, every ad undergoes OpenAI review and cannot show until approved, and robots.txt restrictions. These go well beyond what annotations convey and are critical for the agent to act correctly.

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 but well-structured, front-loading the purpose and then covering key warnings. There is minor redundancy (video format refusal is mentioned multiple times), but each sentence contributes operational value, making it appropriately sized for the tool's complexity.

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 complex nested creative object, real-spend consequences, and an approval workflow, the description covers all essential operational aspects: format constraints, default paused state, confirm requirement, review status handling, and robots.txt checks. Output schema presumably handles return values, so the description is 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 descriptions already cover most parameter semantics (character limits, video refusal, confirm requirement, robots.txt). The description reinforces these and clarifies adGroupId as the containing ad group, but it largely duplicates schema details, so it adds only marginal value beyond structured fields.

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

Purpose5/5

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

The description clearly states that this tool creates the actual AD within a ChatGPT Ads ad group, distinguishing it from campaign/ad group creation by noting that 'a campaign or ad group alone shows nothing at all.' The verb 'Create' plus the specific resource and context give a precise purpose.

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 provides strong contextual guidance: it implies the prerequisite of having an ad group, explicitly warns that there is no video format, and instructs not to call the ad live before review. It does not explicitly name alternative tools, but the hierarchy and warnings are clear enough for correct usage.

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

create_openai_ads_ad_groupAdd a ChatGPT Ads ad groupAInspect

Add an ad group to an existing ChatGPT Ads campaign. Created PAUSED by default. Its context hints ARE the targeting on this platform: up to 2,000 natural-language descriptions of the conversations, topics or questions where this offering is relevant — not exact-match keywords, and no guarantee of delivery. Write many distinct ones rather than variations of the same phrase. If the parent campaign is already LIVE (active), creating this ad group active starts REAL AD SPEND on the next auction, exactly like activating it — show the user what would begin serving, get an explicit yes, then pass confirm:true. Leaving it paused never needs confirmation. The whole tree is READ BACK from OpenAI before you are told it exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
maxBidYesmax bid in the account currency
statusNodefault paused
confirmNoREQUIRED true to create this ACTIVE under a live campaign (real spend)
campaignIdYes
descriptionNo
billingEventNodefault click
contextHintsNoup to 2,000, deduplicated server-side

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
treeNo
adGroupIdNo
Behavior5/5

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

The description goes far beyond the annotations by disclosing that the ad group is created PAUSED by default, that context hints are natural-language targeting with no delivery guarantee, and that creating an active ad group under a live campaign triggers real spend requiring confirm:true. It also reveals that the full object tree is read back from OpenAI before existence is confirmed. These are critical behavioral traits not visible in the schema or 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 slightly longer than typical but every sentence earns its place by covering targeting semantics, spend safety, and read-back verification. It front-loads the core purpose and then layers critical warnings, making it efficient without redundancy. A more compact structure would lose necessary context.

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 tool with high complexity (spend implications, confirmation logic, targeting nuances) and an output schema, the description covers all essential behavioral and semantic context. The presence of an output schema handles return-value documentation, so the description's focus on invocation guardrails and platform-specific behavior makes it complete.

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

Parameters5/5

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

Despite schema coverage of 63%, the description adds deep value for the most nuanced parameters: contextHints are explained as up to 2,000 natural-language descriptions (not exact-match keywords) with advice to write many distinct ones, and status/confirm are clarified with the real-spend consequence. This compensates for the schema's limited descriptions of campaignId and name.

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 'Add an ad group to an existing ChatGPT Ads campaign,' giving a specific verb, resource, and parent relationship. It clearly distinguishes from sibling tools like create_openai_ads_ad and create_openai_ads_campaign, and the mention of 'context hints ARE the targeting on this platform' adds unique platform-specific purpose.

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 provides clear context for when to use the tool (adding an ad group to an existing campaign) and includes critical guidance on when confirmation is needed (active under a live campaign) versus when it is not (paused). However, it does not explicitly name alternative tools or state 'use this instead of X,' so it falls short of a 5.

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

create_openai_ads_audienceCreate a ChatGPT Ads custom audienceAInspect

NOT YET AVAILABLE — ChatGPT Ads requires a customer list to be uploaded as a FILE and OpenAI does not document where that file id comes from, so this refuses cleanly rather than fail with an unreadable vendor error (verified live 2026-08-05). Build the audience in ChatGPT Ads Manager and list_openai_ads_audiences will see it. Pass plain emails and/or phone numbers: Hermoso NORMALISES AND SHA-256 HASHES THEM LOCALLY and sends only the digests, so no plaintext personal data leaves Hermoso — say that to the user rather than implying their list was uploaded raw. Values that are neither an email nor a phone number are skipped and counted, never silently dropped. An audience is a definition and cannot spend.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
membersYesemails and/or phone numbers (already-SHA256-hashed emails are passed through as-is)
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
noteNo
rejectedNo
audienceIdNo
membersSentNo
Behavior5/5

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

Beyond the sparse openWorldHint annotation, the description discloses key behavioral traits: clean refusal, local normalization and SHA-256 hashing, sending only digests, skipping/counting invalid values, and the fact that an audience cannot spend. It even provides user-facing phrasing ('say that to the user'), which is unusually rich transparency.

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 longer than average but every sentence carries important information: unavailability, refusal reason, workaround, hashing privacy, invalid-value handling, and semantic note. It is front-loaded with the most critical warning. Slightly verbose, but justified by the tool's unique non-functional status.

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 tool that is currently non-functional, this description is remarkably complete. It explains what will happen on invocation, how to achieve the intended outcome through an alternative, and what happens to the input data. With an output schema present, return-value documentation is not needed, and the description fully covers the unusual context.

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?

The schema has only 33% coverage (only members is described), so the description must compensate. It adds substantial meaning for members: plain emails/phones, local hashing, pass-through of already-hashed emails, and skip/count behavior. However, the 'name' and 'description' parameters are not explained in the description at all, leaving them to inference from their names.

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 explicitly states that the tool is NOT YET AVAILABLE and will refuse cleanly rather than fail with an unreadable vendor error, while also explaining the nominal purpose (creating a ChatGPT Ads audience from emails/phones). It distinguishes itself from the sibling list_openai_ads_audiences by noting that audiences built in Manager will be visible there.

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?

The description gives explicit guidance: build the audience in ChatGPT Ads Manager instead, and use list_openai_ads_audiences to verify it. It also warns that this tool refuses, so an agent knows not to rely on it for creating the audience. This is strong, actionable 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.

create_openai_ads_campaignBuild a ChatGPT Ads campaign (paused)AInspect

Build a campaign on the connected ChatGPT Ads account — the ads that appear below ChatGPT answers. ALWAYS created PAUSED at every level, with no override: it spends NOTHING until you activate it with set_openai_ads_status(confirm:true). The object graph is campaign → ad group → ad, and a campaign ON ITS OWN CANNOT SERVE AN IMPRESSION, so pass adGroup{name, maxBid, contextHints, ad{creative}} and this builds the whole tree. THE CREATIVE IS A TEXT + IMAGE CARD AND NOTHING ELSE — title 3–50 characters, body 100 maximum, one landing page, one still image. THERE IS NO VIDEO ON THIS CHANNEL: never offer a video ad here, and if the brand only has video, pull a frame from it first. TARGETING IS SEMANTIC: context hints are natural-language descriptions of the conversations where this ad belongs (up to 2,000 per ad group). They guide matching, they are NOT exact-match keywords, and they do not guarantee delivery. OpenAI’s own guidance is BREADTH — many genuinely distinct hints and many distinct title/body angles beat one message repeated — which is exactly what plan_variations and mine_angles produce. OpenAI has no atomic multi-object write available here, so the whole tree is VALIDATED before the first write; if a level below the campaign is still rejected, the campaign is left PAUSED (spending nothing) and the note says exactly what exists — nothing is archived behind your back, because archiving is irreversible. Everything is READ BACK from OpenAI before you are told it exists: print the returned note verbatim, and if it says the campaign cannot serve yet, say that rather than calling it a finished ad.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYescampaign name, at least 3 characters
adGroupNobuild the ad group (and its ad) in the same call — a campaign alone cannot serve
endTimeNounix seconds
countriesNo2-letter country codes
startTimeNounix seconds
biddingTypeNodefault clicks (CPC). OpenAI suggests starting at a 3–5 max bid per click.
dailyBudgetNodaily cap in the AD ACCOUNT’S currency — ChatGPT Ads’ own minimum for a DAILY budget is 25.00
descriptionNo
locationIdsNoids from openai_ads_geo_search — up to 2,500
lifetimeBudgetNolifetime cap in the account currency — no 25.00 floor applies here, so use this to spend less than that in total. Pass this and/or dailyBudget; a budget is required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
treeNo
adGroupIdNo
campaignIdNo
Behavior5/5

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

With annotations only stating readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false, the description adds substantial behavioral context: the tool always creates paused entities, validates the entire tree before the first write, leaves the campaign paused (spending nothing) if a nested level fails, never archives anything because archiving is irreversible, and reads back from OpenAI before confirming existence. This goes far beyond the annotations, disclosing failure modes and safety guarantees.

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 critical operational knowledge—safety, activation, validation, failure handling, creative constraints, targeting, and budget floors. It is front-loaded with the most important constraint ('ALWAYS created PAUSED') and uses clear emphasis (caps) for hard rules. There is no filler or repetition; the length is justified by the tool's complexity.

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 (nested objects, 10 parameters, multiple constraints, external API behavior), the description covers all essential aspects: what it does, safety (paused, spends nothing), how to activate, what not to do (video), object graph construction, validation and partial-failure semantics, read-back verification, budget minimums, and targeting guidance. An agent could confidently invoke this tool correctly without needing additional context.

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

Parameters5/5

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

Even with 90% schema coverage, the description adds meaning well beyond the schema. For example, it explains that adGroup is required to build the whole tree because 'a campaign ON ITS OWN CANNOT SERVE AN IMPRESSION.' It details contextHints as natural-language, semantic, up to 2,000, and not exact-match keywords. It specifies creative constraints (text+image only, no video, title 3–50, body 100 max, one landing page) and clarifies lifetimeBudget has no 25.00 floor unlike dailyBudget. This is rich semantic guidance.

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 specific verb and resource: 'Build a campaign on the connected ChatGPT Ads account — the ads that appear below ChatGPT answers.' This clearly distinguishes it from sibling campaign builders like create_google_ads_campaign or create_linkedin_ads_campaign by naming the exact ad channel and placement. The scope (whole object tree) is also explicit, leaving no ambiguity about what the tool does.

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

Usage Guidelines5/5

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

The description gives explicit when/when-not usage: 'ALWAYS created PAUSED at every level, with no override' and tells the agent to activate via set_openai_ads_status(confirm:true). It also warns 'never offer a video ad here' and suggests pulling a frame if the brand only has video. It further references plan_variations and mine_angles for generating the recommended breadth, naming direct alternatives and complementary tools.

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

create_openai_ads_conversion_eventDefine a ChatGPT Ads conversionAInspect

Define what counts as a conversion on ChatGPT Ads, measured from one or more pixels. THIS IS THE PREREQUISITE for a conversion-optimised campaign: pass the returned id as conversionEventSettingIds to create_openai_ads_campaign. Creating one cannot spend and cannot serve — it is a definition, so it is not confirm-gated.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
eventTypeYesthe action that counts as a conversion, e.g. "purchase", "lead", "signup"
sourceIdsYespixel id(s) this event is measured from — from create_openai_ads_pixel
customEventNameNofor a non-standard event
attributionWindowDaysNo1-90

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
noteNo
eventTypeNo
conversionEventSettingIdNo
Behavior4/5

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

Annotations only include openWorldHint, so the description carries the burden of disclosing side effects. It does so well by stating the tool is a definition, 'cannot spend and cannot serve,' and 'is not confirm-gated.' This goes beyond the annotation and gives the agent critical information about immediate execution and lack of financial impact.

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 sentences, front-loads the core purpose, and then provides actionable workflow guidance. Every clause earns its place: the prerequisite relationship, the non-spending/non-serving safety, and the non-confirmation behavior. No waste.

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?

This tool is part of a multi-step campaign setup, and the description connects it to create_openai_ads_campaign and pixel creation. It explains the non-confirm-gated behavior and the return value usage. Since an output schema exists and the input schema is well-documented, the description sufficiently covers the tool's role and context.

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 (80%), with descriptions for eventType, sourceIds, customEventName, and attributionWindowDays. The description adds little beyond the schema, though it reinforces that sourceIds are pixel IDs from create_openai_ads_pixel. No new parameter semantics are introduced.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Define what counts as a conversion on ChatGPT Ads, measured from one or more pixels.' It uses a specific verb ('define') and resource ('conversion event'), and distinguishes it from siblings by noting it is a prerequisite definition step, not an actual ad-serving or spending action.

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 explicitly tells when to use this tool: 'THIS IS THE PREREQUISITE for a conversion-optimised campaign: pass the returned id as conversionEventSettingIds to create_openai_ads_campaign.' It also clarifies that creating one 'cannot spend and cannot serve,' which helps the agent understand it is a safe setup step. It doesn't explicitly mention alternatives like listing existing events, but the workflow context is strong.

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

create_openai_ads_pixelCreate a ChatGPT Ads pixelAInspect

Create a ChatGPT Ads web pixel — the thing that observes actions on the site. IT RECORDS NOTHING until its snippet is installed on the site, so say that rather than implying tracking is live. A pixel is a measurement definition and cannot spend. The next step is create_openai_ads_conversion_event, which says WHICH observed action counts as a conversion.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesa name for the pixel

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
noteNo
pixelIdNo
Behavior5/5

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

Goes beyond the minimal openWorldHint annotation by disclosing key behavioral traits: the pixel records nothing until its snippet is installed, is only a measurement definition, and cannot spend. This corrects common misconceptions and adds significant value.

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 definition, followed by crucial caveats and a next-step pointer. No wasted words; the all-caps emphasis is purposeful for clarity.

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 single well-defined parameter and an output schema present, the description covers the tool's nature, limitations, and next step, making it complete for an agent to select and invoke 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?

The only parameter 'name' is fully described in the schema as 'a name for the pixel' (100% coverage). The description doesn't add additional parameter-level meaning, so baseline 3 is appropriate.

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

Purpose5/5

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

Description uses a specific verb+resource pair: 'Create a ChatGPT Ads web pixel' and explains its function as 'the thing that observes actions on the site.' It also distinguishes the pixel from conversion events by pointing to create_openai_ads_conversion_event as the next step, making the purpose clear among siblings.

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

Usage Guidelines4/5

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

Provides clear context: creates a measurement definition, records nothing until snippet installed, and cannot spend. It names create_openai_ads_conversion_event as the next step, giving alternative/next-tool guidance, though it doesn't explicitly list when-not-to-use scenarios.

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

create_pinterest_ads_adCreate a Pinterest adAInspect

Create the actual AD inside a Pinterest ad group — this is the object that carries the creative; a campaign or ad group alone shows nothing. A Pinterest ad PROMOTES AN EXISTING PIN, so pass pinId (post_to_pinterest returns one). Created PAUSED; if the parent ad group and campaign are both ACTIVE, creating this ACTIVE starts REAL AD SPEND immediately — get an explicit yes and pass confirm:true. Pinterest reviews ads: the read-back reports the review status and any rejection reason, and a REJECTED ad never serves until it is fixed.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
pinIdYesthe numeric id of an existing Pin — a Pinterest ad PROMOTES a Pin, so create one with post_to_pinterest first if there is nothing to promote
statusNodefault PAUSED
confirmNoREQUIRED true to create this ACTIVE in a live ad group
adGroupIdYesthe ad group this ad lives in
adAccountIdNo
creativeTypeNodefault REGULAR
destinationUrlNowhere the click goes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
adIdNo
noteNo
statusNo
adGroupIdNo
reviewStatusNo
Behavior5/5

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

Discloses default PAUSED status, the real-spend risk when ACTIVE, and Pinterest's review process with rejection details. These behaviors go beyond the annotations (readOnlyHint false, destructiveHint false) by explaining the financial and post-creation consequences.

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 focused sentences cover purpose, pin prerequisite, spend risk/confirmation, and review outcome. No filler; each clause carries necessary operational or safety 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?

Covers all key operational facts: what the ad is for, what to pass, safety confirmation, and post-creation review behavior. With an output schema present, the read-back details don't need further explanation. The description is complete enough for an agent to select and invoke the tool safely.

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?

Adds meaning to pinId (source from post_to_pinterest) and confirm (required for ACTIVE in a live group), and clarifies created-PAUSED default. While the schema covers 75% of parameters, the description's emphasis on the dangerous ACTIVE path and pin prerequisite provides valuable context 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?

The description opens with 'Create the actual AD inside a Pinterest ad group' — a specific verb+resource that clearly distinguishes this from campaign or ad group creation. It also clarifies the ad promotes an existing pin and that a campaign or ad group alone shows nothing, reinforcing its unique role among sibling tools.

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?

The description explicitly instructs the agent to pass pinId from post_to_pinterest, implying a prerequisite step if no pin exists. It also warns that creating ACTIVE in an ACTIVE parent starts real ad spend and requires confirm:true, providing clear when-to-use and safety guardrails.

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

create_pinterest_ads_ad_groupAdd a Pinterest ad groupAInspect

Add an ad group to an existing Pinterest campaign — optionally with its ad in the same call. Created PAUSED by default. Pinterest REQUIRES every ad group to target at least one place, so targetingSpec must carry a GEO array or a LOCATION object. If the parent campaign is already LIVE (ACTIVE), creating this ad group ACTIVE starts REAL AD SPEND on the next auction, exactly like activating it — show the user what would begin serving, get an explicit yes, then pass confirm:true. Leaving it paused never needs confirmation. Read back from Pinterest before you are told it exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
adNocreate the ad in the same call
bidNoREQUIRED — what you pay per billable event, in the ad account’s currency. Pinterest rejects an ad group without one and Hermoso will not invent a bid. It must also be BELOW the campaign budget and above Pinterest’s own bid floor for the placement, both of which Pinterest states in its refusal.
nameYesad group name
budgetNoad-group budget — only valid when the campaign is NOT budget-optimized (Pinterest optimizes at campaign level by default)
pacingNo
statusNodefault PAUSED
confirmNoREQUIRED true to create this ACTIVE under a LIVE campaign
campaignIdYesthe campaign this ad group belongs to
adAccountIdNo
billableEventNoLEAVE THIS OUT unless you know better — Pinterest ties it to the campaign objective and refuses a mismatch: CONSIDERATION takes CLICKTHROUGH; AWARENESS, SALES, LEADS, WEB_CONVERSION, VIDEO_COMPLETION and APP_INSTALL take IMPRESSION; CATALOG_SALES takes either. Omitted → the right one for the objective is used.
targetingSpecNoPinterest targeting object, e.g. {"GEO":["US"],"AGE_BUCKET":["25-34","35-44"]} — at least one GEO or LOCATION is REQUIRED by Pinterest. Age: use AGE_BUCKET, or MINIMUM_AGE and MAXIMUM_AGE TOGETHER (18–65, with "65+" allowed as the maximum) — a minimum on its own is refused.
placementGroupNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
adGroupIdNo
campaignIdNo
Behavior5/5

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

The description reveals important behavioral traits beyond annotations: default state is PAUSED, creating ACTIVE under a LIVE campaign triggers real ad spend and requires confirm:true, and resulting records may not be immediately visible ('Read back from Pinterest before you are told it exists'). This aligns with openWorldHint and adds valuable operational context.

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?

Five sentences, all information-dense, with the purpose in the opening clause. Each sentence earns its place: scope, default, targeting requirement, spend/confirmation, and eventual consistency. No redundancy.

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 12 parameters, nested objects, and an output schema, the description covers the essential non-obvious context: confirmation for spend, targeting requirement, default state, and read-back behavior. The schema handles parameter details, and the output schema covers return values, so nothing critical 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?

The schema already covers 75% of parameters with descriptions, but the description adds crucial semantics for targetingSpec (must include GEO or LOCATION) and the confirm parameter (required true for ACTIVE under LIVE). It also clarifies the optional ad nesting and default paused status, going beyond the schema fields.

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 begins with a specific verb and resource: 'Add an ad group to an existing Pinterest campaign,' clearly distinguishing it from sibling tools like create_pinterest_ads_campaign and create_pinterest_ads_ad by specifying the scope (ad group) and the optional in-call ad creation.

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 provides clear context: ad groups belong to an existing campaign and can optionally include an ad, implying when to use this over separate ad/ad campaign tools. It does not explicitly name alternatives or state when not to use, but the prerequisite ('existing campaign') and targeting requirement give sufficient guidance.

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

create_pinterest_ads_campaignBuild a Pinterest ad campaign (paused)AInspect

Build a campaign on a connected Pinterest ad account. ALWAYS created PAUSED — worth knowing that Pinterest’s own API defaults new campaigns to ACTIVE, so this deliberately overrides that; it spends NOTHING until you activate it with set_pinterest_ads_status(confirm:true). Pinterest’s object graph is campaign → ad group → ad, and an ad PROMOTES AN EXISTING PIN, so a campaign ON ITS OWN CANNOT SERVE AN IMPRESSION: pass adGroup{name, targetingSpec, ad{pinId}} and this builds the whole tree. Pinterest has NO atomic multi-object write, so the levels are created in sequence and the campaign is ARCHIVED again if anything below it is rejected (Pinterest has no delete) — you never inherit a half-built campaign. Budgets are ordinary amounts in the ad account’s currency; the micro-currency conversion Pinterest requires is handled for you. Every ad group must target at least one place. Everything is READ BACK from Pinterest before you are told it exists; print the returned note verbatim, and if it says the campaign cannot serve yet, say that rather than calling it a finished ad.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYescampaign name, ≤255 characters
adGroupNobuild the serving tree in the same call — WITHOUT this you get a campaign shell that can never show an ad
endTimeNoUnix timestamp in SECONDS
objectiveYesPinterest requires an objective and will not guess one
startTimeNoUnix timestamp in SECONDS
adAccountIdNo
dailyBudgetNodaily cap in the ad account’s currency
lifetimeBudgetNolifetime cap instead of a daily one — Pinterest then requires endTime

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
statusNo
campaignIdNo
adAccountIdNo
Behavior5/5

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

It reveals that Pinterest's API defaults to ACTIVE but this tool overrides to PAUSED, that writes are non-atomic with archiving on failure, that currency conversion is handled, and that objects are read back before confirmation. These add substantial context beyond the annotations, which only cover readOnly/openWorld/idempotent/destructive hints.

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 dense but each sentence contributes a distinct warning or operational detail. It front-loads the core purpose and paused state, then adds critical caveats without redundancy.

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 tool with nested objects and external API behavior, the description covers creation, activation, failure handling, budget semantics, targeting rules, and output handling. It is complete enough for an agent to invoke the tool correctly without additional documentation.

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 schema already covers 88% of parameters with descriptions, but the description adds structural guidance (pass adGroup{name, targetingSpec, ad{pinId}}), clarifies that budgets are in account currency and conversion is handled, and warns about the targeting requirement. This goes beyond the schema, though the schema does much of the work.

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 'Build a campaign on a connected Pinterest ad account', clearly stating the verb, resource, and scope. It distinguishes itself from sibling tools like create_pinterest_ads_ad and create_pinterest_ads_ad_group by explaining that it builds the entire campaign → ad group → ad tree in one call.

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 explicitly states that a campaign alone cannot serve an impression and instructs to pass adGroup with ad pinId to build the whole tree. It also tells the agent to use set_pinterest_ads_status(confirm:true) to activate, and explains the paused default, giving clear when-to-use and when-not-to-use guidance.

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

create_pinterest_boardCreate a Pinterest boardAInspect

Create a board on the connected Pinterest account. Needed because a Pin cannot exist without a board, and a NEW Pinterest business account has none — if list_pinterest_boards comes back empty, make one here rather than telling the user you can't pin. Boards are PUBLIC unless you pass privacy 'SECRET'; a Pin on a secret board is invisible to everyone, so only choose that if the user asked for it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesboard name, e.g. "Product launches" — keep it something a real Pinterest audience would browse
privacyNodefault PUBLIC. SECRET hides the board and every Pin on it from everyone but the account owner.
descriptionNooptional board description (≤500 chars)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNo
nameNo
privacyNo
Behavior5/5

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

Adds valuable behavioral context beyond annotations: boards are PUBLIC by default, SECRET boards hide Pins from everyone, and new business accounts have no boards. This helps the agent anticipate user-visible consequences of the action.

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 focused sentences, each earning its place: action, necessity/when-to-use, and privacy behavior. Front-loaded with the core purpose and 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 create tool, the description covers purpose, prerequisites, privacy defaults, and exclusion criteria. It works well with the rich schema and output schema, leaving no critical gaps for an agent to misuse it.

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 adds semantics beyond the schema by explaining the real-world need for the name ('something a real Pinterest audience would browse') and reiterating the SECRET privacy implication, which enriches parameter understanding.

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 specific action and resource: 'Create a board on the connected Pinterest account.' It distinguishes itself from siblings by explicitly referencing list_pinterest_boards and explaining that this tool is the way to create a board when none exist.

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: if list_pinterest_boards returns empty, create one here rather than telling the user you can't pin. It also gives a clear exclusion for privacy: only choose SECRET if the user asked for it.

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

create_reddit_ads_adCreate a Reddit adAInspect

Create the ad itself — the object that binds a POST (the creative) to an AD GROUP (the targeting and budget). Create the post first with create_reddit_ads_post and pass its id as postId; without a post there is nothing to show. ALWAYS created PAUSED, and Reddit additionally has to APPROVE it, so a fresh ad reports effective status PENDING_APPROVAL — report that rather than calling it live. GOTCHA: a TEXT ("free form") post’s ad may not carry clickUrl at all — Reddit refuses it. The click destination for image and link ads lives on the POST’s media destinationUrl, not here.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
postIdYesthe post to promote (t3_…) from create_reddit_ads_post or list_reddit_ads_posts
clickUrlNoleave unset for TEXT-post ads — Reddit rejects "Free form ads cannot have a click url"
adGroupIdYesthe ad group whose targeting and budget this ad runs under
adAccountIdNo
eventTrackersNothird-party measurement URLs; only Reddit-approved providers are accepted
redditProfileIdNothe post author profile — required for catalog sales campaigns

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
noteNo
postIdNo
statusNo
effectiveStatusNo
Behavior5/5

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

The description goes well beyond the minimal annotations by disclosing critical behavioral traits: ads are 'ALWAYS created PAUSED', require Reddit approval, and report effective status 'PENDING_APPROVAL'. It also reveals the clickUrl rejection for free-form posts and where click destinations actually live, which is essential for correct agent expectations.

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 dense but every sentence provides necessary operational detail. It is front-loaded with the core definition, then flows into prerequisites, status expectations, and a high-value gotcha, with no filler or redundancy.

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 and the presence of an output schema, the description fully covers the creation workflow, status semantics, and the critical clickUrl constraint. It is complete enough for an agent to invoke the tool correctly without additional context.

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

Parameters5/5

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

Even though schema coverage is 71%, the description adds substantial parameter-level meaning not present in the schema: postId comes from create_reddit_ads_post, clickUrl must be unset for TEXT-post ads, and the click destination for image/link ads is on the post's destinationUrl. This directly helps the agent avoid parameter misuse.

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

Purpose5/5

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

The description clearly states the tool's function: 'Create the ad itself — the object that binds a POST (the creative) to an AD GROUP (the targeting and budget).' It uses a specific verb and resource and distinguishes the ad from sibling tools like create_reddit_ads_post and create_reddit_ads_ad_group by explaining the binding relationship.

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?

The description provides explicit usage guidance: 'Create the post first with create_reddit_ads_post and pass its id as postId; without a post there is nothing to show.' It also gives a when-not-to guidance for clickUrl on TEXT-post ads, steering the agent away from a known failure mode.

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

create_reddit_ads_ad_groupCreate a Reddit ad group (targeting, budget, bidding, schedule)AInspect

Create an ad group under an existing Reddit campaign — this is the tier that holds the budget, the bid and ALL the targeting. ALWAYS created PAUSED; it spends nothing until set_reddit_ads_status(confirm:true). Reddit requires more here than most platforms and refuses the create without it: a bidType, a bidStrategy, a startTime, a budget with its goalType, a bidAmount whenever the bid type is a paid rate, and a conversion pixel (resolved automatically when the ad account has exactly one). THE BID TYPE MUST FIT THE CAMPAIGN’S OBJECTIVE — a CLICKS campaign takes CPC and refuses CPM; Reddit’s error says which. Money is ordinary amounts in the ad account’s currency (micro-currency is handled for you). Resolve community names and interest ids with search_reddit_ads_targeting first, and consider reddit_ads_forecast + reddit_ads_bid_suggestion before committing. Everything is READ BACK from Reddit before you are told it exists — print the returned note verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
budgetYesbudget in the ad account’s currency, paired with goalType
bidTypeYesmust fit the campaign objective — CLICKS campaigns take CPC
endTimeNo
goalTypeNodefault DAILY_SPEND
scheduleNoweekly dayparting windows — omit to run all week
bidAmountNobid in the ad account’s currency — required for paid bid types; ask reddit_ads_bid_suggestion
startTimeYesISO 8601, e.g. 2026-08-15T00:00:00Z — Reddit rejects the create without one
targetingNo
campaignIdYesthe campaign this ad group belongs to
adAccountIdNo
bidStrategyYesMANUAL_BIDDING needs bidAmount
savedAudienceIdNoreuse a saved audience instead of spelling targeting out — from list_reddit_ads_saved_audiences
optimizationGoalNocannot be changed later
conversionPixelIdNoonly needed when the ad account has more than one pixel

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
noteNo
budgetNo
statusNo
effectiveStatusNo
Behavior5/5

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

The description adds significant behavioral context beyond annotations: groups are always created paused, Reddit requires a specific set of fields, bid type/objective mismatches are rejected, micro-currency is handled automatically, and everything is read back from Reddit before confirmation. No contradictions with annotations.

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

Conciseness5/5

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

The description is dense but well-structured, opening with a clear purpose and then layering essential warnings, workflow, and post-create behavior. Every sentence adds value with no redundancy or 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 (15 parameters, nested targeting object) and the presence of an output schema, the description covers prerequisites, error conditions, activation workflow, and complementary tools. It is fully adequate for an AI agent to select and invoke the tool correctly.

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

Parameters5/5

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

Schema coverage is 73%, and the description meaningfully enriches it: it explains conditional requirements like bidAmount for paid bid types, conversion pixel auto-resolution, pairing of budget with goalType, and how to resolve community names and interest IDs. It also clarifies that startTime is mandatory in practice.

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

Purpose5/5

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

The description clearly states 'Create an ad group under an existing Reddit campaign' with a specific verb and resource. It further distinguishes this tier as holding budget, bid, and ALL targeting, setting it apart from sibling ad-group creation tools on other platforms.

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 and how: the ad group is always created PAUSED and activated via set_reddit_ads_status(confirm:true). It recommends prior steps (search_reddit_ads_targeting, reddit_ads_forecast, reddit_ads_bid_suggestion) and warns that bid type must match the campaign objective, with Reddit refusing mismatches.

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

create_reddit_ads_audienceCreate a Reddit custom audience (customer list)AInspect

Create an empty custom audience on a Reddit ad account, then fill it with update_reddit_ads_audience_users. Reddit only supports ONE kind of audience through the API — an uploaded CUSTOMER LIST matched on hashed emails and mobile advertising ids; pixel-retargeting, engagement and lookalike audiences are built by Reddit itself in Ads Manager and cannot be created here. The audience arrives empty and stays unusable until it matches roughly 1,000 redditors, and Reddit takes up to 4 hours to show a size change and up to 36 hours to finish processing a list — so do not create, upload and then report success on reach in the same breath. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYeswhat this list is, e.g. "Purchasers – last 180 days"
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
noteNo
typeNo
statusNo
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, openWorldHint=true), the description discloses important behavioral traits: the audience starts empty and unusable until it matches ~1,000 redditors, processing takes up to 4 hours for size changes and up to 36 hours to complete, and the tool is free. This significantly helps set expectations for the agent.

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 detailed but every sentence contributes value: what it does, what it doesn't do, timing expectations, and cost. It avoids fluff and is well-structured, making it easy to parse.

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?

The description covers the tool's full lifecycle context: creation, subsequent filling, matching threshold, processing delays, and limitations. With an output schema present, return values need not be described, and the description goes beyond the minimum by providing operational guidance (e.g., 'do not create, upload and then report success on reach in the same breath').

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 50% schema coverage, the description adds some context—'on a Reddit ad account' implies the role of adAccountId, and the tool's purpose clarifies that name identifies the audience. However, it does not explicitly explain adAccountId format or requiredness beyond what the schema provides. The description is adequate but does not fully compensate for the undocumented parameter.

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

Purpose5/5

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

The description clearly states the tool's function: 'Create an empty custom audience on a Reddit ad account, then fill it with update_reddit_ads_audience_users.' It specifies the resource (Reddit custom audience) and the action (create), and distinguishes it from other audience types by noting that only customer list audiences are supported through the API.

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?

The description explicitly tells when to use this tool (to create a customer-list based audience) and when not to (pixel-retargeting, engagement, and lookalike audiences cannot be created here). It also guides the next step: 'fill it with update_reddit_ads_audience_users.' This provides clear context and alternatives.

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

create_reddit_ads_campaignCreate a Reddit campaignAInspect

Create the top tier of a Reddit ad — the campaign, which sets the OBJECTIVE everything under it optimises toward and (optionally) a lifetime spend cap. ALWAYS created PAUSED, with no override; it spends nothing until set_reddit_ads_status(confirm:true). Pick the objective deliberately, because the ad group’s bid type has to match it and it cannot be changed afterwards: CLICKS is Reddit’s name for traffic to a website (there is no TRAFFIC), CONVERSIONS optimises toward pixel events and needs a working pixel, LEAD_GENERATION drives in-feed lead forms, IMPRESSIONS and VIDEO_VIEWABLE_IMPRESSIONS buy reach, APP_INSTALLS and CATALOG_SALES are for apps and product feeds. A campaign on its own can never serve: create an ad group under it, then an ad pointing at a post. The result is read back from Reddit.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
objectiveNodefault CLICKS — which is what Reddit calls website traffic
adAccountIdNoReddit ad account id (a2_…) — omit when only one is shared
spendCapCentsNolifetime spend ceiling for the whole campaign, in minor units of the ad account’s currency

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
statusNo
objectiveNo
adAccountIdNo
Behavior5/5

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

Beyond annotations, the description discloses critical behavioral traits: the campaign is ALWAYS created paused with no override, spends nothing until explicitly activated, the objective is immutable after creation, and the result is read back from Reddit. This is substantial extra context.

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 substantial but every sentence serves a purpose: it starts with the core function, then the paused behavior, then objective guidance, then the hierarchy requirement. No filler or repetition.

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 ad-creation tool with side effects, the description covers the essential behavioral constraints, activation path, objective choices, and structural requirements. The output schema exists, so return values need no explanation. This is nearly exhaustive.

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 input schema already documents most parameters with 75% coverage. The description adds valuable semantics for the objective parameter, explaining each enum value's meaning and trade-offs, and clarifies that the spend cap is optional and in minor currency units. Name could use more detail, but overall it enriches 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?

The description clearly states the tool creates the top tier of a Reddit ad — the campaign — and distinguishes it from sibling tools by explaining it sets the objective and spend cap, while ad groups and ads are separate downstream steps.

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 provides explicit usage context: campaigns are always created paused and require activation via set_reddit_ads_status; it also notes a campaign cannot serve alone and you must create an ad group and ad afterward. It doesn't explicitly name the sibling tools for those steps, but the sequence is clear.

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

create_reddit_ads_lead_formCreate a Reddit lead generation formAInspect

Create a lead generation form — the in-feed form redditors fill in without leaving Reddit, used by LEAD_GENERATION campaigns. Reddit requires a link to a real privacy policy on every form. Ask for the FEWEST fields that make a lead useful: every extra question costs completions. KNOW THE LIMIT BEFORE YOU PROMISE ANYTHING: Reddit exposes no way to attach a form to an ad through the API — there is no lead-form field on an ad, an ad group or a post — so the user picks this form in Reddit’s Ads Manager when building the creative, and downloads its leads from there. There is also no update and no delete, so get the questions right the first time. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesinternal name — redditors do not see it
promptYesthe line shown above the form telling people what they are signing up for
questionsYesat least one
adAccountIdNo
privacyLinkYesfull https:// URL to your privacy policy — Reddit requires it

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
noteNo
questionsNo
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, openWorldHint=true), the description discloses critical behavioral traits: no API attachment to ads, no update/delete endpoints, requirement for a real privacy policy, and manual lead download from Ads Manager. It also warns about completion costs with extra questions. This is rich context that goes well beyond the minimal annotation signals.

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 longer than minimal but dense with necessary caveats. It front-loads the purpose, then states requirements and limitations. The all-caps emphasis ('KNOW THE LIMIT', 'FEWEST') draws attention to key points, but some redundancy exists (e.g., repeating that there is no API attach in two sentences). Overall, every sentence 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?

Given the tool's complexity (5 params, 4 required, output schema present), the description covers purpose, usage, limitations, and best practices comprehensively. It explains the manual workflow in Ads Manager and the lack of update/delete. However, it omits any explanation of the adAccountId parameter, which is not described in the schema either, leaving a small gap.

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?

The input schema already describes 4 out of 5 parameters with meaningful descriptions (name, prompt, questions, privacyLink), and the overall schema description coverage is 80%. The tool description adds strategic guidance about asking for the 'FEWEST fields' and that every extra question costs completions, but it doesn't add syntax or format details beyond the schema. It also doesn't clarify the undocumented adAccountId parameter.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Create a lead generation form — the in-feed form redditors fill in without leaving Reddit, used by LEAD_GENERATION campaigns.' It uses a specific verb and resource, and distinguishes it from sibling tools like create_reddit_ads_ad by focusing on the lead form entity.

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 provides context on when to use the tool and important limitations: it's for LEAD_GENERATION campaigns, and it explicitly warns that 'there is no lead-form field on an ad, an ad group or a post' so the form must be attached manually in Reddit's Ads Manager. It also advises getting questions right the first time due to no update/delete. It doesn't explicitly name alternative tools, but the context is clear enough.

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

create_reddit_ads_postCreate the Reddit post an ad will promoteAInspect

Create the CREATIVE for a Reddit ad. This is the step people skip: a Reddit ad has no creative of its own — it points at a post — so a campaign and ad group with no post behind them can never serve. Types are TEXT (headline + body), IMAGE, VIDEO and CAROUSEL (up to 6 images). For image/video/carousel pass media[] with a PUBLIC mediaUrl; Reddit fetches and validates it itself (minimum 140×140), and a video also needs a thumbnailUrl. The destination for a click rides on the media entry’s destinationUrl, NOT on the ad. Reddit’s call-to-action values are human-readable strings with spaces and capitals — "Learn More", "Shop Now", "Sign Up" — not SCREAMING_SNAKE; the error lists all of them. The post is published on the profile immediately, so show the user the exact headline and body first.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNobody copy, TEXT posts
typeNodefault TEXT
mediaNoone entry for IMAGE/VIDEO, up to 6 for CAROUSEL
headlineYesthe post title — this is the ad’s headline
adAccountIdNo
callToActionNoapplies to every media entry that has none
thumbnailUrlNorequired for VIDEO posts
allowCommentsNoReddit ads can carry a public comment thread — decide deliberately
redditProfileIdYesthe Reddit profile id (t2_…) to publish as — from list_reddit_ads_profiles

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
noteNo
typeNo
postUrlNo
headlineNo
Behavior5/5

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

Beyond annotations (readOnlyHint=false), the description discloses that 'The post is published on the profile immediately,' that Reddit fetches/validates media itself, that CTA values are human-readable strings, and that the click destination rides on media's destinationUrl not the ad. These are non-obvious external behaviors that the annotations alone do not convey.

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 dense but every sentence serves a purpose: defining the tool, explaining the dependency, enumerating types, media requirements, CTA gotchas, and publishing side effect. It is front-loaded with the core purpose and structured logically from concept to specifics, with no extraneous prose.

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 (9 params, 4 types, nested media), the description covers the full workflow: required profile, headline, body for TEXT, media rules, CTA formats, destination URL ownership, and immediate publication. It also mentions the error listing valid CTA values as a fallback. With an output schema present, return-value detail is unnecessary; this description is complete for an agent to act.

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

Parameters5/5

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

Despite high schema coverage (89%), the description adds crucial meaning: it explains the role of media[] for image/video/carousel, the PUBLIC mediaUrl requirement with minimum dimensions, the thumbnailUrl need for video, destinationUrl placement, and the exact CTA string format. This goes well beyond the schema descriptions, clarifying confusing parameter relationships.

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 'Create the CREATIVE for a Reddit ad,' using a specific verb+resource pair, then explains that a Reddit ad points at a post rather than carrying its own creative. This clearly distinguishes the tool from siblings like create_reddit_ads_ad and post_to_reddit by defining its unique role in the ad hierarchy.

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?

The description explicitly warns 'This is the step people skip' and explains the dependency: 'a campaign and ad group with no post behind them can never serve.' It also gives conditional guidance for media types, CTA value format, and the immediate publication side effect, effectively telling the agent when and how to use the tool.

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

create_reddit_ads_saved_audienceCreate a reusable Reddit saved audienceAInspect

Save a targeting definition under a name so every ad group can reuse it — define "our people" once, then pass savedAudienceId when creating ad groups instead of retyping communities and interests each time, and one later edit re-targets every ad group using it. Takes the same targeting block as create_reddit_ads_ad_group, so resolve community names and interest ids with search_reddit_ads_targeting first. Creates targeting only: no budget, no spend. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
targetingYessame shape as create_reddit_ads_ad_group targeting — an empty block is refused, because a saved audience IS its targeting
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
noteNo
statusNo
Behavior5/5

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

Annotations only indicate readOnlyHint=false and openWorldHint=true. The description adds meaningful context: it affects targeting only (no budget/spend), is free, and later edits to the saved audience propagate to all ad groups using it. 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.

Conciseness5/5

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

Three tightly packed sentences, front-loaded with the core purpose. Each sentence adds a distinct, valuable fact: the reuse mechanism, the prerequisite resolution step, and the scope limitation (targeting only, free). No 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?

Given the nested targeting object and the presence of an output schema, the description covers prerequisites, side effects, and scope. It provides enough guidance for an agent to select and invoke the tool correctly, including a pointer to sibling tools for targeting resolution.

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?

With only 33% schema description coverage, the description compensates by referencing the identical targeting shape used in create_reddit_ads_ad_group and stating that an empty targeting block is refused. It does not describe the optional adAccountId, but the core required parameters gain sufficient semantic context.

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

Purpose5/5

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

The description clearly states the tool saves a targeting definition under a name for reuse across ad groups, and distinguishes it from ad group creation by explaining the savedAudienceId usage and 'Creates targeting only'.

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 explicitly explains when to use this tool (define 'our people' once and reuse), provides a prerequisite (resolve targeting with search_reddit_ads_targeting), and sets boundaries by noting it only creates targeting, not budget or spend.

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

create_sheetCreate a Google SheetAInspect

Create a new Google Spreadsheet in the user’s Drive and optionally fill it with rows — e.g. export a swipefile, ad list, or performance report. Pass rows as an array of row arrays (first row = headers). Returns the spreadsheet id + URL. Needs Google Drive connected (Settings ▸ Connectors ▸ Google Drive — one connection covers Drive, Sheets and Docs).

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNorows to write — array of row arrays; first row = headers
titleNospreadsheet title

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
rowsNo
titleNo
spreadsheetIdNo
Behavior4/5

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

Annotations already indicate a write operation (readOnlyHint=false). The description adds valuable behavioral context: it creates a new file in Drive (side effect), returns the spreadsheet id + URL, and requires a specific connection. It does not repeat the annotation's readOnly hint but elaborates on the operation's effects and prerequisites. No contradictions with annotations.

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

Conciseness5/5

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

The description is highly efficient: three sentences, each serving a distinct purpose. The first states the core function and use cases, the second explains the rows parameter, and the third covers return value and connection requirements. No fluff or redundancy; it is perfectly 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 with only 2 parameters, 100% schema coverage, and an output schema, the description is sufficiently complete. It covers the action, parameter semantics, return value, and a prerequisite. The only minor gap is the lack of explanation for what happens if the title is omitted, but this is not critical for a creation tool of this simplicity.

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 schema already fully describes both parameters (100% coverage), including the rows format. The description adds value by clarifying that rows are optional ('optionally fill it with rows') and providing real-world examples of what those rows might contain. This enriches the parameter meaning beyond the schema's formal definitions.

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

Purpose5/5

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

The description clearly states the tool's function with a specific verb+resource+location: 'Create a new Google Spreadsheet in the user’s Drive'. It provides concrete examples (swipefile, ad list, performance report) and implicitly distinguishes itself from siblings like append_to_sheet (which appends to an existing sheet) and create_doc (which creates a document). The optional row-filling behavior is also explicitly noted.

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 usage context through examples ('export a swipefile, ad list, or performance report') and states the necessary prerequisite (Google Drive connected, with settings path). It does not explicitly mention when NOT to use it or point to alternatives, but the context is sufficient for an agent to decide when this tool is appropriate.

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

create_x_ads_campaignBuild an X ads campaign (paused)AInspect

Create a campaign on X (Twitter). ALWAYS CREATED PAUSED with no override — it spends NOTHING until set_x_ads_status(confirm:true). A CAMPAIGN ALONE CANNOT SERVE ON X: it needs a line item and a promoted post underneath it, and the read-back says so rather than letting you call it a finished ad. Requires a funding instrument (a payment method on the X ad account) — omit fundingInstrumentId to be shown the usable ones, and if there are none this refuses with that reason instead of failing at X. Budgets are in the ad account’s own currency. Everything is READ BACK from X before you are told it exists; print the returned note verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
endTimeNo
accountIdYesfrom list_x_ads_accounts
startTimeNoISO 8601
dailyBudgetNoin the ad account’s currency
totalBudgetNo
fundingInstrumentIdNoomit to be shown the account’s usable funding instruments

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
statusNo
accountIdNo
campaignIdNo
Behavior5/5

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

With annotations limited to openWorldHint, the description carries the full burden and excels: it discloses that campaigns are always created paused, spend nothing until activated, cannot serve alone, require a funding instrument, and are read back from X before confirmation. It also describes error behavior ('refuses with that reason instead of failing at X'), providing rich operational transparency.

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 a single dense paragraph that front-loads the most critical warning (ALWAYS CREATED PAUSED) and delivers every sentence with high information value. The use of capital letters draws attention to essential constraints without being overly verbose. No wasted words.

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 7-parameter schema, the lack of meaningful safety annotations, and the existence of an output schema, the description is remarkably complete. It covers prerequisites (funding instrument), lifecycle (paused, needs line item/promoted post), activation path, currency, and read-back behavior. The agent can confidently select and invoke this tool based on the description alone.

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 57%, and the description adds meaning beyond the schema by clarifying that budgets (plural, including totalBudget) are in the ad account's currency and explaining the fundingInstrumentId omit behavior. It does not explicitly describe name or endTime, but the overall lifecycle context helps infer their purpose. The description partially compensates for missing schema descriptions.

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

Purpose5/5

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

The description clearly states 'Create a campaign on X (Twitter)' with a specific verb and resource, immediately distinguishing it from sibling ad campaign tools for other platforms. It also highlights key behaviors like 'ALWAYS CREATED PAUSED' and the requirement for a line item and promoted post, which uniquely scopes the tool's role.

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 provides strong usage context, such as explaining that a campaign alone cannot serve and must be complemented by a line item and promoted post, and that activation requires set_x_ads_status(confirm:true). It also gives practical guidance on fundingInstrumentId (omit to list usable ones) and mentions that budgets follow the account currency. However, it does not explicitly contrast with sibling ad campaign tools, though the platform is clear from the name.

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

create_x_ads_line_itemBuild an X ads line item (paused)AInspect

Create a line item — X's ad group — under a campaign. ALWAYS CREATED PAUSED with no override. THE TREE ON X IS campaign → line item → promoted post, and a campaign ALONE CANNOT SERVE: this is the middle level, and it still cannot serve until you attach a post with create_x_ads_promoted_tweet. Targeting attaches HERE (add_x_ads_targeting), never to the campaign. objective is validated before dispatch because X answers an invalid one with a 500 that reads like an outage; note that WEBSITE_CONVERSIONS and SITE_VISITS are goal values and are NOT objectives. bidStrategy MAX/TARGET require a bidAmount; AUTO lets X set it. Omitting startTime records now, and the read-back says so. Everything is READ BACK from X before you are told it exists; print the returned note verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalNo
nameNo
endTimeNo
accountIdYesfrom list_x_ads_accounts
bidAmountNorequired for MAX/TARGET; in the ad account's currency
objectiveYes
startTimeNoISO 8601; defaults to now
campaignIdYesfrom create_x_ads_campaign or list_x_ads_campaigns
placementsNodefault ALL_ON_TWITTER
bidStrategyNo
productTypeNodefault PROMOTED_TWEETS
totalBudgetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
statusNo
accountIdNo
campaignIdNo
lineItemIdNo
Behavior5/5

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

With only openWorldHint as an annotation, the description carries the full transparency burden and does so thoroughly. It discloses that line items are ALWAYS CREATED PAUSED with no override, that objective is validated before dispatch because X returns a misleading 500, that bidStrategy MAX/TARGET require bidAmount while AUTO does not, and that omitting startTime records 'now'. These are critical behavioral traits not available in 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?

The description is dense but every sentence serves a purpose. It front-loads the core action, then packs in essential caveats about pause state, hierarchy, targeting, objective validation, bid strategy, start time, and read-back behavior. There is no filler or repetition; the length is justified by the tool's complexity.

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 12 parameters, 4 enums, and critical platform quirks, the description is remarkably complete. It covers the full operational context: where the line item fits, what it cannot do without a post, where targeting attaches, how objective validation works, how bidding behaves, and that results are read back from X. The presence of an output schema means return-value documentation is not the description's job, and this description does everything else needed.

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 schema covers 50% of parameters, so the description adds meaningful value by explaining the objective vs goal distinction ('WEBSITE_CONVERSIONS and SITE_VISITS are goal values and are NOT objectives'), the bidStrategy/bidAmount relationship, and the startTime default behavior. It does not describe all remaining parameters (name, endTime, totalBudget), but the most ambiguous and error-prone parameters are clarified.

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 'Create a line item — X's ad group — under a campaign,' giving a specific verb, resource, and hierarchy position. It clearly distinguishes this tool from siblings like create_x_ads_campaign and create_x_ads_promoted_tweet by explaining the campaign → line item → promoted post structure and the line item's middle-level role.

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?

The description explicitly states when this tool is needed: 'a campaign ALONE CANNOT SERVE: this is the middle level, and it still cannot serve until you attach a post with create_x_ads_promoted_tweet.' It also explains that targeting attaches here via add_x_ads_targeting, never to the campaign, providing clear usage boundaries and naming the alternative tools.

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

create_x_ads_promoted_tweetAttach a post to an X line item (paused)AInspect

Attach an existing X post to a line item so the line item has a creative — the LAST piece of the tree, and without it nothing can ever serve however the statuses are set. The tweet id is the number at the end of the post URL (x.com//status/), not the URL. Several ids may be attached at once; X creates one promoted-tweet row per post. ATTACHMENT IS VERIFIED by re-reading the line item's own promoted posts rather than by trusting X's echo, and if that read cannot run the note says UNCONFIRMED instead of claiming success. Everything Hermoso built above this is PAUSED, so attaching a post starts no spend. Print the returned note verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
tweetIdsYespost ids — digits only, from the end of the post URL
accountIdYes
lineItemIdYesfrom create_x_ads_line_item

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
accountIdNo
lineItemIdNo
verifiedCountNo
promotedTweetIdsNo
Behavior5/5

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

The description goes far beyond the openWorldHint annotation by disclosing critical behavior: attachment is verified by re-reading the line item's promoted posts rather than trusting X's echo, failure results in an UNCONFIRMED note, multiple IDs create one row per post, and the paused state means no spend is triggered.

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?

Every sentence earns its place: purpose, ID format, multi-attach behavior, verification protocol, paused-state safety, and the instruction to print the note verbatim. There is no filler or redundancy despite the paragraph length.

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?

The description covers all non-obvious aspects of the operation: how to identify the post, what happens on verification failure, the side effect of no spend, and the required output handling. With an output schema present, the return shape is already covered, leaving no significant gaps.

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 description adds important meaning beyond the schema for tweetIds—explaining the numeric trailing ID, not the URL, and that several IDs may be attached at once—and links lineItemId to its source tool. AccountId remains undescribed, but the overall parameter guidance is strong.

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 specific verb and resource: 'Attach an existing X post to a line item.' It clearly identifies this as the final creative step in the ad tree, distinguishing it from sibling tools like create_x_ads_line_item and set_x_ads_status.

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 clearly states when to use the tool—when a line item exists and needs a creative, positioning it as 'the LAST piece of the tree, and without it nothing can ever serve.' It does not explicitly name alternatives, but the context is unambiguous and no exclusions are needed.

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

delete_brandDelete a brand workspaceA
DestructiveIdempotent
Inspect

PERMANENTLY delete a brand workspace and EVERYTHING in it — brand profile, memory, swipefile, Library creations, generated assets, avatars, skills, playbooks, chats — and disconnect its connected accounts. Irreversible, and it applies to everyone the workspace is shared with. Call it WITHOUT confirm first: it reports exactly what that workspace holds. Show the user that inventory verbatim, get an unambiguous yes, then call again with confirm:true — plus, if the workspace is not empty, confirmName set to its exact name and confirmConnectors set to the number of connected accounts it reported. Those two exist because confirming INTENT does not prove you picked the right WORKSPACE, and a wrong target is how a live brand was destroyed. The account's FIRST/anchor brand cannot be deleted this way (it holds the workspace's root storage) — that one is replaced from the app.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesbrand id or exact name from list_brands
confirmNoREQUIRED true — this destroys the whole workspace and cannot be undone
confirmNameNothe workspace's EXACT name, required when it is not empty — copy it from the inventory this tool returned, after the user has agreed to it
confirmConnectorsNothe number of connected accounts the inventory reported, required when there is at least one — the user must specifically agree to losing them, because reconnecting each needs a browser and no agent can do it

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
deletedNo
blastRadiusNo
connectorsDisconnectedNo
Behavior5/5

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

Beyond the destructiveHint and readOnlyHint annotations, the description discloses that deletion is irreversible, affects everyone the workspace is shared with, disconnects connected accounts, and explains why confirmName and confirmConnectors are required to prevent destroying a live brand. It also exposes the anchor-brand limitation, adding substantial behavioral context without contradicting 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?

The description is a dense paragraph that front-loads the destructive action and scope, then flows logically into the confirmation workflow and safety guardrails. Every sentence carries essential behavioral or operational information with no filler; the length is justified by the high stakes of the operation.

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 its destructive nature, the description covers all necessary context: what gets deleted, who is affected, the two-call confirmation protocol, the anchor-brand exception, and the purpose of each confirmation parameter. The presence of an output schema and the surrounding sibling list round out the information an agent needs to invoke the tool safely and correctly.

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

Parameters5/5

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

Although the schema has 100% parameter descriptions, the tool description adds crucial operational semantics: confirm is initially false for the inventory call, confirmName must match the exact workspace name, and confirmConnectors must match the reported count. It also explains the rationale behind these parameters, which the schema alone does not provide.

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 'PERMANENTLY delete a brand workspace and EVERYTHING in it' and enumerates the contents, making the target and scope unambiguous. This clearly distinguishes delete_brand from sibling delete_* tools (delete_playbook, delete_skill, delete_drive_file) and from create_brand/update_brand.

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?

The description provides a precise two-phase workflow: call without confirm first to receive inventory, show the user verbatim, get explicit consent, then call again with confirm:true plus confirmName and confirmConnectors. It also states the first/anchor brand cannot be deleted this way and must be replaced from the app, giving a clear when-not-to-use rule.

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

delete_creatorDelete a creatorA
DestructiveIdempotent
Inspect

Remove a saved creator from this workspace’s cast by id (from list_creators). Records a cross-device delete so they don’t reappear on the user’s other devices. It only drops the roster entry — ads already rendered with that person are untouched — and the same portrait can be saved again with save_creator, so no confirm is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe creator id (from list_creators)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
removedNo
Behavior5/5

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

The description goes beyond the annotations by explaining the cross-device delete behavior, the fact that ads already rendered are untouched, and that the creator can be re-saved. This adds substantial behavioral context without contradicting the readOnlyHint, destructiveHint, or idempotentHint 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?

Three sentences, each with a distinct purpose: primary action, cross-device effect, and non-cascade/reversibility. There is no filler, and the main purpose is front-loaded.

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 only one parameter and an output schema present, the description covers all essential behavioral aspects: what is deleted, what is not deleted, cross-device implications, and reversibility. It is complete for a deletion tool with this simplicity.

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?

The input schema already has 100% coverage for the single parameter 'id', describing it as 'the creator id (from list_creators)'. The description repeats this reference but adds no new parameter semantics beyond what the schema provides, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb 'Remove' and the resource 'a saved creator from this workspace’s cast by id', and it references list_creators as the source of the id, which distinguishes it from other delete tools and its sibling save_creator. This is specific and unambiguous.

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 provides clear context: it tells the user the id comes from list_creators, and it explains when a confirmation is not needed, implying when the tool is safe to use. It doesn't explicitly list when not to use it, but the context and reversibility with save_creator offer strong guidance.

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

delete_drive_fileDelete a Drive fileA
DestructiveIdempotent
Inspect

Delete a Drive file. By default it goes to Trash (recoverable); pass permanent:true to delete it forever. Pass fileId (from list_drive_files) + confirm:true. Irreversible when permanent — confirm with the user first.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileIdYesthe Drive file id
confirmNoREQUIRED true
permanentNotrue = delete forever; default trashes (recoverable)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
fileIdNo
deletedNo
Behavior5/5

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

The description adds substantial behavioral context beyond annotations: default trashing (recoverable), permanent deletion, and the requirement for confirm:true. It clearly discloses irreversible consequences and the need for user confirmation, which is critical for a destructive action. No contradictions with annotations (destructiveHint=true, readOnlyHint=false) are present.

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 compact sentences deliver all essential information: core action, default recoverable behavior, permanent override, required parameters, and an irreversibility warning. Every word earns its place; no fluff or repetition.

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 destructive, irreversible tool, the description covers the key operational details: recovery behavior, permanent flag, confirmation requirement, and source of fileId. An output schema exists, so return values need no explanation. The description is sufficient for an agent to invoke this tool safely and correctly.

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 adds meaningful semantics by telling users to get fileId from list_drive_files and emphasizing that confirm must be true, reinforcing the schema's 'REQUIRED true' note. This source guidance is valuable beyond the raw parameter definitions.

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

Purpose5/5

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

The description clearly states the action (delete) and resource (Drive file), with a specific verb and object. It distinguishes from related siblings like delete_onedrive_file and update_drive_file by explicitly naming Drive as the target.

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

Usage Guidelines4/5

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

Provides concrete usage instructions: obtain fileId from list_drive_files, pass confirm:true, and optional permanent flag. It also warns about irreversibility and requires user confirmation. However, it does not explicitly name alternative tools (e.g., delete_onedrive_file) or state when not to use this tool, so it lacks full exclusion guidance.

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

delete_google_ads_objectRemove a Google Ads campaign / ad group / ad / keyword / asset link / conversion actionA
DestructiveIdempotent
Inspect

PERMANENTLY remove a Google Ads object. Google has no HTTP delete — removal is a remove operation that puts the object in the terminal REMOVED state, which cannot be undone or re-enabled, so treat it as a delete. Levels: "campaign" + campaignId · "adGroup" + adGroupId · "ad" + adGroupId AND adId · "keyword" + adGroupId AND keywordId · "conversionAction" + conversionActionId · "campaignAsset"/"adGroupAsset" + the LINK’s full resourceName (get it from google_ads_report over campaign_asset / ad_group_asset — an asset id alone does not identify a link). THERE IS DELIBERATELY NO "asset" LEVEL: Google publishes no operation that deletes an Asset, only its links, so removing a link unlinks the asset and leaves it in the library. CALL IT WITHOUT confirm FIRST — nothing is removed and you get the object’s real name, status, LIFETIME SPEND and child counts read live from Google; show the user exactly that. A target with children, live delivery or real spend additionally needs confirmName (its exact name) and confirmChildren (the child count from that read-back). Removing a CAMPAIGN also removes its campaign-owned budget, and the note says whether it did. Removing the last ENABLED conversion action makes every smart-bidding campaign on the account undeliverable — the refusal says so. To stop delivery without removing, use set_google_ads_status(status:"PAUSED").

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNoad id (level:"ad" — pass adGroupId too)
levelNowhat to remove — default campaign
confirmNoREQUIRED true — REMOVED is permanent
adGroupIdNoad group id (level:"adGroup"; REQUIRED as the parent for "ad" and "keyword")
keywordIdNokeyword criterion id (level:"keyword" — pass adGroupId too)
campaignIdNocampaign id (level:"campaign")
customerIdNo10-digit account id (dashes ok) — omit to use the brand’s selected default account
confirmNameNothe object’s EXACT name, required when it has children / is live / has spent
resourceNameNofull resource name — REQUIRED for campaignAsset / adGroupAsset, accepted for any level
confirmChildrenNothe exact number of children reported by the unconfirmed call, required when it has any
loginCustomerIdNomanager id if operating through an MCC
conversionActionIdNoconversion action id (level:"conversionAction")

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
levelNo
deletedNo
verdictNo
blastRadiusNo
resourceNameNo
budgetRemovedNo
Behavior5/5

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

The description goes far beyond the annotations by explaining that Google has no HTTP delete, the removal puts the object in a terminal REMOVED state that cannot be undone, and that there is deliberately no 'asset' level—only links removed. It also discloses significant side effects: removing a campaign removes its budget, and removing the last ENABLED conversion action makes smart-bidding campaigns undeliverable. No contradiction with annotations exists.

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 each sentence carries critical operational warnings and guidance, structured logically from the core permanence warning to level specifics, the two-step confirmation protocol, and side effects. It is front-loaded with the purpose and wastes no words, making the length justified.

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 destructive, multi-level tool with 12 parameters, the description covers all relevant scenarios: no asset level, the read-back step, conditions requiring confirmName/confirmChildren, budget side effects, and conversion action consequences. It also provides an alternative for pausing, making it complete for an agent to safely use this tool. Since an output schema exists, missing return-value details are not a gap.

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

Parameters5/5

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

Despite the schema having 100% parameter descriptions, the description adds essential inter-parameter context: which IDs are required per level (e.g., ad requires adGroupId AND adId), the confirm/confirmName/confirmChildren flow for safe deletion, and the rule that an asset id alone does not identify a link—resourceName is required. This goes beyond the schema's isolated property definitions.

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

Purpose5/5

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

The description clearly states the tool's function: 'PERMANENTLY remove a Google Ads object' and enumerates all supported levels (campaign, adGroup, ad, keyword, asset link, conversion action). It distinguishes itself from sibling set_google_ads_status by explicitly noting that pausing is a non-destructive alternative.

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?

The description provides explicit usage instructions, including the mandatory two-step process: 'CALL IT WITHOUT confirm FIRST' to read back object details before actually deleting. It names a concrete alternative for stopping delivery: 'To stop delivery without removing, use set_google_ads_status(status:"PAUSED").' It also directs the user to google_ads_report for obtaining the resourceName for asset links.

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

delete_google_business_postDelete a Google Business Profile PostA
DestructiveIdempotent
Inspect

Remove a Post from the brand’s Google Business Profile listing. This takes it off Google Search and Maps immediately and CANNOT be undone — confirm with the user first. Pass the full post name from list_google_business_posts. Needs Google Business Profile connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
postIdYesthe full post name from list_google_business_posts (accounts/…/locations/…/localPosts/…)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
deletedNo
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description adds valuable context: the post is removed immediately, the action cannot be undone, and user confirmation is required. It also discloses the prerequisite of having Google Business Profile connected. This goes beyond the boolean hints and provides actionable behavioral warnings.

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 three sentences, front-loaded with the primary action, followed by the critical warning and the usage instruction. Every sentence adds necessary information without waste, maintaining a clear and scannable structure.

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 simple single-parameter delete tool with annotations and an output schema, the description covers all essential aspects: what it does, the irreversible impact, the confirmation requirement, how to obtain the parameter value, and the prerequisite. There is no missing context needed 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?

The schema fully describes postId as 'the full post name from list_google_business_posts (accounts/…/locations/…/localPosts/…)', giving 100% coverage. The description repeats the same instruction but adds no new meaning beyond the schema, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action ('Remove a Post from the brand’s Google Business Profile listing') with a specific resource and outcome ('takes it off Google Search and Maps immediately'). It distinguishes itself from sibling tools like list_google_business_posts or post_to_google_business by focusing on deletion and referencing the listing 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 description provides clear usage context: it tells the agent to confirm with the user first, to pass the full post name from list_google_business_posts, and notes the prerequisite that Google Business Profile must be connected. It does not explicitly state when not to use this tool or name alternatives, but the guidance is sufficient for a delete operation.

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

delete_linkedin_ads_objectDelete a LinkedIn campaign group / campaign / adA
DestructiveIdempotent
Inspect

Delete a LinkedIn campaign group, campaign or creative (level:"creative" + creativeId). LinkedIn HARD-deletes only DRAFT objects; anything that has ever run is moved to PENDING_DELETION instead — it stops serving and its reporting history is retained. The returned note says which of the two actually happened, and you must repeat that rather than claiming a clean delete. Irreversible either way, so it requires confirm:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNodefault campaign
confirmYesREQUIRED true — this is irreversible
campaignIdNo
creativeIdNo
adAccountIdNo
campaignGroupIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
levelNo
deletedNo
Behavior5/5

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

Beyond annotations (destructiveHint=true, readOnly=false), the description explains the hard-delete vs PENDING_DELETION behavior, retention of reporting history, the returned note, and the need to repeat it. It also stresses irreversibility and confirm:true, greatly enriching the agent's understanding.

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 dense sentences convey all essential behavioral information without fluff, front-loading the action and then adding caveats. Every sentence 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 description covers the critical deletion behavior, irreversibility, and the pending-deletion nuance, which is sufficient for an agent to operate. However, it could be more explicit about parameter mapping for campaign vs campaignGroup and required account context, though the schema partially covers this.

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?

Schema coverage is only 33%, and the description only clarifies that creative deletion uses level:'creative' + creativeId. It does not explain which ID parameter corresponds to campaign vs campaignGroup, nor the role of adAccountId, leaving ambiguity for the remaining 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 uses specific verbs and resources: 'Delete a LinkedIn campaign group, campaign or creative' and clarifies the level/creativeId mapping. This distinguishes it from sibling deletion tools like delete_meta_object and delete_google_business_post.

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 clearly states the operation and the important caveat that only DRAFT objects are hard-deleted while run objects become PENDING_DELETION, but it does not explicitly mention alternatives such as set_linkedin_ads_status for pausing or list_linkedin_ads_campaigns for verification. The context is clear but lacks explicit when-not-to-use guidance.

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

delete_meta_audienceDelete a Meta custom audienceA
DestructiveIdempotent
Inspect

PERMANENTLY delete a Meta custom audience or lookalike. Meta’s own warning: "When you delete a custom audience, it will be permanently removed from your account and your ads using it will stop running." An audience is the one ad object whose value is its CONTENTS — a big retargeting list cannot be rebuilt, it has to re-accumulate — so CALL IT WITHOUT confirm FIRST: nothing is deleted, and you get its real name, how many people are in it and which lookalikes were built from it, read live from Meta. Show the user exactly that. A populated audience, or one with lookalikes, then needs confirmName set to its exact name (and confirmChildren set to the lookalike count when there are any). META REFUSES to delete an audience that has lookalikes derived from it (error 2656) — delete those first; the unconfirmed call names them. Pass adAccountId + audienceId (from list_meta_audiences). The result is READ BACK from Meta: it says deleted only when the id no longer resolves.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true — the deletion is permanent
audienceIdYesthe custom audience id (from list_meta_audiences)
adAccountIdYesad account id (act_… or digits)
confirmNameNothe audience’s EXACT name, required when it holds people or has lookalikes
confirmChildrenNothe exact number of derived lookalikes reported by the unconfirmed call, required when it has any

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
nameNo
noteNo
deletedNo
verdictNo
audienceIdNo
blastRadiusNo
Behavior5/5

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

Discloses critical behavioral traits not captured by annotations: irreversibility (Meta warning), the need for a dry-run confirm, the value of audience contents, the 2656 refusal, and read-back verification. Annotations only say destructiveHint/readOnlyHint, so this description carries the full burden and exceeds 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 description is dense but every sentence earns its place, covering danger, rationale, procedure, error handling, and verification. The structure flows logically from warning to dry-run to confirmed deletion, and no information is redundant or filler for such a high-stakes destructive operation.

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 destructive nature, the description fully addresses safety, the two-step process, lookalike edge cases, confirmation requirements, and result verification. The presence of an output schema means return-value details are not needed, so the description is complete for an agent to execute correctly and safely.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds essential meaning: confirm is 'REQUIRED true', confirmName requires exact name for populated/lookalike audiences, confirmChildren requires exact lookalike count, and adAccountId/audienceId come from list_meta_audiences. This explains not just what each param is but when and why it's needed.

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 specifies a clear verb ('PERMANENTLY delete') and resource ('Meta custom audience or lookalike'), and distinguishes this from the generic sibling delete_meta_object by focusing on custom audiences and their unique two-phase deletion workflow.

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 step-by-step guidance: call without confirm first, show user the details, then set confirmName/confirmChildren as needed. It also warns about the lookalike dependency (error 2656) and prescribes deleting lookalikes first, plus references list_meta_audiences for ID acquisition. This goes well beyond generic usage.

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

delete_meta_objectDelete a Meta campaign / ad set / adA
DestructiveIdempotent
Inspect

PERMANENTLY delete a campaign, ad set, or ad. Pass objectId (from list_meta_ads) + adAccountId. DELETING A CAMPAIGN ALSO DELETES EVERY AD SET AND AD UNDER IT, and deleting an ad set deletes its ads — one id, the whole tree. Call it WITHOUT confirm first: it reports what the object is, its name, and how many children go with it. Show the user that, get an unambiguous yes, then call again with confirm:true plus confirmChildren set to the number it reported (only needed when there is at least one child). To stop delivery without deleting anything, use update_meta_object(status:"PAUSED") instead — that is reversible and this is not.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true — deletion is permanent
objectIdYesthe campaign / ad set / ad id to delete
adAccountIdYesad account id (for auth + scope)
confirmChildrenNothe number of child ad sets + ads this delete also destroys, as reported by the unconfirmed call — required whenever that is above zero

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
deletedNo
objectIdNo
blastRadiusNo
Behavior5/5

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

Going beyond the destructiveHint, the description discloses the cascade effect (campaign deletes all ad sets and ads; ad set deletes its ads), the preview behavior of the unconfirmed call, and the requirement to pass confirm:true plus confirmChildren only after user consent. It also contrasts mutability with the reversible alternative. This rich context exceeds what annotations provide.

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 text is information-dense and front-loaded with the destructive key point, but at ~170 words it is longer than many tool descriptions; every sentence adds safety-critical context, so minor verbosity is justified.

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 destructive nature, the description covers what is deleted, how to identify the target, the confirmation report, how to finalize with confirmChildren, and a reversible alternative. The existence of an output schema means return-value details are not needed, so nothing 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?

The schema already covers all four parameters, so baseline is 3; the description adds cross-tool linkage (objectId from list_meta_ads), explains the role of confirmChildren as the reported child count, and contextualizes confirm as the user-consent second-step flag, raising it to 4.

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 'PERMANENTLY delete a campaign, ad set, or ad,' providing a clear verb and resource while the title confirms the object scope. It distinguishes itself from sibling update tools like update_meta_object by emphasizing the permanent, destructive nature.

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 states prerequisites (objectId from list_meta_ads + adAccountId), describes a two-phase confirmation flow, and names update_meta_object(status:"PAUSED") as a reversible alternative, with an explicit 'instead' and rationale. This is textbook when-to-use/when-not-to-use guidance.

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

delete_microsoft_ads_objectDelete a Microsoft Advertising campaign / ad group / ad / keywordA
DestructiveIdempotent
Inspect

PERMANENTLY delete a Microsoft Advertising campaign, ad group, ad or keyword. This is a real delete — Microsoft removes the object and it stops being returned by every read, with no undelete and no documented recovery window. Pass level:"campaign" + campaignId, level:"adGroup" + adGroupId, level:"ad" + adGroupId AND adId, or level:"keyword" + adGroupId AND keywordId. CALL IT WITHOUT confirm FIRST: nothing is deleted, and you get back the object’s real name, its status and how many ad groups / ads / keywords go with it, read live from Microsoft — show the user exactly that. If the object has children, is Active, or has spent, confirming alone is NOT enough: you must also pass confirmName set to its exact name and confirmChildren set to the child count from that read-back, which is what proves you are deleting the object you think you are. A campaign that is paused, empty and never ran deletes on plain confirm:true. To stop delivery WITHOUT deleting, use set_microsoft_ads_status(status:"Paused") instead. The result is READ BACK from Microsoft: it says "deleted" only when the object no longer resolves, "not confirmed" if it does, and "could not tell" if the check itself failed — repeat that verbatim rather than claiming success.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNoad id (level:"ad" — pass adGroupId too)
levelNowhat to delete — default campaign
confirmNoREQUIRED true — the delete is permanent
accountIdNoMicrosoft ad account id — omit to use the brand’s single shared account
adGroupIdNoad group id (level:"adGroup"; REQUIRED as the parent for level:"ad" and level:"keyword")
keywordIdNokeyword id (level:"keyword" — pass adGroupId too)
campaignIdNocampaign id (level:"campaign"; also the parent for level:"adGroup" if you know it)
confirmNameNothe object’s EXACT name, required when it has children / is Active / has spent
confirmChildrenNothe exact number of children reported by the unconfirmed call, required when it has any

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
levelNo
deletedNo
verdictNo
blastRadiusNo
Behavior5/5

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

Beyond the annotations (destructiveHint, readOnlyHint), the description discloses critical behaviors: there is no undelete or recovery, the first call deletes nothing and returns a live read-back, the result is verified from Microsoft and must be reported verbatim, and exact string outcomes ('deleted', 'not confirmed', 'could not tell') are defined. This goes far beyond what the annotations convey.

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 it is front-loaded with the purpose and then systematically covers the confirmation workflow, parameter combos, exceptions, and result interpretation. Every sentence carries important safety information, so the length is justified. It is slightly verbose but not wasteful; a 4 reflects the necessary detail over pure conciseness.

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 destructive complexity, the description is comprehensive: it covers all object levels, the two-step confirmation requirement, conditions for additional confirmation, the alternative to pausing, and how to interpret the verification result. The presence of an output schema reduces the need to document return values, yet the description still explains the result semantics. This leaves no significant gaps.

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

Parameters5/5

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

Although the schema covers 100% of parameters, the description adds essential cross-parameter semantics: which combinations of level and IDs are valid (e.g., 'level:"ad" + adGroupId AND adId'), the meaning of confirmName and confirmChildren as safety checks, and the default behavior of accountId. It clarifies relationships the schema does not explicitly state.

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 'PERMANENTLY delete a Microsoft Advertising campaign, ad group, ad or keyword,' which clearly states the verb, resource, and scope. It also distinguishes itself from related tools like set_microsoft_ads_status by explicitly naming that alternative. The purpose is unambiguous and specific.

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, including the mandatory two-step confirmation process, the conditions requiring confirmName and confirmChildren, and the exception for paused/empty campaign. It explicitly names an alternative tool: 'To stop delivery WITHOUT deleting, use set_microsoft_ads_status(status:"Paused") instead.' This is exemplary usage guidance.

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

delete_onedrive_fileDelete a OneDrive fileA
DestructiveIdempotent
Inspect

Delete a OneDrive item — it moves to the OneDrive recycle bin (recoverable there). Pass fileId (from list_onedrive_files) + confirm:true. Confirm the exact file with the user first.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileIdYesthe OneDrive item id
confirmNoREQUIRED true

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
fileIdNo
deletedNo
Behavior5/5

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

Beyond the annotations (destructiveHint=true), the description adds that the deletion is recoverable via the OneDrive recycle bin and requires a confirm:true flag, giving the agent crucial context about impact and safety guardrails without contradicting the structured hints.

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 only two sentences long, front-loads the core action, and packs essential information (recoverability, fileId source, confirmation requirement, user confirmation) with no wasted words.

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 simple 2-parameter deletion tool with an output schema already present, the description fully covers how to identify the file, obtain the id, require confirmation, and understand the recovery behavior, making it complete for correct invocation.

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% for fileId and confirm, but the description adds practical semantics: fileId originates from list_onedrive_files and confirm must be true, going beyond the schema's generic descriptions.

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 opening phrase 'Delete a OneDrive item' names a specific verb and resource, and it explicitly references list_onedrive_files for the fileId, distinguishing it from the sibling delete_drive_file tool. It also clarifies the effect (moves to recycle bin).

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 clear usage steps: pass fileId from list_onedrive_files and confirm:true, and mandates confirming the exact file with the user first. However, it does not explicitly state when not to use this tool or name alternatives like delete_drive_file, so it falls just short of full explicitness.

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

delete_openai_ads_objectArchive (ChatGPT Ads’ delete) a campaign / ad group / adA
DestructiveIdempotent
Inspect

Retire a ChatGPT Ads campaign, ad group or ad. THE OPENAI ADVERTISER API HAS NO DELETE — archiving is its only teardown, and OpenAI’s own guidance is "only archive objects you have no further use for, as archiving isn’t reversible": there is no un-archive, not even through support. So say ARCHIVED, never "deleted". Pass level:"campaign" + campaignId, level:"adGroup" + adGroupId, or level:"ad" + adId. CALL IT WITHOUT confirm FIRST — nothing is archived and you get the object’s real name, status and child count read live from OpenAI; show the user exactly that. A target with children or live delivery additionally needs confirmName (its exact name) and confirmChildren (the count from that read-back). PAUSING stops all spend and keeps the object editable — offer that first whenever the user only wants delivery to stop. Archiving a campaign is not documented to cascade, so archive the children yourself if they should stop too. The result is READ BACK: it says archived only when OpenAI reports the archived status.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNo
levelNowhat to archive — default campaign
confirmNoREQUIRED true — archiving cannot be undone
adGroupIdNo
campaignIdNo
confirmNameNothe object’s EXACT name, required when it has children or is live
confirmChildrenNothe exact number of children reported by the unconfirmed call, required when it has any

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
levelNo
verdictNo
archivedNo
blastRadiusNo
Behavior5/5

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

Beyond the annotation destructiveHint=true, the description reveals irreversibility ('no un-archive, not even through support'), the two-phase confirm flow, read-back verification ('it says archived only when OpenAI reports the archived status'), and the non-cascading behavior of campaign archiving. This dramatically exceeds what annotations convey.

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?

Although long, every sentence carries critical, non-redundant information. The description is front-loaded with purpose, then uses uppercase sparingly for the most important caveats, and maintains a logical flow from semantics to usage pattern to alternatives to verification.

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 destructive action, 7 parameters, and open-world complexity, the description covers all necessary context: the API lacking delete, the irreversibility warning, the two-step confirmation workflow, edge cases (children/live delivery), the pause alternative, and verification behavior. The output schema handles return details, so no more is needed.

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

Parameters5/5

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

With schema coverage at 57%, the description compensates by mapping level values to specific ID parameters ('level:"campaign" + campaignId...'), explaining that confirm is required true despite not being marked required in the schema, and giving precise conditions for confirmName and confirmChildren. This adds substantial meaning beyond the raw 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?

The description opens with a specific verb+resource: 'Retire a ChatGPT Ads campaign, ad group or ad.' It immediately distinguishes itself from sibling delete tools by clarifying this is archiving, not deletion, and explicitly says to say 'ARCHIVED, never deleted.'

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?

The description provides explicit when-to-use and when-not-to-use guidance: it instructs to call without confirm first to read live data, requires confirmName and confirmChildren for live or child-bearing objects, and explicitly recommends pausing as the alternative when the user only wants to stop spend. It also explains that campaigns do not cascade archiving, telling the agent to archive children separately.

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

delete_pinterest_ads_objectArchive (Pinterest’s delete) a campaign / ad group / adA
DestructiveIdempotent
Inspect

Retire a Pinterest campaign, ad group or ad. PINTEREST API v5 HAS NO DELETE for any of the three — ARCHIVED is its terminal state, and Pinterest’s own campaign docs call an archived campaign "deleted" and say reversing it means filing a ticket with their customer ops team, so there is no un-archive you or the user can call. Say ARCHIVED, not "deleted": the object stays on the account with its reporting history and simply drops out of the default list view. Pass level:"campaign" + campaignId, level:"adGroup" + adGroupId, or level:"ad" + adId. CALL IT WITHOUT confirm FIRST — nothing is archived and you get the object’s real name, status and child count read live from Pinterest; show the user exactly that. A target with children or live delivery additionally needs confirmName (its exact name) and confirmChildren (the count from that read-back). PAUSING is fully reversible — offer it first whenever the user only wants delivery to stop. Pinterest documents no cascade, so archive the children yourself if they should stop too.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNo
levelNowhat to archive — default campaign
confirmNoREQUIRED true — archiving is not self-service reversible
adGroupIdNo
campaignIdNo
adAccountIdNoPinterest ad account id — omit to use the brand’s single shared account
confirmNameNothe object’s EXACT name, required when it has children or is live
confirmChildrenNothe exact number of children reported by the unconfirmed call, required when it has any

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
levelNo
verdictNo
archivedNo
blastRadiusNo
Behavior5/5

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

The description goes far beyond the annotations by disclosing that ARCHIVED is terminal, there is no un-archive (reversal requires a ticket to Pinterest's customer ops team), the object stays on the account with reporting history, and it drops out of the default list view. It also explains the safe two-step confirmation process. This complements destructiveHint and idempotentHint without contradiction.

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

Conciseness4/5

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

The description is long but each sentence carries essential safety and workflow information for a destructive, irreversible operation. It is front-loaded with the core purpose and logically progresses through vocabulary, parameter mapping, confirmation steps, and alternatives. Dense, but every part earns its place.

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 of a destructive Pinterest operation with no API delete, the description is exceptionally complete. It covers terminal state, un-archive impossibility, the confirmation workflow, parameter mapping, pause alternative, and manual cascade behavior. Since an output schema exists, return values need not be described.

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?

With schema description coverage at 63%, the description adds crucial meaning by specifying valid parameter combinations: level:'campaign' + campaignId, level:'adGroup' + adGroupId, or level:'ad' + adId. It also explains when confirmName and confirmChildren are required (children or live delivery). The adAccountId is left to the schema, but the overall parameter guidance is strong.

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 'Retire a Pinterest campaign, ad group or ad', using a specific verb and resource. It also clarifies that Pinterest has no delete operation, only ARCHIVED, which distinguishes this tool from sibling delete_*_ads_object tools for other platforms. The title further reinforces the purpose.

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 instructs to offer pausing first when the user only wants delivery to stop ('PAUSING is fully reversible — offer it first whenever the user only wants delivery to stop'). It also provides a clear two-step workflow (call without confirm first, then confirm with name/children) and warns that Pinterest documents no cascade, so the agent must archive children itself. This is strong 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.

delete_pinterest_boardDelete a Pinterest boardA
DestructiveIdempotent
Inspect

PERMANENTLY delete a board AND EVERY PIN ON IT. This is the heaviest thing that can be done to a Pinterest account and there is no undelete. Call it WITHOUT confirm first: nothing is deleted, and it answers with the board’s real name, how many Pins are on it, how many people FOLLOW it and how many collaborators lose access — all read back from Pinterest. Show the user that, then call again with confirm:true plus confirmName (its exact name) and confirmChildren (the Pin count it reported); those echoes exist because a caller who has not looked at the board cannot supply them, and confirming intent alone does not prove aim. IF THEY ONLY WANT IT OUT OF PUBLIC VIEW, update_pinterest_board(privacy:"SECRET") hides the board and every Pin on it and is REVERSIBLE — offer that first. 0 credits. Needs Pinterest connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
boardIdYesnumeric board id from list_pinterest_boards
confirmNoREQUIRED true — the board and its Pins are gone for good
confirmNameNothe board’s EXACT name as the unconfirmed call reported it
confirmChildrenNothe number of Pins the unconfirmed call reported on the board

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
nameNo
noteNo
boardIdNo
deletedNo
verdictNo
Behavior5/5

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

The description discloses far beyond the annotations: 'no undelete', the fact that the unconfirmed call 'nothing is deleted' and returns the board name, Pin count, followers, and collaborators, and the rationale that the confirm fields are 'echoes' requiring actual prior inspection. It also notes '0 credits' and 'Needs Pinterest connected', adding operational context.

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 serves a purpose. It is logically ordered: the permanent consequence, the safe pre-flight, the confirmation detail, the reversible alternative, and operational notes. No redundant or filler language; the use of caps for emphasis highlights the most critical warnings.

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 highly destructive tool, the description covers the entire workflow: safety (two-step confirmation), the specifics of what the first call returns, the exact confirmation requirements, a reversible alternative, prerequisites (Pinterest connected), and cost (0 credits). Since an output schema exists, return-value details are not needed here, but nothing else is missing.

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

Parameters5/5

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

Even though the schema has 100% coverage, the description adds critical meaning: it explains that confirmName and confirmChildren must match the exact values from the unconfirmed call, and that these echoes exist to prove the caller actually looked at the board. This goes beyond mere field descriptions and clarifies the relationships between 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 begins with 'PERMANENTLY delete a board AND EVERY PIN ON IT', which is a specific verb and resource, and uniquely scopes it versus siblings like update_pinterest_board (reversible hide) and delete_pinterest_pin (single pin). It also states it is 'the heaviest thing', further distinguishing its severity.

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 explicitly instructs to 'Call it WITHOUT confirm first' then 'call again with confirm:true', providing a precise two-step workflow. It also names an alternative: 'IF THEY ONLY WANT IT OUT OF PUBLIC VIEW, update_pinterest_board(privacy:"SECRET") ... offer that first', making the when-to-use/when-not-to-use crystal clear.

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

delete_pinterest_pinDelete a PinA
DestructiveIdempotent
Inspect

PERMANENTLY delete a Pin. Pinterest has no undelete and no archive for one. Call it WITHOUT confirm first: nothing is deleted, and it answers with the Pin’s real title, its lifetime saves and impressions, and whether it HAS BEEN PROMOTED in an ad — all read back from Pinterest. Show the user that, get an unambiguous yes, then call again with confirm:true plus confirmName (its exact title) once it has saves or has been promoted, because confirming that you meant to delete SOMETHING does not prove you aimed at the right Pin. DELETING A PIN THAT AN AD PROMOTES pulls the creative out from under that ad, so check the promoted flag before agreeing. The verdict is read back from Pinterest, never taken from its 2xx. 0 credits. Needs Pinterest connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
pinIdYesnumeric Pin id from list_pinterest_pins
confirmNoREQUIRED true — deletion is permanent
confirmNameNothe Pin’s EXACT title as the unconfirmed call reported it — required once it has saves or has been promoted

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
pinIdNo
titleNo
deletedNo
verdictNo
Behavior5/5

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

Adds extensive behavior beyond annotations: permanent deletion with no undelete/archive, read-back of pin title, saves, impressions, and promoted status in the unconfirmed call, consequences for deleting a promoted pin, and that the verdict is read from Pinterest rather than the 2xx response. This is rich context that aligns with and supplements the destructiveHint and idempotentHint 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?

The description is long but every sentence adds value—front-loaded with 'PERMANENTLY delete a Pin,' then logically flows through the two-phase process, safety warnings, and prerequisites. No fluff or redundancy.

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?

The description fully covers return values (pin title, saves, impressions, promoted flag), prerequisites (Pinterest connected), credit cost, safety checks, and the two-step procedure. With an output schema present, it is complete for an agent to execute correctly.

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

Parameters5/5

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

Despite 100% schema coverage, the description adds critical meaning: pinId is sourced from list_pinterest_pins, confirm must be true for deletion, and confirmName must be the exact title reported by the unconfirmed call, required only when the pin has saves or promotions. This clarifies the conditional logic beyond the schema's property descriptions.

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?

Description opens with 'PERMANENTLY delete a Pin,' clearly stating the verb and resource. It distinguishes itself from sibling tools like update_pinterest_pin and delete_pinterest_board by emphasizing the permanence and lack of undelete/archive, making the purpose unmistakable.

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

Usage Guidelines4/5

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

Provides explicit step-by-step usage: first call without confirm to retrieve pin details, then second call with confirm:true and confirmName. It also warns about checking the promoted flag and mentions the prerequisite of Pinterest being connected. Lacks explicit 'don't use this tool, use X instead' alternatives, but the two-phase protocol is clearly actionable.

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

delete_playbookDelete a playbookA
DestructiveIdempotent
Inspect

Delete a saved playbook by id (from list_playbooks). Records a cross-device delete so it does not come back on the next sync. Minor + re-creatable, so no confirm needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe playbook id (from list_playbooks)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
removedNo
Behavior5/5

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

The description goes well beyond the annotations by disclosing the cross-device delete behavior ('Records a cross-device delete so it does not come back on the next sync') and the reasoning that it is 'Minor + re-creatable'. These are additional behavioral traits that help the agent understand the persistence and risk profile, complementing the destructiveHint and idempotentHint 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?

The description is a compact two sentences, leading with the primary action. Every sentence earns its place: the first defines the action and input, the second explains persistence and safety. No filler or redundant phrasing.

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?

This is a simple one-parameter delete tool with an output schema. The description covers the purpose, how to obtain the id, the cross-device behavior, and why no confirmation is needed. For its complexity, it is fully complete and leaves no critical gaps.

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 schema already describes 'id' as 'the playbook id (from list_playbooks)'. The description repeats this source but adds no new parameter semantics. The baseline for high coverage is 3, and the description does not go 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?

The description uses a specific verb+resource: 'Delete a saved playbook by id'. It clearly distinguishes this from the many sibling delete tools (delete_brand, delete_creator, etc.) by naming the resource type. The source 'from list_playbooks' adds context that pinpoints the expected input.

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 provides clear context on usage: it tells the agent to delete by id from list_playbooks, implying a prerequisite to list first. It also explains why no confirmation is needed ('Minor + re-creatable'), which is a practical usage guideline. However, it does not explicitly mention when not to use this tool or name alternatives.

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

delete_reddit_ads_audienceDelete a Reddit custom audienceA
DestructiveIdempotent
Inspect

Permanently delete a Reddit custom audience. This is one of the very few things Reddit really deletes — campaigns, ad groups and ads are only ever archived — and it cannot be undone: the uploaded list is gone and any ad group targeting it loses that audience. Confirm-gated: show the user the audience name and its size, get an explicit yes, then call again with confirm:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true — the deletion is permanent
adAccountIdNo
customAudienceIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
nameNo
noteNo
customAudienceIdNo
Behavior5/5

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

Beyond the destructiveHint=true annotation, the description reveals that deletion cannot be undone, the uploaded list is gone, and any ad group targeting it loses that audience. The confirmation protocol (two-call pattern with confirm:true) is also a behavioral trait that 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?

The description is three sentences, each delivering critical information: the action, the permanence and side effects, and the confirmation procedure. It is front-loaded and has 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 destructive nature, the description provides all necessary context: permanence, side effects, and how to confirm. Since an output schema is present, the lack of return-value discussion is acceptable; this is a very complete description for a delete tool.

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 only 33% (only confirm has a description), and the description partially compensates by adding the confirm:true protocol. However, adAccountId and customAudienceId are left unexplained, and the description does not clarify whether adAccountId is required or how the ID is derived.

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 uses the specific verb 'permanently delete' and names the resource 'Reddit custom audience'. It also distinguishes this from other Reddit delete operations by noting that campaigns/ad groups/ads are only archived, making the purpose unmistakable.

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

Usage Guidelines5/5

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

The description explicitly instructs the confirm-gated workflow: show the audience name and size, obtain explicit yes, then re-call with confirm:true. This is clear when-to-use guidance, and the note about Reddit's actual deletion vs archival implicitly warns against expecting an undo.

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

delete_reddit_ads_objectDelete or archive a Reddit campaign / ad group / adA
DestructiveIdempotent
Inspect

Remove a Reddit campaign, ad group or ad. REDDIT HAS NO DELETE VERB for any of the three — its whole Ads API has exactly four HTTP DELETE endpoints and none of them is a campaign, ad group or ad — so removal is the configured_status field: DELETED (permanent) or ARCHIVED (out of service, and can be set back to PAUSED). DELETED is additionally TIME-GATED: Reddit refuses to delete anything modified in the last 3 hours, and the refusal names ARCHIVED as the immediate alternative. CALL IT WITHOUT confirm FIRST — nothing changes, and you get the object’s real name, status and how many ad groups / ads sit under it, read live from Reddit. A target with children or live delivery then needs confirmName (its exact name) and confirmChildren (the count from that read-back). Reddit does NOT document whether removing a campaign cascades to its ad groups and ads — each carries its own status — so remove the children yourself if they should go too. To stop delivery without removing, use set_reddit_ads_status(status:"PAUSED").

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
kindYes
statusNoDELETED = permanent (default); ARCHIVED = out of service but reversible to PAUSED
confirmNoREQUIRED true
adAccountIdNo
confirmNameNothe object’s EXACT name, required when it has children or is live
confirmChildrenNothe exact number of children reported by the unconfirmed call, required when it has any

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
kindNo
noteNo
deletedNo
verdictNo
archivedNo
blastRadiusNo
Behavior5/5

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

Discloses critical behavioral quirks beyond annotations: Reddit's API lacks delete verbs, DELETED is time-gated (3-hour refusal), ARCHIVED is reversible, and cascade behavior is undocumented. This adds substantial context on top of destructiveHint=true and idempotentHint=true, with no contradiction.

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

Conciseness5/5

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

The description is longer than average but every sentence serves a purpose, covering the API workaround, time-gating, safety read-back, child handling, and alternative. It is front-loaded with the tool's core purpose and flows logically.

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 tool with 7 parameters, an output schema, and complex Reddit-specific edge cases, the description covers all essential aspects: how to confirm, what changes occur, when it fails, and what to do in ambiguous cascade scenarios. It is complete for safe invocation.

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

Parameters5/5

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

Although schema coverage is 57%, the description explains the parameter workflow comprehensively: calling without confirm returns object data, then confirmName/confirmChildren are derived from that read-back. Also defines the status enum semantics ('DELETED = permanent; ARCHIVED = reversible'). This goes beyond the schema descriptions.

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?

Description opens with a specific verb-resource pair: 'Remove a Reddit campaign, ad group or ad.' It distinguishes from sibling delete tools (e.g., delete_reddit_ads_audience) and clarifies that the operation maps to setting configured_status, not a true HTTP DELETE.

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: calls without confirm first to read back object details, then repeats with confirmName/confirmChildren if needed. Directly names the alternative tool for non-destructive actions: 'use set_reddit_ads_status(status:"PAUSED")'.

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

delete_reddit_ads_saved_audienceDelete a Reddit saved audienceA
DestructiveIdempotent
Inspect

Delete a Reddit saved audience — the named, reusable targeting block ad groups point at. Reddit publishes NO delete verb for one (its whole Ads API has four, and this is not among them), so removal is its status field set to DELETED. THE BLAST RADIUS IS THE AD GROUPS USING IT: every live ad group pointing at this audience loses that targeting definition the moment it goes, and Reddit’s own active_ad_groups_count is what says how many. CALL IT WITHOUT confirm FIRST — nothing is deleted and you get its real name and that count; show the user exactly that, and if any ad group uses it you must then pass confirmName (its exact name) and confirmChildren (the count). The result is READ BACK from Reddit.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true
adAccountIdNo
confirmNameNothe audience’s EXACT name, required when live ad groups use it
confirmChildrenNothe exact number of live ad groups reported by the unconfirmed call
savedAudienceIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
nameNo
noteNo
deletedNo
verdictNo
blastRadiusNo
savedAudienceIdNo
Behavior5/5

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

The description discloses that Reddit has no delete verb, so removal sets the status to DELETED, and that every live ad group pointing at the audience loses its targeting definition. It also explains the safety-first unconfirmed call and the read-back result, which goes far beyond the destructiveHint annotation.

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 dense and front-loaded with the purpose, then efficiently explains the API limitation, blast radius, confirmation flow, and result in five compact sentences. The ALL-CAPS emphasis calls out critical warnings without wasting words.

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?

The description fully covers the deletion workflow, including the unconfirmed lookup, required confirmation parameters, and consequences to ad groups. Since an output schema exists, return values don't need explanation, and the description equips the agent to invoke the tool correctly in all relevant scenarios.

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 description adds workflow semantics by explaining the confirm parameter's role (call without it first) and defining confirmName as the exact name and confirmChildren as the count from the unconfirmed call. However, savedAudienceId and adAccountId are left without explanation, so not all parameters are clarified 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?

The description clearly states the tool deletes a Reddit saved audience and identifies the resource as 'the named, reusable targeting block ad groups point at.' It distinguishes the tool from generic delete siblings by explaining the DELETED-status workaround specific to saved audiences, so the agent knows exactly which resource is affected.

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 explicit step-by-step usage: call without confirm first to retrieve the real name and active_ad_groups_count, then pass confirmName and confirmChildren when live ad groups are present. It does not name alternative tools or state when not to use it, but the context and conditional flow are clear.

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

delete_reddit_postDelete a Reddit postA
DestructiveIdempotent
Inspect

PERMANENTLY delete one of the connected account’s Reddit posts. Reddit has no undelete. Call it WITHOUT confirm first: nothing is deleted, and it answers with the post’s real title, subreddit, score and comment count read back from Reddit. Show the user that, get an unambiguous yes, then call again with confirm:true — plus confirmName (its exact title) once it has comments or a real score, because confirming that you meant to delete SOMETHING does not prove you aimed at the right post. TELL THE USER THIS BEFORE THEY AGREE: deleting a Reddit post does NOT delete the comments under it — Reddit keeps the thread and shows the post as [deleted], so the conversation stays public with only their side removed. Reddit’s delete endpoint returns an empty success for every call, including one aimed at a post the account did not write, so the verdict here comes from re-reading the post afterwards and never from that response. 0 credits. Needs Reddit connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
postIdYesthe post id, its t3_… fullname, or the permalink
confirmNoREQUIRED true — deletion is permanent
confirmNameNothe post’s EXACT title as the unconfirmed call reported it — required once it has comments or a real score

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
noteNo
titleNo
postIdNo
deletedNo
verdictNo
subredditNo
Behavior5/5

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

Beyond the annotations (destructive, idempotent, open-world), the description discloses critical behavioral traits: Reddit has no undelete, the endpoint returns empty success even for posts the account did not write, deletion does not remove comments, and the real verdict comes from re-reading the post afterward. This is exactly the kind of context that annotations cannot convey and is essential for safe use.

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 a dense paragraph, but every clause carries vital safety information: permanence, no undelete, the confirm-first protocol, the confirmName condition, comment retention, endpoint deception, credits, and connection prerequisite. It is front-loaded with the purpose and necessary warnings, though a bit of bulleted structure could improve scannability.

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?

This is a dangerous, irreversible operation with subtle failure modes (empty success, wrong-post risk). The description covers the full workflow, edge cases, verification strategy, and prerequisites, and since an output schema exists, return value details are already provided. It is as complete as a deletion tool description can be.

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 schema already provides 100% coverage for all three parameters with clear descriptions (postId formats, confirm required, confirmName exact title). The description adds protocol context by explaining why confirmName is needed and reinforcing the two-step confirmation flow, which goes beyond the schema's straightforward field descriptions.

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 'PERMANENTLY delete one of the connected account’s Reddit posts', which is a specific verb, resource, and scope that clearly distinguishes it from sibling delete tools (e.g., delete_reddit_ads_object, delete_meta_object). It unambiguously targets Reddit posts for the connected account, leaving no confusion.

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 provides an explicit two-step workflow: call without confirm first, show the user the returned metadata, obtain an unambiguous yes, then call with confirm:true and confirmName when required. It also states the condition for requiring confirmName ('once it has comments or a real score'). However, it does not explicitly name alternative tools for non-user-post deletions, relying on the tool title and context to disambiguate.

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

delete_skillDelete a custom skillA
DestructiveIdempotent
Inspect

Delete one of the workspace’s CUSTOM skills by id (from list_skills). Built-in skills/recipes can’t be deleted. Minor + re-creatable, so no confirm needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe custom skill id (from list_skills)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
removedNo
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds valuable context beyond annotations: only custom skills can be deleted, and it provides a risk assessment ('Minor + re-creatable, so no confirm needed'), which helps the agent understand impact. It does not contradict 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?

The description is two concise sentences: first states the action and scope, second states the exception and rationale. Every phrase adds value with no redundancy or 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 simple single-parameter delete tool with a clear schema, annotations, and output schema, the description covers the delete scope, restricts to custom skills, explains the no-confirm behavior, and notes that skills are re-creatable. This is complete guidance for an agent to select and 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?

The input schema already fully describes the id parameter with 100% coverage, including the guidance 'from list_skills'. The description echoes 'by id (from list_skills)' without adding new format, validation, or source details beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action (Delete) and the specific resource (CUSTOM skills), and distinguishes from built-in skills and other delete tools. It also specifies the source of the id (from list_skills), making the purpose unambiguous.

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

Usage Guidelines4/5

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

The description clearly indicates when to use the tool (to delete custom skills) and when not to use it (built-in skills/recipes can't be deleted). It does not explicitly name alternative tools, but the exclusion is clear and the context implies other delete tools are for other resource types.

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

delete_threadDelete a Threads postA
DestructiveIdempotent
Inspect

PERMANENTLY delete one of the brand’s Threads posts. IRREVERSIBLE — Threads has no undelete. Call it WITHOUT confirm first: nothing is deleted, and it answers with the post’s real text plus its views, likes, replies and reposts read back from Threads. Show the user that, get an unambiguous yes, then call again with confirm:true — plus confirmName (the post’s exact text as it was reported) once anyone has engaged with it. confirmName exists because confirming that you meant to delete SOMETHING does not prove you aimed at the right post, and a wrong id must not be confirmable blind. Threads allows only 100 deletions per account per rolling 24 hours; threads_publishing_limit says how many are left, and a quota refusal otherwise reads like a broken connection. Note Meta documents nothing about what a delete does to the replies underneath a post, so do not promise the conversation survives. 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
postIdYespost id from list_threads_posts
confirmNoREQUIRED true — deletion is permanent; only set it after the user has explicitly agreed
confirmNameNothe post’s exact text as the unconfirmed call reported it — required once it has any likes, replies or reposts

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
postIdNo
deletedNo
verdictNo
permalinkNo
Behavior5/5

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

Discloses irreversibility (IRREVERSIBLE — no undelete), a 100-deletions-per-day quota, the confirmName requirement for engaged posts, and Meta's undocumented reply deletion behavior. These details go far beyond the annotations (destructiveHint, idempotentHint) and provide essential operational context.

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 dense but every sentence earns its place: core function, two-phase protocol, quota warning, and reply caveat. It is front-loaded with the key warning and structured logically, making it easy to parse despite its length.

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 destructive, multi-step tool with a quota and conditional parameter, the description covers all operational angles: what happens in each call, what to verify, which sibling tool to check for quota, and what not to promise. The output schema covers confirmed-deletion responses, so the unconfirmed-call response description is a bonus. Complete.

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

Parameters5/5

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

The schema covers all three parameters, but the description enriches them: confirm must be true only after user consent, confirmName is required once a post has engagement and explains why (prevents blind deletion of the wrong post), and postId is sourced from list_threads_posts. This transforms the schema's basic descriptions into a full operational workflow.

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 'PERMANENTLY delete one of the brand’s Threads posts,' using a specific verb and resource. It clearly distinguishes this tool from sibling deletion tools (e.g., delete_x_post, delete_meta_object) by explicitly naming Threads posts.

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 an explicit two-phase safety protocol: call without confirm to fetch post details, show the user, obtain unambiguous consent, then call again with confirm:true. It also mentions checking threads_publishing_limit for quota and warns not to promise reply survival, giving clear context on when and how to use the tool safely.

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

delete_x_ads_objectDelete an X ads object (permanent, cascades)A
Destructive
Inspect

PERMANENTLY delete an X campaign, line item, promoted post or targeting criterion. X CASCADES AND PUBLISHES NO UNDO: deleting a campaign destroys its line items and their promoted posts too — verified live, the children answer 404 the moment the parent is deleted. RUN IT WITHOUT confirm FIRST: that deletes nothing and reports the REAL blast radius read back off X (what is underneath it, whether it is live, whether it has spent). Show the user exactly that, get an unambiguous yes, then call again with confirm:true — and, for anything with children / live delivery / real spend, also confirmName set to its exact name and confirmChildren set to the real count, because confirm:true alone proves you meant to delete SOMETHING and cannot prove you aimed at the right object. TO STOP DELIVERY WITHOUT DESTROYING ANYTHING use set_x_ads_status PAUSED, which is reversible — except for a promoted post, which cannot be paused on X at all, so pause its LINE ITEM instead. Removing a targeting criterion WIDENS the audience rather than narrowing it. The result is confirmed by re-reading the object, never by X's 200.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYescampaign/line-item id, or the id from list_x_ads_promoted_tweets / list_x_ads_targeting
typeYes
confirmNoomit on the first call to see the blast radius
accountIdYes
lineItemIdNoREQUIRED for type "targeting_criterion" — X cannot look one up without its line item
confirmNameNothe target's exact name — required once it has children, is live, or has spent
confirmChildrenNothe real number of children, from the unconfirmed call

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
typeNo
deletedNo
verdictNo
platformNo
blastRadiusNo
Behavior5/5

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

The description goes far beyond the destructiveHint annotation by disclosing cascading deletion: 'deleting a campaign destroys its line items and their promoted posts too.' It also states the irreversible nature ('PUBLISHES NO UNDO') and explains the safety confirmation mechanism (confirmName, confirmChildren) to ensure the user aims at the correct object. It even clarifies that results are confirmed by re-reading, not by HTTP 200.

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 primary action, but it is a long paragraph that mixes many safety instructions. Every sentence adds value, yet the length could be slightly reduced without losing critical details. Overall it is well-structured with clear warnings and alternatives.

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 highly destructive, cascading tool, the description covers the essential context: what gets deleted, how to preview the blast radius, required confirmations, reversible alternatives, and edge cases. The presence of an output schema means return values need not be described. This is complete for safe and correct usage.

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?

At 71% schema coverage, the description meaningfully enriches parameter understanding. It explains the two-phase use of confirm ('RUN IT WITHOUT confirm FIRST... then call again with confirm:true'), the role of confirmName and confirmChildren (proving you aimed at the right object), and the lineItemId requirement for targeting_criterion. However, accountId is left implicit and some parameter nuances are only in the schema, not the description.

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 clear verb and resource: 'PERMANENTLY delete an X campaign, line item, promoted post or targeting criterion.' It specifies exactly what the tool acts on and distinguishes itself from related tools by naming set_x_ads_status as the reversible alternative for pausing delivery.

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 and when-not-to-use guidance. It states to 'RUN IT WITHOUT confirm FIRST' to see the blast radius, then call again with confirm:true after user approval. It also directs users to 'use set_x_ads_status PAUSED' to stop delivery without destruction, and notes the promoted post exception to pause its line item instead. The caveat about targeting criteria widening the audience adds another usage consideration.

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

delete_x_postDelete a post on XA
DestructiveIdempotent
Inspect

Permanently delete one of the connected account’s posts on X. This CANNOT be undone — confirm the exact post with the user first. Costs credits (X bills per API call). Needs X connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe numeric X post id — the last part of the post URL

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
deletedNo
costCreditsNo
Behavior5/5

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

The description adds significant behavioral detail beyond the annotations: permanence ('CANNOT be undone'), the need for user confirmation, credit cost, and the dependency on X being connected. This supplements the destructiveHint=true annotation without contradicting 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 description is concise and front-loaded, with the core purpose in the first sentence followed by necessary warnings, costs, and prerequisites. Every sentence adds value without redundancy.

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 simple one-parameter delete tool with a complete schema, an output schema, and rich annotations, the description covers all necessary context: what it deletes, irreversibility, confirmation requirement, cost, and prerequisite. No significant gaps remain.

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?

The input schema fully describes the only parameter 'id' as 'the numeric X post id — the last part of the post URL' (100% coverage). The description adds no additional parameter detail, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description explicitly states the verb (delete), the resource (posts on X), and the scope (one of the connected account's posts). It clearly distinguishes from sibling delete tools targeting other platforms (e.g., delete_google_business_post, delete_youtube_video) by naming X.

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 provides clear context: it's for deleting an X post, requires X to be connected, and advises confirming with the user due to permanence. It does not explicitly compare to alternative tools or state when not to use it, but the context is sufficiently clear for selection among siblings.

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

delete_youtube_report_jobDelete a YouTube bulk reporting jobA
Destructive
Inspect

Stop a YouTube bulk reporting job. IRREVERSIBLE IN A WAY THAT IS EASY TO MISS: the job IS the history — deleting it discards every daily CSV it has accumulated, and a replacement job starts over with only a 30-day backfill, so anything older than that is gone for good. Call WITHOUT confirm first: nothing is deleted and you get the real job read back from YouTube (its report type and when it was scheduled) to show the user. Then call again with confirm:true. Needs a connected YouTube channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesfrom list_youtube_report_jobs
confirmNotrue only after the user has seen the job and said yes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
noteNo
jobIdNo
deletedNo
reportTypeIdNo
Behavior5/5

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

Annotations already set destructiveHint=true, but the description reveals the critical nuance: the job IS the history, and deleting it discards all accumulated daily CSVs, with a replacement only backfilling 30 days. This goes far beyond the annotation and warns of an easy-to-miss consequence. It also clarifies the safe preview behavior when confirm is omitted.

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?

Five sentences, each earning its place: purpose, irreversible data-loss warning, safe preview workflow, confirmation step, and channel prerequisite. The most critical warning is front-loaded immediately after the purpose statement, making it hard to miss.

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 destructive tool with a subtle data-loss pitfall, the description covers the prerequisite, the exact confirmation protocol, and the irreversible consequence. An output schema exists, so return values are handled separately. No significant gap remains for an agent to safely invoke this 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 100%, giving baseline 3. The description enriches the confirm parameter by explaining the two-call pattern—without confirm returns the actual job for user review, with confirm triggers deletion. This adds substantial behavioral meaning beyond the schema's terse description, though jobId relies primarily on the schema's 'from list_youtube_report_jobs'.

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?

Description opens with 'Stop a YouTube bulk reporting job'—a specific verb and resource that clearly states the tool's function. It goes beyond a restatement by explaining the deletion's irreversible consequence, distinguishing it from list-style or reporting tools.

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?

The description gives an explicit two-step workflow: call WITHOUT confirm to preview, then call again with confirm:true after user approval. It also states the prerequisite 'Needs a connected YouTube channel,' providing clear when-to-use and how-to-use guidance.

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

delete_youtube_videoDelete a video from the connected YouTube channelA
DestructiveIdempotent
Inspect

PERMANENTLY delete a video from the connected YouTube channel. IRREVERSIBLE — YouTube has no trash and no undelete, and the video's views, comments and every link or embed pointing at it go with it. Call it WITHOUT confirm first: nothing is deleted, and it reports the video's REAL title, privacy, view count and comment count read back from YouTube. Show the user that, get an unambiguous yes, then call again with confirm:true — plus, once the video is public or has any views or comments, confirmTitle set to its exact title. confirmTitle exists because confirming that you meant to delete SOMETHING does not prove you aimed at the right video, and a wrong id must not be confirmable blind. If the user only wants it out of public view, use update_youtube_video(privacy:"private") instead — that is reversible and this is not. Get the videoId from list_youtube_videos. 0 credits. Needs a connected YouTube channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true — deletion is permanent and cannot be undone
videoIdYesthe YouTube video id (from list_youtube_videos)
confirmTitleNothe video's EXACT title as the unconfirmed call reported it — required once the video is public or has any views or comments

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
titleNo
deletedNo
videoIdNo
verifiedNo
Behavior5/5

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

Beyond the destructiveHint:true annotation, the description discloses the irreversible nature, the loss of views/comments/links/embeds, the two-step confirm flow, and the purpose of confirmTitle to prevent blind deletion. It also mentions 0 credits and the need for a connected YouTube channel, providing rich behavioral context beyond the annotations.

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

Conciseness4/5

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

The description is longer than average but every sentence carriers critical safety and usage information. It is front-loaded with the key warning 'PERMANENTLY delete' and flows logically from warning to two-step process to alternative. It is not wasteful, though a slightly tighter organization could improve 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?

The description covers all necessary context: prerequisites (connected channel), source of ID, the safety flow, the alternative for reversible privacy, and credit cost. Since an output schema exists, returning value details are not needed. For a destructive tool with a complex confirmation flow, this description is fully complete.

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

Parameters5/5

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

Although the schema covers 100% of parameters, the description adds substantial meaning: it explains the role of confirm (must be true for deletion), the exact purpose of confirmTitle (to confirm the right video, required for public/with views/comments), and the source of videoId. This is far beyond the schema's simple descriptions, significantly aiding correct invocation.

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

Purpose5/5

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

The description clearly states the verb+resource: 'PERMANENTLY delete a video from the connected YouTube channel.' It also differentiates itself from the sibling tool update_youtube_video by explicitly noting the reversible alternative for making a video private. The purpose is unmistakable and distinct.

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?

The description provides explicit usage guidelines: it instructs to call without confirm first, then with confirm:true, and explains when confirmTitle is required. It also tells the user to use update_youtube_video(privacy:'private') if they only want to remove from public view, and where to get the videoId (list_youtube_videos). This clearly addresses when-to-use versus alternatives.

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

disconnect_connectorDisconnect a connected accountA
DestructiveIdempotent
Inspect

Disconnect a third-party account from this workspace (Meta, Google Ads, Google Drive/Sheets/Docs, YouTube, TikTok, LinkedIn, X, Reddit, Pinterest, Google Business, Microsoft Advertising/OneDrive, Slack, …). This revokes our access at the provider and drops the stored credentials, so every tool for that provider stops working immediately and posts/campaigns already published are NOT affected. RECONNECTING NEEDS A BROWSER (the provider's consent screen) — an agent cannot undo this. Name the provider to the user, then call with confirm:true. Use list_connectors for the exact provider ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true — reconnecting needs the user's browser
providerYesprovider id exactly as list_connectors reports it, e.g. "meta", "google_ads", "youtube", "linkedin"

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
providerNo
disconnectedNo
Behavior5/5

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

Beyond annotations (destructiveHint=true, readOnlyHint=false), the description discloses crucial behavioral traits: revokes access, drops stored credentials, immediate effect on all tools for that provider, published posts unaffected, and the need for a browser to reconnect. It also warns that an agent cannot undo this, providing essential safety context. 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?

The description is detailed but every sentence serves a purpose: scope, effects, safety warning, and usage instructions. The provider list is long but informative. It is slightly more verbose than strictly necessary but remains efficient and front-loaded with the core action.

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 destructive and irreversible nature of disconnecting an account, the description covers all necessary context: prerequisite (user confirmation), consequences (tool failures), non-effects (published posts), and recovery constraint (browser needed). An output schema exists, so return values need no explanation. The description is fully complete for its complexity.

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?

Both parameters are covered 100% in the schema, and the description adds extra meaning: provider must be the exact ID from list_connectors, and confirm is explicitly required (REQUIRED true) despite being optional in the schema. This elevates the description beyond the baseline schema documentation.

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 uses a specific verb ('Disconnect') and resource ('third-party account from this workspace'), enumerates supported providers, and clearly distinguishes this from sibling tools like list_connectors and set_connector_accounts. It unambiguously defines the tool's function.

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 tells the agent when to use the tool (to disconnect a provider account), instructs to name the provider to the user, confirms with confirm:true, and points to list_connectors for exact provider IDs. It could more explicitly contrast with non-destructive alternatives, but the guidance is clear and actionable.

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

draft_brandDraft brand profileAInspect

Onboard a brand profile — from a website domain, a free-text description, or a social handle — into a {name, products, logo, …} object you can pass to plan_ad / generate. 0 ScrapeCreators credits. IMPORTANT: a domain can resolve to a DIFFERENT company than intended (e.g. bala.com is an engineering firm, not the Bala fitness brand at shopbala.com). Before spending any credits on research or renders, VERIFY the returned name (and summary) match the brand the user meant; if it looks wrong, re-draft with the correct domain or a description (pass save:false until confirmed) — this tool cannot ask the user, so the caller owns that check.

ParametersJSON Schema
NameRequiredDescriptionDefault
saveNosave as the workspace’s brand (like Studio onboarding) so plan_ad/create use it automatically. Default: saves only when NO brand is saved yet; pass true to overwrite, false to never save
domainNoa website to scrape
platformNoplatform for socialHandle (instagram/tiktok/…)
descriptionNoa free-text brand description (no website)
socialHandleNoa social handle to draft from (influencers/creators) — pair with platform

Output Schema

ParametersJSON Schema
NameRequiredDescription
logoNothe detected logo URL
nameNothe drafted brand name — VERIFY it matches the brand the user meant
sellsNowhat the brand sells
domainNothe brand website domain (empty for non-website drafts)
paletteNothe brand colors
summaryNoa short positioning summary
categoryNothe detected category
productsNothe detected products
productImagesNoproduct photo URLs
Behavior5/5

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

The description adds critical behavioral context: 0 ScrapeCreators credits, the domain can resolve to a different company, and the caller must verify before spending credits. It also discloses the tool cannot ask the user, which is beyond what the annotations provide.

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 two sentences with the main purpose front-loaded. The second sentence is long but each clause earns its place by communicating essential warnings about domain mismatches, verification, and save behavior.

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 description covers the purpose, source options, cost, and a key error-avoidance workflow, while the output schema handles return values. It does not explicitly state that the three source parameters are mutually exclusive or that platform pairs with socialHandle, but the schema hints at this and the guidance is otherwise adequate.

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 schema already documents all parameters, but the description adds meaning by implying the three source inputs are alternatives and by explaining when to pass save:false. It enhances the schema's descriptions with practical usage.

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

Purpose5/5

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

The description clearly states that the tool 'onboards a brand profile' from one of three source types (domain, description, or social handle) into a reusable object for plan_ad/generate. It distinguishes itself from sibling brand tools by focusing on the drafting/onboarding flow and the verification step.

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 explains when to use the tool (onboarding from domain/description/social handle) and provides specific guidance: verify the returned name/summary, re-draft if wrong, and use save:false until confirmed. It does not explicitly contrast this with create_brand or update_brand, but the use case is clear and the caveats guide the caller.

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

dub_videoDub videoAInspect

Localize a finished video into another language WITHOUT re-rendering it: the spoken track is transcribed, translated, re-voiced and lip-synced back onto the SAME footage, so the visuals, timing and edit are untouched. Just pass the video and the language — the script is read off the source automatically (pass script only to override what it heard). Paid; returns the served URL of the localized video.

ParametersJSON Schema
NameRequiredDescriptionDefault
videoYesthe source video URL
voiceNooptional target voice preset, e.g. 'Aria' (warm female) or 'George' (confident male). Defaults to a voice matching the source speaker's register.
scriptNoOPTIONAL override for the original spoken words. Leave this out — the source video is transcribed automatically. Only pass it when you already know the exact script and the auto-transcript got it wrong.
languageYestarget language, e.g. 'Spanish', 'de', 'French (Canada)'

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior4/5

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

Annotations provide no safety hints (all false), so the description carries the burden. It discloses key behaviors: it's paid, it returns a served URL, it automatically transcribes the source, and the script parameter is only an override. This adds meaningful context beyond structured fields.

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

Conciseness5/5

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

The description is front-loaded with the core concept ('Localize... WITHOUT re-rendering'), then efficiently expands on the workflow and output. Every sentence earns its place, and there is no redundant restating of the tool's name or title.

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 and 4 parameters documented, the description covers the essential scenario: automatic transcription, optional script override, paid nature, and return of a served URL. It is sufficiently complete for an AI agent to invoke correctly, given the structured data.

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% for all 4 parameters, so baseline is 3. The description adds extra meaning by explaining that `script` overrides the automatically-read transcript, which is not fully captured in the schema. It also reinforces that `video` and `language` are the primary inputs.

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 ('Localize') and resource ('a finished video') with a clear outcome: translating and lip-syncing without re-rendering. It distinguishes itself from siblings like clip_video or edit_video by emphasizing that visuals, timing, and edit are untouched.

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 clearly implies when to use: when you need a finished video localized without re-rendering. It instructs the user to 'just pass the video and the language' and explains the script override scenario. It does not explicitly list alternatives or when-not-to-use, so it doesn't earn a 5.

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

duplicate_scheduledDuplicate a scheduled postAInspect

Copy an existing scheduled or already-published post into a NEW queued post — the way to run a creative again, reuse a post that worked as the starting point for the next one, or re-send something after it went out. It copies the caption, media, per-channel captions, title, description, tags and the target board / Page / company Page / listing, and ANY of those can be overridden in the same call. Give a new time in at, or useQueue:true to drop it into the brand’s next free posting slot. The copy is INDEPENDENT — editing or cancelling it never touches the original — and it is a genuinely new post rather than a re-send, so it publishes even where the original already did. To re-fire only the channels that FAILED, use retry_scheduled instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNowhen the copy goes out — ISO timestamp or epoch milliseconds (default: an hour from now)
idYesthe post to copy, from list_scheduled
linkNo
titleNo
pageIdNoFACEBOOK / INSTAGRAM / THREADS — which connected Page (list_meta_pages)
boardIdNoPINTEREST — the board for the copy (list_pinterest_boards)
messageNoa different caption for the copy
captionsNoper-channel caption overrides for the copy
channelsNopost the copy to these channels instead of the original’s
imageUrlNo
timezoneNoIANA zone for the queue, e.g. "America/New_York"
useQueueNoinstead of naming a time, take the brand’s next free posting slot
videoUrlNo
imageUrlsNoCAROUSEL — an ORDERED list of image URLs published as ONE swipeable post
locationIdNoGOOGLE BUSINESS — which listing (list_business_locations)
visibilityNo
linkedinOrganizationIdNoLINKEDIN — publish the copy as this company Page (list_linkedin_pages)

Output Schema

ParametersJSON Schema
NameRequiredDescription
atNo
idNo
noteNo
channelsNo
duplicateOfNo
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses key behavioral traits: the copy is 'INDEPENDENT — editing or cancelling it never touches the original', and it is 'a genuinely new post rather than a re-send, so it publishes even where the original already did.' These critical facts are not present in the annotations and are essential for correct usage.

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, and the rest is organized with dashes and semicolons to separate copy attributes, override options, scheduling options, and independence semantics. Every sentence adds value, and the length is justified for a 17-parameter tool.

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 and annotations covering safety, the description provides complete context: core function, use cases, parameter behaviors (overrides, scheduling), independence, and an explicit alternative. No critical gaps remain for a complex tool like this.

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 description adds meaning by explaining the copy-and-override model (e.g., 'ANY of those can be overridden in the same call') and explicitly mentions `at` and `useQueue`. However, several parameters like link, visibility, timezone, and channels are not directly described in the text, though the schema covers them. Schema coverage is 71%, so the description significantly boosts understanding but not perfectly exhaustively.

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 specific verb and resource: 'Copy an existing scheduled or already-published post into a NEW queued post.' It clearly distinguishes from siblings, especially retry_scheduled, by stating exactly what the tool produces. No ambiguity about its core function.

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?

The description explicitly lists use cases: 'run a creative again', 'reuse a post that worked as the starting point', 're-send something after it went out'. It also names an alternative directly: 'To re-fire only the channels that FAILED, use retry_scheduled instead.' This provides clear when-to-use and when-not-to-use guidance.

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

edit_reddit_postEdit a Reddit text post’s bodyA
Idempotent
Inspect

Rewrite the BODY of one of the connected account’s Reddit TEXT posts — the fix for a dead link, a wrong price or a correction the comments are asking for. THREE THINGS REDDIT DOES NOT ALLOW, and you must not offer them: (1) a post’s TITLE can never be changed by any API — title exists only on Reddit’s submit endpoint, so a published title is frozen for every client, not just this one; (2) a LINK post cannot be edited at all — Reddit documents this endpoint as editing "the body text of a comment or self-post" and refuses a link post; (3) a post that has already been deleted cannot be edited. In each case the only remedy is to delete and submit again, which loses the score, the age and the whole comment thread — say that plainly instead of implying an edit is possible. The result is READ BACK from Reddit, so an accepted edit that did not apply is reported as NOT confirmed rather than narrated as done. 0 credits. Needs Reddit connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesthe new body markdown — this REPLACES the existing body
postIdYesthe post id, its t3_… fullname, or the permalink (list_reddit_posts returns them)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
noteNo
titleNo
postIdNo
appliedNo
subredditNo
Behavior5/5

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

Annotations already indicate non-read-only, non-destructive, idempotent. The description adds crucial behavioral context: title is immutable for any client, link posts are refused by the endpoint, deleted posts cannot be edited, and results are read back so an unapplied edit is reported as NOT confirmed. No contradictions with annotations.

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

Conciseness4/5

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

The description is longer than typical but justified by the tool's many caveats. It front-loads the main purpose and uses a numbered list for the three Reddit limitations, making it scannable. Some redundancy could be trimmed ('say that plainly'), but overall structure aids comprehension.

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 and the presence of an output schema, the description covers all essential context: operational details (0 credits, Reddit connection), the three hard limitations, the alternative remedy, and the confirmation behavior. It is complete for an agent to decide when to invoke and what to expect.

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?

The input schema already provides thorough descriptions for both parameters (postId accepts t3_ fullname/permalink; text is the new markdown body) with 100% coverage. The description reinforces the text-post requirement but does not significantly add parameter-level detail beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb+resource+scope: 'Rewrite the BODY of one of the connected account’s Reddit TEXT posts.' It clearly distinguishes from siblings by narrowing to text posts and clarifying that this edits an existing body, unlike delete_reddit_post or post_to_reddit. The title and description align.

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 use cases ('fix for a dead link, a wrong price or a correction the comments are asking for') and explicit non-use cases: title cannot be changed, link posts cannot be edited, deleted posts cannot be edited. It even states the alternative remedy (delete and submit again) and says to communicate that plainly. Also gives prerequisite 'Needs Reddit connected.'

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

edit_videoEdit a video clipAInspect

EDIT/transform an existing video clip with a natural-language instruction (video-to-video) — KEEPS the original motion, timing and edit, changes the subject/setting/style. Use for 'change the background to a city', 'make it nighttime', 'restyle it as claymation', 'swap the product'. Best on 3–10s clips. NOT for mechanical cuts, trims, end cards or watermarks (use post_edit — seconds, ~2 credits, no AI model), NOT for making a new video (generate_video / render_ad), NOT for translating the spoken track (dub_video) and NOT for putting a saved creator's face on the motion (recast_motion). Paid render; returns the served URL of the edited clip.

ParametersJSON Schema
NameRequiredDescriptionDefault
videoYesthe source video URL (from a previous render, a job result, or list_library)
elementsNoOPTIONAL identity/product grounding (≤4): a creator portrait or the real product photo, so the edit restores the REAL thing instead of re-inventing it. Describe each one in the instruction. Leave out for a plain restyle
keepAudioNodefault true — keep the source clip’s audio track. Set false to return the edit silent
instructionYesthe exact transformation to apply, in the user’s own words

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior5/5

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

Annotations are minimal (all false hints), so the description carries the burden. It discloses that this is a paid render, preserves original motion/timing/edit, and returns a served URL. It also specifies the ideal clip length (3–10s), adding behavioral context beyond the schema and annotations. 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.

Conciseness5/5

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

The description is dense but every sentence earns its place: purpose, examples, constraints, exclusions, and outcome. Front-loaded with the core action and scoped alternatives, it avoids filler and is well-structured for scanning.

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, the presence of an output schema, and rich sibling context, the description is complete. It covers what the tool does, when to use it, when not to, cost implications, output format (served URL), and input constraints. No critical gaps remain.

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 each parameter already has a detailed description. The tool description does not add significant parameter-level semantics beyond the examples of transformations, which are instructive but not required. Baseline 3 is appropriate because 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 uses a specific verb ('EDIT/transform') and resource ('existing video clip'), clarifies the video-to-video nature, and differentiates from siblings by naming alternative tools like post_edit, generate_video, and dub_video. Examples of transformations make the purpose unmistakable.

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

Usage Guidelines5/5

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

Provides explicit 'Use for' scenarios with concrete examples, and a detailed 'NOT for' list that names specific alternative tools (post_edit, generate_video/render_ad, dub_video, recast_motion) and even mentions credit costs. This gives clear when-to-use and when-not-to-use guidance.

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

error_detailError detailA
Read-only
Inspect

One error group in full by fingerprint (from list_errors): every field, plus the most recent redacted occurrences — status, connector, job id, workspace, and a shape-only echo of the inputs. This is what makes a bug reproducible. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
fingerprintYesthe `fp` value from list_errors

Output Schema

ParametersJSON Schema
NameRequiredDescription
fpNo
kindNo
countNo
samplesNomost recent occurrences, redacted
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses two important behaviors: occurrences are redacted and inputs are echoed only by shape. It also states 'Read-only, 0 credits,' adding cost and safety context not present in annotations.

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

Conciseness5/5

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

Two sentences, front-loaded with the core purpose. Every phrase adds value: scope, source, content, redaction behavior, and cost. No fluff or repetition.

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 a single required parameter and an output schema, the description covers what the tool returns, the source of the input, redaction/privacy caveats, and cost. It is fully sufficient for an agent to select and invoke 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 coverage is 100% and the description repeats the same 'from list_errors' guidance as the schema's `fp` description. The description doesn't add extra semantic meaning for the parameter beyond what the schema already 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 uses a specific verb ('One error group in full') and resource ('by fingerprint'), clearly distinguishing it from the sibling list_errors. It states what is returned (every field plus redacted occurrences), making the purpose unmistakable.

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

Usage Guidelines4/5

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

It explicitly says the fingerprint comes from list_errors, implying the tool should be used after listing error groups. It doesn't explicitly state when not to use it or name alternatives, but the connection to list_errors and the 'in full' scope gives clear usage context.

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

estimate_meta_reachEstimate how many people a Meta audience reachesA
Read-only
Inspect

Ask Meta how many people a targeting spec can actually reach — BEFORE any budget is committed. Two ways: pass adSetId to size an ad set you already built (Meta uses its own saved targeting), or pass the same targeting object you would give create_meta_ad (plus optional objective / optimizationGoal / country / pixelId) to size an audience you are considering. Returns the monthly-active range, a daily-active estimate, and an explicit warning when the audience is too narrow to deliver. Free, read-only, creates nothing and spends nothing. Use it before recommending a budget and every time the user narrows a geo or piles on interests.

ParametersJSON Schema
NameRequiredDescriptionDefault
adSetIdNosize an EXISTING ad set using its own saved targeting
countryNo2-letter fallback country when targeting names no geo
pixelIdNoestimate a conversion goal against this pixel
objectiveNoOUTCOME_TRAFFIC | OUTCOME_SALES | … — picks the matching optimization goal
targetingNoa targeting object, same shape as create_meta_ad.targeting
adAccountIdYesad account id (act_… or digits)
conversionEventNoe.g. PURCHASE — used with pixelId
optimizationGoalNooverride the goal, e.g. REACH / LINK_CLICKS / OFFSITE_CONVERSIONS

Output Schema

ParametersJSON Schema
NameRequiredDescription
narrowNo
summaryNo
estimateReadyNo
dailyOutcomesCurveNo
dailyActiveEstimateNo
monthlyActiveLowerBoundNo
monthlyActiveUpperBoundNo
Behavior4/5

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

The description goes beyond the readOnlyHint by adding that the tool is 'free' and 'spends nothing,' and discloses that it returns a monthly-active range, daily-active estimate, and a warning for narrow audiences. With annotations already declaring readOnlyHint, this extra context about output and cost behavior is valuable and non-redundant.

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 four sentences, each carrying distinct value: purpose, usage modes, return values, and when to use. It is front-loaded with the core purpose and avoids fluff, making it easy for an agent to parse quickly.

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 (8 params, nested targeting object, output schema), the description covers the key context: what it returns, side effects (none), warning behavior, and usage triggers. The output schema exists, so the description correctly avoids detailing return structure. No major gaps are apparent.

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 parameters are documented in the schema. The description adds significant meaning by explaining the two complementary modes (adSetId vs. targeting), referencing the 'same shape as create_meta_ad.targeting' for cross-tool consistency, and noting how optional parameters like country or pixelId are used. This exceeds the schema's individual field descriptions.

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

Purpose5/5

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

The description clearly identifies the tool as one that estimates Meta audience reach before budget commitment, with a specific verb ('estimate') and resource ('Meta audience'). It distinguishes itself from siblings by emphasizing it is read-only and free, contrasting with tools like create_meta_ad or meta_insights.

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 states when to use: 'before recommending a budget and every time the user narrows a geo or piles on interests.' It explains two invocation modes (adSetId vs. targeting object) and notes it 'creates nothing and spends nothing,' which clarifies it is not for execution. However, it does not explicitly name alternatives or exclusion scenarios beyond the implicit read-only vs. create distinction.

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

fetch_app_screensFetch App Store screensA
Idempotent
Inspect

Pull an APP brand's REAL App Store screenshots into the workspace brand, so a screen-hungry native format can use them. Use when the brand has 0–1 app screens on file and you want make_template_ad(template:'app-ui-tour'), or the user asks to 'pull my app's screenshots'. Pass appName (defaults to the saved brand's name). FREE — a keyless App Store lookup. It needs a CONFIDENT match: an ambiguous or unknown app returns 0 screens and saves nothing, which you should relay plainly rather than retrying with guesses. On success the screens are saved to the brand (durable URLs) and are immediately usable.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNameNothe app's name to look up on the App Store — defaults to the saved brand's name
brandIdNoa brand id/name from list_brands to save the screens onto; omit to use the active brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
savedNotrue when the screens were written onto the brand profile
appNameNothe app the store matched
screensNothe durable served URLs of the App Store screenshots
appStoreUrlNothe matched App Store listing
Behavior5/5

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

The description adds substantial behavioral context beyond the annotations: it is 'FREE — a keyless App Store lookup' (no auth needed), it requires a 'CONFIDENT match' and returns 0 screens with no save on ambiguous/unknown apps, and on success screens are persisted as 'durable URLs' and 'immediately usable.' These details are not inferable from readOnlyHint=false, openWorldHint=true, or idempotentHint=true. No contradiction with annotations exists.

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 appropriately front-loaded with the main purpose and includes several useful clauses (use case, default, free status, failure mode, success behavior). It is a bit dense with jargon like 'screen-hungry native format,' but every sentence earns its place and there is no fluff. Slightly longer than strictly necessary, but well-structured.

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 tool of this complexity (external lookup, write to brand, failure conditions), the description covers all essential context: when to use, parameter default, authentication/cost, failure mode and how to communicate it, and what happens on success. The presence of an output schema covers return-value details, so the description does not need to enumerate them. No significant gaps remain.

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 the baseline is 3. The description redundantly restates the default behavior of appName ('defaults to the saved brand's name') which is already in the schema, and does not mention brandId at all. Thus the description adds no meaningful semantic value beyond the schema's parameter descriptions.

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 specific verb and resource: 'Pull an APP brand's REAL App Store screenshots into the workspace brand.' This clearly states what the tool does and differentiates it from sibling tools like fetch_asset by emphasizing the App Store source and the destination (workspace brand). It also mentions the purpose (feeding a 'screen-hungry native format') and a concrete use case, making the tool's role unambiguous.

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 guidance is provided: 'Use when the brand has 0–1 app screens on file and you want make_template_ad(template:'app-ui-tour'), or the user asks to pull my app's screenshots.' This names a specific sibling tool and template, and also tells the agent how to handle ambiguous/unknown apps (relay plainly rather than retrying with guesses). This exceeds basic context by giving both a trigger condition and a failure-handling instruction.

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

fetch_assetFetch assetA
Read-only
Inspect

Resolve a generated asset reference (a /generated/… path or any URL) to a clickable absolute URL + a direct download URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesthe asset url or /generated/ path
nameNooptional filename for the download

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNothe clickable absolute asset URL
downloadUrlNoa direct download URL for the asset
Behavior4/5

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

Annotations already declare readOnlyHint: true, and the description is consistent. It adds useful behavioral detail by clarifying that it accepts 'a /generated/… path or any URL', implying it can handle both internal generated references and arbitrary external URLs, and that it returns two distinct URLs (clickable absolute and direct download). This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

The description is a single sentence of about 20 words, directly front-loading the core action and outcome. Every word contributes to understanding the tool's purpose, with no filler or repetition.

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?

The tool is simple (2 params, 1 required), has readOnly annotations, and an output schema exists (per context signals), so the description does not need to cover return values. It thoroughly describes the input and transformation, making it complete for an agent to invoke correctly.

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

Parameters3/5

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

The schema already provides 100% description coverage for both parameters (url and name), so the description does not need to add much. It echoes the url parameter's semantics ('a /generated/… path or any URL') but does not introduce additional meaning beyond what the schema states. Baseline 3 is appropriate.

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

Purpose5/5

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

The description uses the specific verb 'Resolve' and clearly identifies the resource: 'a generated asset reference (a /generated/… path or any URL)'. It also states the output: 'a clickable absolute URL + a direct download URL'. This distinguishes it from sibling generation/upload tools by focusing on converting existing references to URLs.

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 phrasing 'Resolve a generated asset reference' provides clear context for when this tool is appropriate: whenever you have a /generated/ path or URL that needs to be converted into accessible URLs. While it does not explicitly mention when not to use it or name alternatives, the context is sufficiently clear for an agent to know this is the resolution tool.

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

find_competitorsFind competitorsA
Read-only
Inspect

Discover a brand's competitor / similar / adjacent brands from its domain (Claude grounded by web search). mode=competitors (default, excludes the searched company), inspiration (best relevant ads incl. it), or company. 0 ScrapeCreators credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo'competitors' (default, excludes the searched company), 'inspiration' (best relevant ads incl. it), or 'company'
domainYesthe brand domain, e.g. flourish.com

Output Schema

ParametersJSON Schema
NameRequiredDescription
candidatesNodiscovered brands ({name, domain, kind, reason})
diagnosticsNodiscovery diagnostics (LLM tokens, web grounding)
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, and the description adds valuable context: 'Claude grounded by web search' indicates real-time external grounding, and '0 ScrapeCreators credits' clarifies cost. It also explains behavior like excluding the searched company in the default mode, going beyond what annotations provide.

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 sentences long and front-loaded with the core purpose. Every sentence earns its place: primary function, grounding method, mode semantics, and credit cost are all covered without redundancy or fluff.

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 simplicity (2 params, 100% schema coverage, output schema present, and read-only annotations), the description is complete. It explains modes, defaults, external grounding, and cost, leaving no significant gaps for an agent to select and 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 description coverage is 100%, so the schema fully documents domain and mode. The description essentially repeats the mode semantics already present in the schema (e.g., 'competitors (default, excludes the searched company)'), adding no new parameter-level information. Baseline 3 is appropriate because the schema carries the explanatory burden.

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

Purpose5/5

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

The description clearly states the tool 'Discover a brand's competitor / similar / adjacent brands from its domain', using a specific verb and resource. It distinguishes itself from sibling tools like competitor_teardown by focusing on discovery of related brands rather than deep analysis, and the mode list further clarifies scope.

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 provides clear context on when to use the tool and explains the three modes with defaults and exclusions (e.g., 'competitors (default, excludes the searched company)'). It does not explicitly name alternative sibling tools for when not to use this tool, but the mode guidance is sufficient for most use cases.

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

find_google_ads_locationsLook up Google Ads locationsA
Read-only
Inspect

Look up Google Ads location targets by name — turns "Toronto" / "California" / "United Kingdom" into the geo target ids Google needs, with each one's type (COUNTRY, STATE, CITY, POSTAL_CODE…) and reach. Use it when a location name is ambiguous, or to show the user exactly which place you are about to target. Read-only and free.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesone location name, or several comma-separated (up to 25)
countryCodeNo2-letter hint, e.g. CA to disambiguate "London"
loginCustomerIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
locationsNo
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the description doesn't need to restate read-only, but it adds value by mentioning 'free' and describing the output structure (type and reach). This gives the agent a clearer picture of what to expect from the call.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the primary verb, and every sentence contributes (core function + usage guidance). No extraneous 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?

The description, combined with the output schema and annotations, provides a full picture: purpose, usage, read-only status, and expected outputs. The missing param explanation is minor given the overall context.

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% and the description provides concrete examples ('Toronto', 'California') that illustrate query semantics. However, it doesn't explain the loginCustomerId parameter, which remains undocumented in both the description and schema, so the description only partially compensates for the coverage gap.

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

Purpose5/5

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

The description clearly states the tool 'looks up Google Ads location targets by name' and explains the conversion to geo target IDs with type and reach. This specific verb+resource combination distinguishes it from sibling tools like microsoft_ads_geo_search and openai_ads_geo_search.

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 explicitly provides two use cases: when a location name is ambiguous or when the user needs to see exactly which place is targeted. While it doesn't name alternative tools, the guidance is clear about when to apply this lookup.

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

find_meta_audiencesLook up Meta targeting idsA
Read-only
Inspect

Look up the Meta targeting ids you need before building an ad set — interests, behaviours, cities/regions/zips/DMAs, languages, employers, job titles and schools. type:"adinterest" (q:"yoga") returns interest ids + audience size; type:"adTargetingCategory" with class:"behaviors" returns behaviour ids; type:"adgeolocation" (q:"Toronto", optionally locationTypes:"city") returns the geo KEYS that go in targeting.geo.cities/regions/zips; type:"adlocale" (q:"french") returns language ids for targeting.locales. Read-only and free. Use it whenever the user names an audience in words — never guess an id.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNowhat to search for
typeYeswhat kind of targeting object to search
classNofor adTargetingCategory, e.g. "behaviors" or "interests"
limitNo
adAccountIdNosearch with that ad account’s token
countryCodeNo2-letter hint to disambiguate a city name
locationTypesNocomma-separated: country,region,city,zip,geo_market

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
resultsNo
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces this with 'Read-only and free,' adding cost/access context not present in annotations. It also discloses specific output behaviors—e.g., adinterest returns audience size, adgeolocation returns geo KEYS for targeting fields. It doesn't mention rate limits or auth, but the annotation coverage lowers the bar, and the extra context earns a 4.

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 its core purpose and then uses compact, semicolon-separated examples. It is longer than a one-liner, but every sentence earns its place by covering a distinct type or behavior. A bulleted layout might improve scannability, but the current structure is dense and efficient.

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 breadth—7 parameters, 11 enum types, and an output schema—the description covers all audience categories in the opening clause and provides detailed examples for the most common types. It explains how results map to targeting object fields, which is essential for ad set creation. The presence of an output schema handles return structures, making the description sufficiently complete.

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

Parameters5/5

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

Schema coverage is 86%, yet the description adds substantial usage semantics: concrete examples for type:'adinterest', type:'adTargetingCategory' with class:'behaviors', type:'adgeolocation' with locationTypes:'city' and q:'Toronto', and type:'adlocale' with q:'french'. It also maps results to targeting.geo.cities/regions/zips and targeting.locales, which is not in the schema. This goes well 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?

The description opens with a precise action—'Look up the Meta targeting ids'—and clearly scopes it to pre-ad-set research. It enumerates the coverage (interests, behaviors, geo, languages, employers, etc.), which distinguishes it from sibling tools like create_meta_audience or list_meta_audiences that manage saved audiences rather than resolve targeting IDs.

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 explicitly states when to use the tool: 'Use it whenever the user names an audience in words — never guess an id.' This is a strong selection rule. It doesn't explicitly name alternatives or exclusion scenarios, but it clearly frames the tool as the mandatory path for ID resolution, and no sibling tool serves the same purpose.

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

finish_videoFinish videoAInspect

Post-process an EXISTING rendered video (its served mp4 URL) with the proven direct-response 'reviewer' finish and/or a film-grain pass — no AI model, ~30s, a couple of credits. pills=true composites a header pill (e.g. '10/10 would buy again'), a brand-accent sub-pill, and 3-4 green-check proof pills cascading in on the beat (YOU author the copy: header ≤40 chars, sub ≤34, each point ≤44 — concrete real benefits, never fabricated stats). grain=true applies a subtle camera-grain finish that makes photoreal AI renders look phone-shot ('less AI') — works alone or with pills. Returns a NEW video; the original is untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
subNoaccent sub-pill copy, ≤34 chars (usually the product/brand)
grainNodefault false — anti-AI film-grain finish
pillsNodefault true — set false for a grain-only pass
accentNobrand accent hex for the sub-pill
headerNoheader pill copy, ≤40 chars (required when pills is on)
pointsNo3-4 proof points, ≤44 chars each
videoUrlYesthe served URL of the video to finish (from a previous render/job)

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior5/5

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

Beyond the annotations (which provide only generic false hints), the description discloses concrete behavioral traits: duration (~30s), cost (a couple of credits), no AI model, output is a NEW video while the original is untouched, character limits for copy, and the requirement that the user authors the copy. No contradictions with annotations.

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

Conciseness5/5

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

The description is a single dense paragraph but every sentence earns its place. It front-loads the primary purpose, then efficiently covers both modes, copy constraints, and the non-destructive result. No wasted words or repetition of schema data.

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 tool with 7 params and conditional logic, the description is remarkably complete: it covers what it does, cost/time, input requirements, output behavior, copy limits, and the relationship between pills and grain. An output schema exists, so return-value details are not needed, and the description fills the remaining gaps.

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

Parameters5/5

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

Despite 100% schema coverage, the description adds substantial semantic value: numeric character limits (header ≤40, sub ≤34, each point ≤44), conditional requirement (header needed when pills=true), default values (pills=true, grain=false), and quality guidance (concrete real benefits, never fabricated stats). This goes far beyond the schema descriptions.

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 specific verb and resource: 'Post-process an EXISTING rendered video (its served mp4 URL)' and lists the two key capabilities (reviewer finish and film-grain pass). It clearly distinguishes from siblings like edit_video or clip_video by focusing on finishing with pills/grain.

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 context: use for an already-rendered video, with options for pills and grain, and notes the original is untouched. It does not explicitly name alternative tools or state when-not-to-use, but the context is strong enough to infer appropriate use.

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

fix_beatFix a video beatAInspect

Surgically re-render ONE time window (1.5-8s) of an existing rendered video and splice it back on the VIDEO TRACK ONLY — the rest of the video and ALL audio stay byte-identical. Use when one beat/shot is broken ('the shot at 8 seconds glitches') and a full re-render would waste the parts that worked; bills only the replacement clip's seconds (~1/3 of a full render). Do NOT pick a window covering spoken dialogue (a video-only splice under speech breaks lip-sync) — pass speechWindows to enforce this.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYeswhat the replacement footage should show — describe the shot, matching the master's style
refImageNooptional product/style anchor image URL
videoUrlYesthe served URL of the master video to fix
endSecondsYeswindow end in seconds (window 1.5-8s)
startSecondsYeswindow start in seconds
speechWindowsNo[[start,end],...] windows with spoken lines — the fix window must not overlap these

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior5/5

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

The description discloses critical behavioral traits beyond the annotations: only the video track changes while audio stays byte-identical, billing is proportional to the replaced clip's seconds, and window length is constrained to 1.5-8s. It also warns about lip-sync issues and instructs the agent to pass speechWindows to enforce the constraint. All annotations (readOnly=false, destructive=false) are consistent.

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 sentences, each earning its place. The first sentence delivers the core mechanics, the second the primary use case, the third the billing implication, and the fourth a critical safety instruction. It is front-loaded and free of redundant phrases.

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 video-editing tool with 6 parameters and a nontrivial operational profile, the description covers purpose, usage, cost, side effects (video-only splice), and a key constraint (speech windows). An output schema exists, so return values need not be described. The description is sufficiently complete for an agent to decide when to use this tool and to invoke it correctly.

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 description coverage is 100%, so the baseline is 3. The description adds meaningful context for parameter usage: it explains that speechWindows should be provided when dialogue exists to avoid lip-sync issues, and it links the 1.5-8s constraint to the start/endSeconds parameters. This goes beyond the schema's individual parameter descriptions, though it does not systematically re-describe each parameter.

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 highly specific verb and resource: 'Surgically re-render ONE time window (1.5-8s) of an existing rendered video and splice it back on the VIDEO TRACK ONLY'. It clearly distinguishes this from sibling tools like clip_video or edit_video by emphasizing the surgical, targeted nature and the preservation of all other content.

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 guidance is provided: 'Use when one beat/shot is broken... and a full re-render would waste the parts that worked'. It also gives a clear when-not-to-use: 'Do NOT pick a window covering spoken dialogue'. The alternative of a full re-render is explicitly contrasted, even though no specific sibling tool is named.

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

forgetForget a memoryA
DestructiveIdempotent
Inspect

Delete a saved Memory item by its id (from list_memory). Records a cross-device delete so it doesn’t come back. Minor + re-creatable (you can remember it again), so no confirm needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe memory item id (from list_memory)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
removedNo
Behavior5/5

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

Annotations already indicate destructive and idempotent behavior, and the description adds valuable context: the delete is cross-device, won't come back, is 'minor', and is re-creatable via remember. This exceeds what annotations alone convey.

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 concise sentences, each providing essential information: the core action, the cross-device nature, and the safety rationale. No redundant words or 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 simple delete-by-id tool with one documented parameter, an output schema, and comprehensive annotations, the description plus structured metadata fully covers the operational context. Nothing important 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?

The only parameter (id) is fully documented in the schema with the same description text. The tool description repeats this but adds no new semantic detail beyond the schema, so baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Delete') and resource ('saved Memory item'), and clarifies the id comes from list_memory. This clearly distinguishes it from related tools like remember and list_memory.

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 explicitly references list_memory as the source for the id and explains that the deletion is re-creatable, implying when it's safe to use without confirmation. It doesn't explicitly discuss when not to use it, but the context is clear enough.

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

format_sheetFormat a Google SheetA
Idempotent
Inspect

Make an exported sheet readable: bold the header row, FREEZE it so it stays visible while scrolling, and auto-size the columns so nothing is cut off. Worth calling right after create_sheet — a raw export with unsized columns and a header that scrolls away is the difference between a spreadsheet someone reads and one they close. Changes no cell VALUE, so it is never gated. The defaults do all three on the first tab; pass tab to pick another, freezeRows:0 to skip freezing, boldHeader:false or autoResize:false to skip those.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNotab title or numeric sheetId (default: the first tab)
sheetUrlNo
autoResizeNo
boldHeaderNo
freezeRowsNohow many top rows to freeze (default 1, 0 = none)
spreadsheetIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
tabNo
urlNo
noteNo
appliedNo
sheetIdNo
spreadsheetIdNo
Behavior4/5

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

The description adds the key behavioral detail that it 'changes no cell VALUE' and 'never gated,' which goes beyond the annotations (readOnlyHint false, idempotentHint true). It also explains defaults and how to skip operations, providing useful context beyond the structured metadata.

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 efficiently packed: it opens with the main action, presents a compelling usage rationale, then details parameter overrides. Every sentence earns its place without verbosity or repetition.

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 moderate complexity, the description covers the primary use case, default behavior, and parameter toggles. An output schema exists, so return-value details are not needed. The description is self-sufficient for an agent to decide when and how to invoke 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?

With schema description coverage at only 33%, the description compensates for tab, freezeRows, boldHeader, and autoResize by explaining their usage and defaults. However, it completely omits spreadsheetId and sheetUrl, leaving the agent without guidance on how to specify the target sheet, which is a significant gap given the low schema coverage.

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

Purpose5/5

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

The description clearly states the tool formats a Google Sheet by bolding the header, freezing it, and auto-sizing columns. It distinguishes itself from siblings like create_sheet, update_sheet, and append_to_sheet by focusing on post-export readability formatting.

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 explicitly recommends calling it right after create_sheet and explains the benefit ('difference between a spreadsheet someone reads and one they close'). However, it does not mention when not to use it or name alternative tools for similar tasks, so it stops short of a 5.

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

generate_avatarGenerate talking avatarAInspect

Render a TALKING-AVATAR / creator lip-sync clip from a portrait image + a script. Blocks until done (1–3 min). Requires the avatar capability (canAvatar in hermoso_capabilities). Spends credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
imageYeslocal path or URL of the presenter portrait
voiceNovoice name (Rachel/Sarah/George/Adam)
scriptYesthe words the avatar speaks
resolutionNo'720p' (default) or '480p' draft

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior4/5

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

Despite no helpful annotations (all false), the description discloses crucial behavior: it blocks for 1–3 minutes, spends credits, and requires a capability check. This provides significant operational context beyond what annotations offer, though it does not detail failure modes or return specifics.

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 compact sentences: the first defines the core action and inputs, the second covers blocking behavior, capability requirement, and cost. No filler; every phrase adds useful 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?

Given the tool has an output schema and four parameters, the description adequately covers purpose, duration, cost, and a prerequisite. It does not explain return values, but the output schema likely handles that. The main omission is any mention of what the output asset is (e.g., file type), but this is not critical given the 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 description coverage is 100%, so the baseline is 3. The description's reference to 'portrait image + script' mirrors the schema descriptions without adding new semantics. It does not elaborate on voice or resolution defaults beyond what the schema already 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 verb ('Render') and resource ('a TALKING-AVATAR / creator lip-sync clip') with clear inputs ('portrait image + script'). It distinguishes itself from sibling generation tools by focusing solely on talking avatars, not generic video or voice.

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 provides clear context: it is for generating a lip-sync avatar clip from an image and script. It also states a prerequisite ('Requires the avatar capability') and a cost (spends credits), which guides when to invoke. It does not explicitly name alternative tools, but the niche is well-defined.

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

generate_imageGenerate ad imageAInspect

Render a finished ad IMAGE and return its served URL. refImages (local paths or URLs) force product-accurate compositing (drops a real product into the scene). MULTI-BRAND CAUTION: useBrand hydration pulls the SAVED workspace brand — when working a brand that is NOT the saved one (a fresh draft_brand), pass that brand's own productImages/logo as refImages (and useBrand:false) or the output composites the WRONG brand's product. model = a catalog id from hermoso_capabilities (omit for the default). Fast (seconds). Spends credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoimage model id from hermoso_capabilities
promptYesthe full image prompt — subject, composition, lighting, and any on-image ad text
useBrandNodefault true: with no refImages, the server hydrates the SAVED brand’s product/logo references so the output lands on-brand; pass false for a pure prompt-only render
imageSizeNopixel-size preset for models that support it (e.g. 1K/2K) — omit for the default
refImagesNolocal file paths or URLs of product/logo references to composite in
aspectRatioNoe.g. '1:1', '9:16', '16:9'

Output Schema

ParametersJSON Schema
NameRequiredDescription
imageNothe served absolute URL of the finished image
modelNothe product-facing label of the model that rendered it
Behavior5/5

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

With no useful annotations (all false), the description carries the full burden. It discloses that the tool spends credits, is fast, returns a URL, and inherits the saved brand unless useBrand:false is set, including the risk of wrong-brand compositing.

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 concise sentences front-load the primary purpose first, then pack critical usage caveats. 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?

With an output schema present and all parameters documented, the description effectively addresses the tool's complexity around multi-brand handling, cost, and speed. It is complete enough for an agent to select and invoke correctly.

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

Parameters5/5

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

Schema covers 100% of parameters, but the description adds essential semantics: refImages enable product-accurate compositing, useBrand hydration pulls the saved brand, and model comes from hermoso_capabilities. This goes well beyond the parameter descriptions.

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 'Render a finished ad IMAGE and return its served URL', naming the exact verb, resource, and output. This clearly identifies it as image generation, distinguishing it from sibling tools like generate_video or render_ad.

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 provides clear context for when to use refImages and useBrand, including a multi-brand warning about composite wrong product. It does not explicitly reference alternative tools, so it lacks explicit when-not guidance.

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

generate_textGenerate textAInspect

RAW text generation against the writing-model catalog (Claude, Gemini, GPT, Llama, DeepSeek…) — ad copy, hooks, scripts, rewrites, brainstorms. Prompt-only, no ad assembly (for a finished on-brand creative use plan_ad → render_ad). model = a writing-model id from hermoso_capabilities (omit for the default Claude orchestrator). Paid (a credit or two by length).

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoa writing-model id from hermoso_capabilities (a Claude / Gemini / GPT / Llama / DeepSeek id) — omit for the default
promptYesthe writing task / question

Output Schema

ParametersJSON Schema
NameRequiredDescription
textNothe generated text
modelNothe writing model label
creditsUsedNocredits billed for this generation
Behavior4/5

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

The description discloses that the operation is paid ('a credit or two by length'), which annotations do not cover. It also states the default model behavior and that it is prompt-only. While annotations already indicate non-readonly, the cost disclosure adds valuable operational context beyond the structured metadata.

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 tight sentences pack purpose, alternatives, parameter guidance, and cost into minimal space. Every clause earns its place with no filler or repetition.

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 two-parameter generation tool with an output schema, the description covers purpose, usage context, alternatives, model selection, and cost. It is sufficiently complete for an agent to invoke correctly without needing additional details.

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 description mostly restates the model parameter's source (hermoso_capabilities) and default behavior, which the schema already describes. It adds a bit of flavor with example prompt types, but does not substantially enrich the parameter meaning 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?

The description explicitly states 'RAW text generation against the writing-model catalog' with concrete use cases (ad copy, hooks, scripts, rewrites, brainstorms). It distinguishes from sibling tools by noting 'Prompt-only, no ad assembly' and pointing to plan_ad → render_ad for finished creatives, making its 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?

It provides explicit guidance on when to use this tool (for raw text generation tasks) and when not to ('for a finished on-brand creative use plan_ad → render_ad'). It also clarifies how to select a model via hermoso_capabilities, giving the agent clear decision criteria.

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

generate_videoGenerate videoAInspect

Render a RAW video clip from your own prompt and return its served mp4 URL. For finished brand ADS prefer render_ad (it runs the Studio quality pipeline — composited text, clean speech, end card, music); use this for raw/experimental clips or precise manual control. ONE generation = one continuous clip up to the model’s longest listed duration (seedance-2 goes to 15s single-pass with a full multi-beat arc — never assume a generic 8–10s cap); durationSeconds must be one of the model’s durations from hermoso_capabilities. Renders take 1–3 min. refImage anchors the opening frame; ttsScript adds a voiceover. AUDIO IS NOT FREE AND NOT OPTIONAL BY DEFAULT: a clip delivered with no audio of its own gets a music bed composed and CHARGED on top of the render (see musicMood and audio) — on a cheap short draft the bed can cost as much as the clip. Pass refVideo (a clip URL) to EDIT an existing video instead of generating from scratch — the omni engine transforms that clip per your prompt, inheriting the source clip’s canvas + length (aspectRatio/durationSeconds are ignored for an edit). Spends credits (Starter plan is video-blocked server-side).

ParametersJSON Schema
NameRequiredDescriptionDefault
audioNodefault true. false = render SILENT: no native model audio, no music bed, and no bed charge held or billed. This is the ONLY way to decline the automatic bed (see musicMood) — leave it alone for anything that should have sound, and do not combine it with ttsScript.
modelNovideo model id from hermoso_capabilities. Naming one is a DELIBERATE pick — the server asks before ever swapping it (no silent fallback); omit it to let the router pick
promptYesthe video prompt / shot description (for a refVideo edit, this is the transformation instruction)
refImageNolocal path or URL to anchor the first frame
refVideoNoURL of an existing video to EDIT rather than generate from scratch — the omni engine accepts a raw clip and transforms it per your prompt, inheriting the SOURCE clip’s canvas (aspect ratio) and length (aspectRatio/durationSeconds are ignored for an edit). Omit to generate a fresh clip.
ttsVoiceNovoice name, e.g. Rachel / George
musicMoodNoWHICH mood the music bed is composed in (upbeat / calm / warm / epic / tense / playful / elegant / hype / chill / dramatic). It does NOT decide WHETHER there is one: a clip that comes back with no audio track — every model hermoso_capabilities lists as "silent", plus any audio model that returned mute — gets a bed composed and CHARGED automatically, at the flat per-track fee hermoso_capabilities reports as explainerMusicCredits, and omitting this field only means the mood defaults to "warm". Pass audio:false for a genuinely silent clip with no bed and no bed charge.
ttsScriptNovoiceover script to speak
resolutionNo'720p' default; '480p' = cheap fast draft pass, '1080p'/'4k' = premium final delivery (more credits)
aspectRatioNodefault '9:16'
durationSecondsNolength of THIS ONE clip in seconds — pick one of the chosen model’s listed durations from hermoso_capabilities (seedance-2/kling-3: 5/10/15). This is a single continuous generation, so it CANNOT exceed the model’s longest clip: a longer ask is REFUSED with nothing rendered and nothing charged (it is never quietly truncated). For a spot longer than one clip, use plan_ad with durationSeconds then render_ad, which stitches ≤15s acts (40s = 15+15+10).

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
refusedNoset when NOTHING was rendered and nothing charged — currently 'duration_exceeds_single_clip'
askedSecondsNothe durationSeconds that was asked for and could not be honored
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
maxSingleClipSecondsNothe longest single clip any connected video model can render (the ceiling a refusal was measured against)
Behavior5/5

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

The description goes far beyond the sparse annotations, disclosing that the tool spends credits, renders take 1–3 minutes, longer durations are refused not truncated, and a music bed is automatically composed and charged unless audio:false is passed. These are high-stakes behavioral details that an agent must know before calling the tool.

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 earns its place, packing in cost warnings, duration policies, edit-mode behavior, and alternatives without filler. It is front-loaded with the core purpose and immediately branches into decision-relevant constraints, making the length justified.

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 — 11 parameters, output schema, no meaningful annotations — the description covers all high-risk operational facets: cost, latency, duration limits, audio defaults, edit mode, and the distinction from render_ad. The output schema exists, so lack of return-value details is not a gap.

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

Parameters5/5

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

Although the schema has 100% description coverage, the tool description adds crucial semantics: durationSeconds must be one of the model's exact durations, refVideo causes aspectRatio/durationSeconds to be ignored, audio:false is the only way to avoid the music bed charge, and resolution tiers map to draft vs. premium delivery. This materially improves parameter understanding 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?

The description opens with 'Render a RAW video clip from your own prompt and return its served mp4 URL', which clearly states the verb, resource, and output. It further distinguishes itself from render_ad by specifying when to use each, making the purpose unambiguous.

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

Usage Guidelines5/5

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

It explicitly says 'For finished brand ADS prefer render_ad' and 'use this for raw/experimental clips or precise manual control', giving direct when-to-use guidance. It also provides critical conditions around refVideo for editing, duration limits, and audio charging behavior, so the agent knows exactly when and how to invoke this tool.

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

generate_voiceGenerate voiceoverAInspect

RAW text-to-speech from the voice-model catalog: speak a script in a chosen voice and return the served MP3 URL. For a standalone voiceover / narration clip — NOT for adding audio to a video (render_ad and generate_video voice their own spots; change_voice re-voices a finished clip). engine picks the voice model (default 'seed-audio'; also 'eleven-v3', 'minimax-speech', 'kokoro'); voice is a preset name from that engine (see hermoso_capabilities → voice engines). Paid (a couple of credits by length; ≤900 characters).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesthe script to speak (≤900 characters)
voiceNoa voice preset from the chosen engine (e.g. 'Aria'/'George' on eleven-v3, 'stokie_en' on seed-audio) — omit for the engine default
engineNovoice-engine id: 'seed-audio' (default), 'eleven-v3', 'minimax-speech', or 'kokoro' — listed in hermoso_capabilities

Output Schema

ParametersJSON Schema
NameRequiredDescription
audioNothe served absolute URL of the MP3 voice clip
modelNothe voice engine label
voiceNothe voice preset used
creditsUsedNocredits billed for this clip
Behavior4/5

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

Annotations are all false, so they don't disclose behavioral traits. The description adds cost information ('Paid (a couple of credits by length)'), a character limit (≤900), and the output form ('return the served MP3 URL'), giving the agent operational expectations beyond the schema.

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

Conciseness5/5

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

Three sentences, front-loaded with the primary function, followed by exclusions, parameters, and cost/limits. No redundant words; every sentence adds 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 output schema exists, the description needn't detail returns. It covers purpose, alternatives, parameters, cost, and constraints, and references the capabilities tool for voice preset discovery. This is sufficient for correct invocation.

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 adds value by listing engine choices with defaults and pointing to hermoso_capabilities for voice presets, plus providing concrete examples (e.g., 'Aria'/'George' on eleven-v3), which helps the agent select valid values.

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 'RAW text-to-speech from the voice-model catalog: speak a script in a chosen voice and return the served MP3 URL,' stating a clear verb (speak/generate) and resource (voiceover). It also explicitly contrasts with sibling tools (render_ad, generate_video, change_voice), making the tool's niche unambiguous.

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: 'For a standalone voiceover / narration clip — NOT for adding audio to a video' and names the alternatives that should be used instead. It also explains when to use different engines and voice presets.

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

get_brandGet saved brandA
Read-only
Inspect

What Hermoso ALREADY KNOWS for this account/workspace — the same saved brand profile (products, logos, palette, positioning) + learned memory the web Studio uses. Call this FIRST: if hasBrand is true you can omit brand everywhere; if false, onboard with draft_brand. 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
brandNothe saved brand profile (name, domain, category, products, palette, …) or null
hasBrandNowhether a brand is saved for this workspace
memoryCountNohow many learned memory notes the workspace holds
Behavior4/5

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

Annotations already mark readOnlyHint=true and destructiveHint=false; description adds that the call is zero-credit and returns the same profile plus learned memory used by the web Studio. No contradiction, and it adds useful context about cost and scope beyond the schema.

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

Conciseness5/5

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

Two compact, information-dense sentences plus a cost tag. The crucial 'Call this FIRST' guidance is front-loaded, and no filler is present.

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 zero-parameter read tool with an output schema and safety annotations, the description covers purpose, usage branching, scope, and credits. There is no missing contextual gap affecting invocation.

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?

Tool has zero parameters and 100% schema coverage, so the empty input schema is fully described. Description adds no parameter syntax but doesn't need to; baseline 4 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?

Description identifies get_brand as retrieving Hermoso's existing saved brand profile and learned memory for the account/workspace, with explicit call-first guidance. This clearly distinguishes it from brand-creation/update/onboarding siblings like create_brand, draft_brand, use_brand.

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 'Call this FIRST' and provides conditional branching: if hasBrand is true omit brand everywhere; else onboard with draft_brand. Names draft_brand as the alternative, so usage vs alternatives is unambiguous.

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

get_business_locationRead a Google Business Profile listingA
Read-only
Inspect

Read everything Google holds on one of the brand’s Google Business Profile listings — business name, address, phone numbers, website, categories, description, regular and special hours, service area, labels, store code, open state, and whether the listing can carry a Post at all. This is the listing AS THE MERCHANT LAST SET IT, which is exactly what update_business_location edits; it can differ from what Google Maps shows today, because Google and the public can suggest changes on top. Call it before offering to change anything, and to answer “what does our Google listing actually say?”. Read-only, 0 credits. Needs Google Business Profile connected (Settings ▸ Connectors ▸ Google Business Profile).

ParametersJSON Schema
NameRequiredDescriptionDefault
locationIdNowhich listing, e.g. 'locations/123' from list_business_locations — only needed when more than one is shared with this brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleNo
accountNo
locationNo
readMaskNo
locationIdNo
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces these: 'Read-only, 0 credits' and explains the open-world aspect (Google and public can suggest changes). It adds critical context beyond annotations: the listing is 'AS THE MERCHANT LAST SET IT', the prerequisite (Google Business Profile connected), and the exact credential path (Settings ▸ Connectors ▸ Google Business Profile).

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 front-loaded with the core purpose, then provides a structured breakdown: content enumerated, data freshness nuance, usage guidance, cost and read-only status, and prerequisite. Every sentence earns its place, and the length is justified by the tool's complexity and the need to distinguish from public Maps data.

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 has only one optional parameter, an output schema (which covers return structure), and annotations for read-only/open-world, the description fills all remaining gaps: what data is returned, the merchant-set vs. public discrepancy, a concrete use case, cost (0 credits), and the connector prerequisite. No essential context 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% — the sole parameter locationId is already fully described ('which listing, e.g. 'locations/123' from list_business_locations — only needed when more than one is shared with this brand'). The tool description does not add meaning beyond the schema; it only reinforces the concept of 'one of the brand’s listings'. Baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with 'Read everything Google holds on one of the brand’s Google Business Profile listings' — a specific verb ('read') and resource ('Google Business Profile listing') with a detailed enumeration of content. It clearly distinguishes from siblings like list_business_locations (which lists locations) and update_business_location (which edits) by emphasizing it reads the merchant-set state, not the public Maps view.

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 states when to invoke: 'Call it before offering to change anything, and to answer “what does our Google listing actually say?”'. It also defines the data source relationship with update_business_location and warns that the data can differ from Google Maps due to external suggestions, giving the agent a clear decision context versus alternatives.

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

get_drive_fileGet a Drive file’s detailsA
Read-only
Inspect

Fetch one Drive file’s metadata — name, type, size, modified time, a webViewLink to open it and a webContentLink to download it. Pass fileId (from list_drive_files). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileIdYesthe Drive file id (from list_drive_files)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
webViewLinkNo
webContentLinkNo
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, and the description adds that it is read-only, reinforcing safety. It also discloses the exact metadata fields returned (name, type, size, modified time, links), which goes beyond the annotations. No side effects or detailed error behavior are mentioned, but for a simple read operation with safe annotations, this is sufficient.

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 sentences, front-loaded with the action and key details. The first sentence explains the verb and the resource, the second provides the required parameter source. Every sentence earns its place with no fluff.

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?

The tool has one parameter, an output schema, and annotations. The description fully explains the purpose and the fields returned, and states the required input source. It does not need to explain return values because the output schema exists. The simplicity of the tool means this description is 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?

The schema already documents the sole parameter fileId with a description that matches the tool description ('from list_drive_files'), giving 100% schema coverage. The description repeats this dependency but does not add new meaning beyond the schema, so the baseline score of 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 clearly states that the tool fetches one Drive file's metadata and enumerates the specific fields (name, type, size, modified time, webViewLink, webContentLink). It distinguishes itself from list_drive_files by focusing on a single file and from get_onedrive_file by specifying 'Drive' (Google Drive).

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 provides clear usage context by instructing to pass fileId from list_drive_files, which tells the agent where to obtain the required identifier. It implies the tool is for retrieving a single file's details after listing files, but it does not explicitly mention alternatives or when not to use it. Still, the guidance is clear enough for selection.

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

get_jobGet render jobA
Read-only
Inspect

Poll a render job by id. Returns status (queued|running|done|error), progress, and on done the served media URL. Renders take 1–3 minutes: keep calling this until done/error without asking the user — several calls is normal, not a stall.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe job id, e.g. job_xxx

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNothe job id
urlNothe served media URL once done
typeNothe job type (video / stitch / avatar / …)
errorNothe failure message when status is error
resultNothe raw job result payload
statusNoqueued | running | done | error
progressNo0–1 progress when reported
Behavior5/5

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

Beyond the readOnlyHint annotation (which marks it safe), the description discloses the return fields (status, progress, media URL), the expected latency (1–3 minutes), and the behavior of returning on done/error states. It fully explains what the agent will observe and how to interpret 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?

Two sentences, no fluff. First sentence states purpose and return, second sentence explains timing and polling behavior. Every phrase adds value for the agent.

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 simple 1-parameter polling tool with both output schema and annotations, the description covers all essentials: what to call, what to expect, and how to handle repeated calls. Nothing critical 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% for the single 'id' parameter. The description only reiterates 'by id' and adds no new semantic details about the parameter beyond the schema description. Baseline 3 applies as the schema carries the meaning.

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?

Description starts with 'Poll a render job by id' – specific verb (poll) and resource (render job by id). This clearly distinguishes it from siblings like render_ad (create job) and list_jobs (list all jobs). No ambiguity.

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 instructs 'keep calling this until done/error without asking the user – several calls is normal, not a stall'. This is direct when-to-use guidance and sets the expectation for repeated polling, which is exactly the agent's use case.

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

get_onedrive_fileGet a OneDrive file’s detailsA
Read-only
Inspect

Fetch one OneDrive item’s metadata — name, type, size, modified time, a webViewLink to open it and a webContentLink to download it. Pass fileId (from list_onedrive_files). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileIdYesthe OneDrive item id (from list_onedrive_files)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
webViewLinkNo
webContentLinkNo
Behavior4/5

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

The description discloses that the operation is read-only and lists the returned metadata fields, adding context beyond the readOnlyHint annotation. It does not mention error handling or pagination, but for a single-item get with an output schema, this is sufficient.

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 verb 'Fetch', and every clause adds information: the item type, the returned fields, and the required argument source. No filler or redundancy.

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 single-parameter read-only tool with an output schema and readOnlyHint annotation, the description covers the purpose, the prerequisite (fileId from list_onedrive_files), and the expected return fields. It is complete enough for an agent to select and 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?

The schema already fully describes the only parameter (fileId) as 'the OneDrive item id (from list_onedrive_files)'. The description repeats this same guidance without adding extra semantic details, so it adds no value 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?

The description clearly states that the tool fetches one OneDrive item's metadata and lists specific fields (name, type, size, modified time, webViewLink, webContentLink). It distinguishes itself from siblings like list_onedrive_files (single vs. list) and get_drive_file (OneDrive-specific).

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 tells the agent to pass fileId obtained from list_onedrive_files, providing a clear prerequisite for use. It does not explicitly name alternatives or exclusions, but the read-only annotation and single-item scope imply when it should be used.

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

get_post_refillPosting refill statusA
Read-only
Inspect

Show the automatic posting refill for this brand: whether it is on, whether it is in dry-run (preview) mode, how many days ahead it fills, its render budget, when it next runs, and how many posts are queued right now. It also names the channels that CANNOT be posted to and why. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dryRunNo
enabledNo
runningNo
excludedNo
daysAheadNo
nextRunAtNo
postsPerDayNo
queuedPostsNo
postingScheduleNo
Behavior5/5

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

The description fully aligns with the annotations (readOnlyHint, openWorldHint) and adds valuable behavioral context beyond them: it specifies what information is returned, including dry-run mode, render budget, next run time, queued posts, and blocked channels with reasons. It also notes 'free', which is not in the annotations, and confirms no side effects.

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 with no fluff. The first sentence immediately leads with 'Show' and enumerates the specific data points. The second adds the unique blocked-channel disclosure. All information is relevant and well-ordered; nothing is wasted.

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 read-only status tool with zero parameters and an output schema present, the description comprehensively lists all the information the tool provides. It covers configuration state, schedule, queue depth, and important limitations (blocked channels). Nothing else is needed for an agent to decide when and how to invoke it.

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 input schema has zero parameters, so parameter description is not needed. The description gives context that the tool operates on 'this brand', implying brand is resolved from context. This meets the baseline for 0-param tools.

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 uses the specific verb 'Show' and clearly identifies the resource: 'the automatic posting refill for this brand'. It enumerates all the key attributes returned (on/off, dry-run mode, days ahead, render budget, next run, queued posts, blocked channels), making its purpose unmistakable and distinguishing it from sibling tools like set_post_refill or run_post_refill.

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 clearly implies a read-only status-check use case with 'Show' and explicitly notes 'Read-only, free'. It does not name alternatives or state when not to use it, but the context is clear: this is for inspecting the current configuration, not modifying it. This aligns with the 'clear context, no exclusions' level.

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

get_settingsRead app settingsA
Read-only
Inspect

Read this account's app settings — the LANGUAGE Hermoso writes ads, copy and answers in, the app appearance (theme), and whether the weekly competitor-watch email is on. Same settings as the web app's Settings pane. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
themeNo
privacyNo
languageNo
notificationsNo
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description's 'Read-only' is redundant but reinforces safety. It adds 'free' (no cost) and states the settings mirror the web app's Settings pane, providing useful behavioral context beyond the annotations.

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

Conciseness5/5

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

The description is compact: one descriptive sentence with an em-dash list and a second sentence covering scope and cost. No redundant 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 parameterless read-only tool with an output schema and annotations, the description covers the essentials: what settings are included, that it's read-only, free, and consistent with the web UI. No significant gaps.

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?

With zero parameters and full schema coverage, the description need not explain parameter semantics. It clearly scopes the tool to reading rather than updating settings.

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 'Read this account's app settings' — a specific verb and resource. It enumerates the included settings (language, theme, weekly email) and points to the web app's Settings pane, clearly distinguishing from sibling 'update_settings' which modifies these settings.

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 provides clear context about what is read and notes it is read-only, but it does not explicitly name when to use this over 'update_settings' or any exclusions. The 'Read-only' qualifier implies it is for inspection only, but lacks an explicit alternative.

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

get_skillGet skillA
Read-only
Inspect

Load a bundled skill’s full SKILL.md workflow instructions by name (from list_skills). Follow the loaded instructions to run that workflow with the other tools. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesbundle name from list_skills, e.g. hermoso-generate

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNothe loaded skill bundle name
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces read-only status while adding the extra detail that the operation is 'free'. It also discloses that the tool returns full SKILL.md workflow instructions, which is useful behavioral context beyond the annotations.

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

Conciseness5/5

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

The description is two short sentences. The first is front-loaded with the core action and object, and the second provides a clear directive. No filler or irrelevant detail.

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 a single parameter, full schema coverage, an output schema, and annotations, the description covers all essential usage aspects: what it loads, where the name comes from, how to use the result, and that it is read-only and free. No significant gaps remain.

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 'name' already includes a description with an example ('bundle name from list_skills, e.g. hermoso-generate'). The tool description merely repeats the list_skills origin, adding no new semantic 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?

The description states a specific verb ('Load') and resource ('bundled skill's full SKILL.md workflow instructions') and names the source ('from list_skills'). This clearly distinguishes get_skill from sibling tools like list_skills, save_skill, and delete_skill.

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 explicitly says to list skills first ('from list_skills') and instructs the agent to 'Follow the loaded instructions to run that workflow with the other tools.' It does not name exclusions or alternative tools, but the usage context is clear and actionable.

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

google_business_accountGoogle Business Profile account for a listingA
Read-only
Inspect

Read the Google Business Profile ACCOUNT that owns one of the brand’s listings — the account name, its type (a personal Google account, a location group, a user group or an organization), the connected user’s role on it (primary owner / owner / manager / site manager), the account’s verification state and the permission level. Use it to answer “can we actually edit this listing?” and “whose account is it on?” before offering an edit that Google would refuse anyway. It reads exactly ONE account — the parent of a listing already shared with this brand — and never lists the other accounts the connected Google login can reach; that roster belongs to the account picker (list_connector_accounts). Read-only, 0 credits. Needs Google Business Profile connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationIdNowhich listing, from list_business_locations — only needed when more than one is shared with this brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
roleNo
typeNo
locationNo
locationIdNo
accountNameNo
vettedStateNo
accountNumberNo
permissionLevelNo
organizationNameNo
verificationStateNo
Behavior5/5

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

Annotations already indicate read-only, but the description adds substantial behavioral context: it reads exactly one account, never lists other accounts, requires Google Business Profile connection, and costs 0 credits. This goes well beyond what annotations provide and there is no contradiction.

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

Conciseness4/5

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

The description is a dense paragraph but each sentence earns its place: it opens with the core action, lists output, gives use cases, clarifies scope, names an alternative, and includes meta info. It is slightly long but well-organized and front-loaded with the most important 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?

The description fully covers purpose, output fields, limitations, alternatives, prerequisites, and cost. With an output schema present, return details are already structured. Given the tool's complexity, this is complete and leaves no critical gaps for an agent selecting or invoking it.

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 schema covers 100% of parameters and includes a descriptive comment for locationId. The description also reinforces the parameter's purpose by stating the listing is 'already shared with this brand.' While the schema carries the load, the description adds contextual meaning about when the parameter is needed.

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?

Clearly states it reads the Google Business Profile account that owns a listing, specifies the returned fields (account name, type, role, verification, permission), and distinguishes itself from sibling list_connector_accounts. The verb 'read' plus resource 'account' makes the action unambiguous.

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 explains when to use it: to answer 'can we actually edit this listing?' and 'whose account is it on?' before attempting edits. It also names the alternative for listing all accounts (list_connector_accounts), providing clear when-to-use and when-not-to-use guidance.

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

google_business_insightsGoogle Business Profile performanceA
Read-only
Inspect

How the brand’s Google Business Profile listing actually performed — impressions on Google Search and Maps (desktop and mobile), calls, website clicks, direction requests, messages and bookings — over the last N days. For a local business this is the real-world demand signal, and it is the number an ad campaign should be judged against. NOTE: Google discontinued PER-POST insights in February 2023 and published no replacement, so these are listing-level figures and per-post performance genuinely does not exist in any API — do not promise it. Read-only, 0 credits. Needs Google Business Profile connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNohow many days back, default 30
metricsNooptional subset of Google’s daily metrics (BUSINESS_IMPRESSIONS_DESKTOP_MAPS, BUSINESS_IMPRESSIONS_DESKTOP_SEARCH, BUSINESS_IMPRESSIONS_MOBILE_MAPS, BUSINESS_IMPRESSIONS_MOBILE_SEARCH, BUSINESS_CONVERSATIONS, BUSINESS_DIRECTION_REQUESTS, CALL_CLICKS, WEBSITE_CLICKS, BUSINESS_BOOKINGS, BUSINESS_FOOD_ORDERS, BUSINESS_FOOD_MENU_CLICKS). Omit for all of them. An unknown name is refused rather than quietly dropped, so a total is never reported under a metric you did not get.
locationIdNowhich listing, from list_business_locations

Output Schema

ParametersJSON Schema
NameRequiredDescription
toNo
daysNo
fromNo
noteNo
callsNo
totalsNo
bookingsNo
locationNo
locationIdNo
impressionsNo
conversationsNo
websiteClicksNo
directionRequestsNo
Behavior4/5

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

Beyond the annotations (readOnlyHint=true), the description adds valuable behavioral context: it costs 0 credits, requires a connected Google Business Profile, and notes that per-post performance data genuinely does not exist in any API. It also clarifies that unknown metric names are refused rather than silently dropped (though this is also in the schema).

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

Conciseness5/5

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

The description is three sentences, each earning its place: the first states exactly what the tool reports, the second frames its strategic importance, and the third delivers a critical, non-obvious limitation. It is front-loaded with the core purpose and contains 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 rich input schema, existing output schema, and clear annotations, the description covers the essential extra context: prerequisites (connected profile, 0 credits), the listing-level scope, and the discontinued per-post insights. Nothing critical is left unaddressed for an agent to invoke 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?

The input schema already provides 100% coverage with descriptions for all three parameters, including the full enumerated list of metrics and the behavior of unknown names. The description's mention of metrics and 'last N days' adds no new semantic information beyond what the schema already conveys.

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

Purpose5/5

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

The description clearly identifies the tool as reporting Google Business Profile listing performance metrics (impressions, calls, clicks, direction requests, messages, bookings) over a specified period. It distinguishes itself from sibling analytics tools by framing it as the 'real-world demand signal' for local business and explicitly separating listing-level from per-post insights.

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 provides strong context for when to use this tool: for evaluating local business demand and as the benchmark for ad campaign performance. It also clearly states a when-not-to-use: per-post insights no longer exist and should not be promised. It does not explicitly name alternative tools, but the positioning is unambiguous enough.

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

hermoso_capabilitiesHermoso capabilitiesA
Read-only
Inspect

Probe what this Hermoso account can do RIGHT NOW: available image/video model ids + their exact credit costs, aspect ratios, video durations, the recipe ids, and the canEdit/canAvatar/canPublish flags. Call this FIRST so you generate with valid model ids and known costs. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
imageNothe default image provider label, or null when image generation is unavailable
videoNothe default video provider label, or null when video generation is unavailable
canEditNowhether image editing is enabled on this account
optionsNothe live model catalog — image/video/voice/llm model lists with per-model credit costs
recipesNothe creative recipe catalog (id + label per recipe)
canAvatarNowhether talking-avatar generation is enabled
canPublishNowhether ad publishing is enabled
editCreditsNocredit cost of one image edit (null when image editing is not configured)
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description adds 'Read-only, free' and specifies exactly what data is returned, supporting the non-destructive nature and adding cost context. It does not contradict annotations and provides useful behavioral context beyond the empty schema.

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 compact sentences, front-loaded with the primary purpose, followed by the output enumeration and usage directive. Every sentence adds value: what it does, what it contains, when to call it, and its safety profile. No redundancy.

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 simple probe nature, the description fully covers what the tool returns and why to use it. An output schema exists, so detailed return structure isn't required here. The description also places the tool in the broader workflow ('Call this FIRST'), making it contextually complete.

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 has 0 parameters, so the baseline is 4. The description adds meaning by listing the output fields (model IDs, costs, aspect ratios, flags), which is effectively what an agent needs to know. No parameter explanation is needed.

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 uses a specific verb ('Probe') and resource ('what this Hermoso account can do RIGHT NOW'), then enumerates the exact output contents (model IDs, credit costs, aspect ratios, durations, recipe IDs, flags). This clearly distinguishes it from sibling tools like generate_video or hermoso_credits.

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 explicitly instructs 'Call this FIRST so you generate with valid model ids and known costs.' This gives a clear when-to-use directive and rationale. It does not explicitly mention when not to use it or alternatives, but the context strongly implies it should precede generation tools.

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

hermoso_creditsCredit balanceA
Read-only
Inspect

Return the account credit balance, credits used this session, and recent priced calls. Check before kicking off paid generation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
balanceNoraw vendor meter balance (operator/local-dev surface)
recentCallsNorecent priced calls with their credit deltas
sessionUsedNocredits used this session
sessionStartNovendor balance at session start (operator surface)
accountBalanceNothe account’s Hermoso credit balance (authoritative when authed)
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds value by specifying the exact data returned (balance, session usage, recent calls) and the recommended pre-flight check behavior. No contradictions with annotations.

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

Conciseness5/5

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

The description is two short sentences, front-loaded with the action and outcome. The second sentence adds a clear usage directive without redundancy. No filler or unnecessary details.

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 return structure is already documented. The description covers what data is returned and when to use the tool, which is sufficient for a simple read-only tool with no parameters and clear annotations.

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 has zero parameters, so schema coverage is trivially 100%. Per the baseline for 0 params, a 4 is appropriate. The description does not need to explain parameters because none exist.

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

Purpose5/5

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

The description clearly states the tool returns account credit balance, session credits used, and recent priced calls. This specific verb+resource combination distinguishes it from siblings like buy_credits and billing_status by enumerating exact data returned.

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 provides a clear usage trigger: 'Check before kicking off paid generation.' This is an explicit when-to-use instruction, but it doesn't mention alternatives or when-not-to-use. Given the large sibling list, naming an alternative (e.g., buy_credits) would strengthen it.

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

hide_thread_replyHide or unhide a Threads replyA
Idempotent
Inspect

Hide a reply on the brand’s Threads post (or unhide it with hide:false) — for spam and abuse moderation.

ParametersJSON Schema
NameRequiredDescriptionDefault
hideNofalse to UNHIDE (default true)
replyIdYesreply id from list_threads_replies

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
hiddenNo
Behavior3/5

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

Annotations already declare readOnly=false, idempotent=true, and destructive=false. The description adds the reversible hide/unhide behavior and moderation rationale, but it largely restates the title and schema rather than disclosing new side effects, permissions, or external consequences.

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 a single, front-loaded sentence with a clear main action and a parenthetical for the alternate behavior. Every word contributes value; there is no filler or redundancy.

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 two-parameter toggle with an output schema and strong annotations, the description fully covers the action, scope, toggling behavior, and purpose. No return value explanation is needed since an output schema exists.

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 have descriptive entries: 'hide' is documented as 'false to UNHIDE (default true)' and 'replyId' is tied to 'list_threads_replies'. The description does not meaningfully enrich the schema semantics beyond repeating 'hide:false'.

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?

Description uses specific verb 'Hide' and resource 'reply on the brand’s Threads post', and clearly explains the unhide behavior with 'hide:false'. It also states the intended use case, 'spam and abuse moderation', which distinguishes it from delete_thread and reply_to_thread.

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 context by stating the tool is 'for spam and abuse moderation'. It does not explicitly name alternatives or exclusions, but this is a specialized toggle with no direct Threads sibling, so the context is sufficient.

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

instagram_insightsInstagram account insights + audience demographicsA
Read-only
Inspect

ACCOUNT-level performance for the brand’s connected Instagram Business account — views, reach, accounts engaged, total interactions, likes, comments, shares, saves, profile link taps, replies, reposts and follows/unfollows — plus the AUDIENCE DEMOGRAPHICS (follower_demographics and engaged_audience_demographics, broken down by age, city, country or gender), which is the read that says WHO the content reached rather than how many. Use meta_post_insights for one post and meta_page_insights for the Facebook Page. THERE IS NO "impressions": Meta deprecated it for every API version on 2025-04-21 and replaced it with "views" — an unknown metric is refused by name rather than quietly dropped. Instagram returns NO demographics for an account under 100 followers (or under 100 engagements in the window), and an absent block means exactly that, never an empty audience. Read-only, 0 credits. Needs Meta connected with an Instagram Business account linked to the Page.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoYYYY-MM-DD window start
untilNoYYYY-MM-DD window end
pageIdNoFacebook Page id the Instagram account is linked to — omit when only one Page is connected
periodNoaggregation for reach, the one time-series metric (default day)
metricsNoaccount metrics (default: views, reach, accounts_engaged, total_interactions, likes, comments, shares, saves, profile_links_taps). Add follower_demographics or engaged_audience_demographics for the audience, which also needs a breakdown.
breakdownNocontact_button_type / follow_type / media_product_type for account metrics; age / city / country / gender for the demographic metrics (exactly one)
timeframeNowindow for the demographic metrics only (default last_30_days)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
metricsNo
profileNo
instagramIdNo
demographicsNo
Behavior5/5

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

Even though annotations already declare readOnlyHint and openWorldHint, the description adds substantial behavioral context: the deprecation of 'impressions' (unknown metrics are refused, not ignored), the condition that accounts under 100 followers/engagements return no demographics, and the note about absent blocks meaning insufficient data. It also confirms read-only behavior and zero credits, reinforcing transparency beyond annotations.

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

Conciseness5/5

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

The description is long but every sentence earns its place. It front-loads the primary purpose and metric list, then gives alternative tool guidance, critical caveats (impressions deprecation, demographics thresholds), and prerequisites. The structure is logical and dense without redundancy, appropriate for a tool with 7 parameters and complex 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 tool's complexity, the description covers all essential dimensions: scope, metrics, demographics, usage alternatives, constraint caveats, authentication prerequisites, and read-only/credit implications. The output schema handles return values, so the description's lack of detail there is not a gap. This is a complete and self-sufficient description.

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 adds extra value by clarifying that 'impressions' is invalid for the metrics parameter and will be rejected by name, which is not in the schema. It also reinforces that demographic metrics require a breakdown, though this is already in the schema. This incremental insight justifies a score above 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?

The description explicitly states it provides ACCOUNT-level performance and audience demographics for the connected Instagram Business account, with a specific list of metrics. It also distinguishes from sibling tools by directing users to meta_post_insights for single posts and meta_page_insights for the Facebook Page, making the tool's purpose and scope crystal clear.

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?

The description gives direct usage guidance: it defines the tool's scope as account-level, explicitly names alternative tools for related but different cases (meta_post_insights, meta_page_insights), and includes prerequisites like needing Meta connected with an Instagram Business account linked to the Page. This clearly indicates when to use this tool versus alternatives.

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

invite_memberInvite a teammateAInspect

Invite someone to this brand workspace by email (role: member = read-only on billing, admin = full). This SENDS a real email invite / share link — an account change. Confirm the exact email + role with the user, then call with confirm:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNodefault member
emailYesthe invitee’s email
confirmNoREQUIRED true — this invites a real person

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
linkNo
invitedNo
Behavior5/5

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

The description explicitly discloses that this sends a real email invite/share link and is an account change, which goes beyond the annotations (readOnlyHint=false, etc.). It also requires confirm:true, highlighting a real-world side effect. 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.

Conciseness5/5

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

Two sentences, front-loaded with the core purpose, and a critical warning. Every word earns its place; no fluff or repetition of schema fields.

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 tool that sends a real-world invite, the description covers the action, role semantics, confirmation requirement, and side effects. An output schema exists, so return value explanation is unnecessary. The description is fully complete for an agent to invoke correctly.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds substantive meaning: role='member' is read-only on billing, 'admin' is full, and confirm must be true. These details are not in the schema descriptions, significantly enhancing parameter understanding.

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

Purpose5/5

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

The description clearly states the action ('Invite someone to this brand workspace by email') and specifies the resource (workspace). It distinguishes from siblings like remove_member and set_role by focusing on the invite action and explaining the role meanings (member vs admin).

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 provides clear context on when to call the tool (after confirming email and role with the user, with confirm:true). It does not explicitly mention alternatives or when-not-to-use, but the instruction to confirm with the user effectively guides safe usage.

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

linkedin_ads_reportLinkedIn ads performance reportA
Read-only
Inspect

LinkedIn ad performance — impressions, clicks, cost, website conversions, leads and social actions — pivoted by CAMPAIGN (default), CAMPAIGN_GROUP, CREATIVE, ACCOUNT, CONVERSION, PLACEMENT_NAME, IMPRESSION_DEVICE_TYPE, SERVING_LOCATION… or by AUDIENCE DEMOGRAPHICS: MEMBER_COMPANY_SIZE, MEMBER_INDUSTRY, MEMBER_SENIORITY, MEMBER_JOB_TITLE, MEMBER_JOB_FUNCTION, MEMBER_COUNTRY_V2, MEMBER_REGION_V2, MEMBER_COMPANY. The MEMBER_* pivots are what LinkedIn is uniquely good at — job title, seniority and company size are targeting dimensions no other platform reports — and LinkedIn allows exactly ONE pivot per report, so ask for them one at a time and join the answers yourself. An unknown pivot or granularity is refused BY NAME rather than forwarded. On a demographic pivot LinkedIn returns only the top 100 values, DROPS any value under 3 events (so the rows will not sum to the campaign total) and lags 12–24 hours behind the performance numbers — the note says so, every time. Window via since/until (YYYY-MM-DD). ZERO rows genuinely means no delivery in that window; say exactly that and never present zeros as measured performance. A LinkedIn TEST ad account NEVER returns analytics, and the note says so when that is what you are looking at. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
pivotNoCAMPAIGN (default), CAMPAIGN_GROUP, CREATIVE, ACCOUNT, CONVERSION, PLACEMENT_NAME, IMPRESSION_DEVICE_TYPE, SERVING_LOCATION, or one MEMBER_* demographic pivot — an unknown value is refused with the full list
sinceNoYYYY-MM-DD, default 30 days ago
untilNoYYYY-MM-DD
fieldsNometric names — omit for the standard set (LinkedIn returns ONLY impressions and clicks if none are named)
adAccountIdNo
campaignIdsNo
granularityNodefault ALL

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
rowsNo
countNo
adAccountIdNo
Behavior5/5

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

With readOnlyHint and openWorldHint already in annotations, the description adds substantial behavioral context: data lags 12-24 hours for demographic pivots, drops values under 3 events, returns only top 100 values, zero rows mean no delivery, and test accounts produce no analytics. It also discloses that LinkedIn returns only impressions/clicks if no fields are named, which goes well beyond the annotations. No contradictions.

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

Conciseness5/5

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

Although longer than typical descriptions, every sentence delivers critical value—metrics, pivots, behavioral constraints, error handling, and unique caveats. The structure front-loads the core purpose (performance report with pivots) then systematically covers limitations and edge cases. There is no redundancy or fluff; the density is appropriate for the tool's complexity.

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?

The description is nearly exhaustive for a read-only report tool, covering the data returned, pivot behavior, latency, data truncation, zero-row semantics, and test-account limitations. It also addresses error responses (unknown pivot refused by name) and notes the presence of an output schema, so the agent understands what to expect. This is complete given the tool's complexity.

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

Parameters5/5

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

The description adds significant meaning beyond the input schema: clarifying that pivot can be one of a long list including MEMBER_* dimensions, only one pivot per report is allowed, since/until require YYYY-MM-DD format, and if fields are omitted LinkedIn returns only impressions/clicks. It also notes granularity defaults to ALL. This compensates for the 71% schema coverage and enriches understanding of the 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 clearly states the tool reports LinkedIn ad performance across metrics like impressions, clicks, cost, conversions, leads, and social actions, with a clear pivot dimension list. It distinguishes itself from sibling tools like google_ads_report and microsoft_ads_report by highlighting the unique MEMBER_* demographic pivots, which directly address what this tool does that others don't.

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?

The description explicitly tells when to use this tool, particularly for LinkedIn's unique demographic pivots, and instructs to request them one at a time and join answers. It also states an unknown pivot is refused by name rather than forwarded, and notes that test accounts never return analytics. This gives clear usage context and alternatives.

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

linkedin_audience_countHow many LinkedIn members a targeting spec reachesA
Read-only
Inspect

HOW MANY LINKEDIN MEMBERS a targeting spec reaches, before any budget is committed — the cheapest sanity check there is on a B2B audience, and it needs no ad account. Pass locations plus optional include:{titles, industries, seniorities, staffCountRanges, jobFunctions, skills, …}; search_linkedin_ads_targeting resolves any of those names to the URNs LinkedIn demands, free. THE CRITICAL THING TO SAY WHEN REPORTING: a returned total of 0 means the audience is UNDER 300 PEOPLE, not that it is empty — LinkedIn suppresses any count below 300 to protect member privacy, and 300 is also the minimum audience a campaign may run against, so a 0 means this targeting is too narrow to advertise to. The figure is a rounded approximation, so quote it as an estimate and never as a headcount. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeNomore facets ANDed onto locations, e.g. {titles:[…], industries:[…], seniorities:[…], staffCountRanges:[…]}
locationsNogeo URNs or bare geo ids, e.g. ["103644278"] for the United States
targetingCriteriaNoLinkedIn’s raw targeting object — overrides locations/include

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
totalNo
activeNo
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses critical behaviors: counts below 300 are suppressed to 0 for privacy, 300 is the minimum campaign audience, and the figure is a rounded approximation. It also states 'Read-only, 0 credits'. 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?

The description is somewhat lengthy but well-structured: core purpose in caps, then usage pattern, then the critical 0-threshold behavior. Every sentence adds value, and the emphasis on reporting guidance is warranted. No fluff, though slightly dense.

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 and the presence of an output schema, the description is complete. It explains the context (B2B audience sanity check), the input approach, and the critical interpretation of the result (0 = under 300, not empty). It leaves no major gaps for correct invocation and interpretation.

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 already describes all 3 parameters (100% coverage), but the description adds extra semantics: examples of include facets ('titles, industries, seniorities…'), the pattern 'locations plus optional include', and guidance on how search_linkedin_ads_targeting complements the URNs. This exceeds 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?

The description clearly states 'HOW MANY LINKEDIN MEMBERS a targeting spec reaches' – a specific verb and resource, and distinguishes itself from siblings by emphasizing it's a pre-budget sanity check that needs no ad account. It is unambiguous and not a tautology.

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 explicitly says when to use ('before any budget is committed') and why it's preferable ('cheapest sanity check', 'needs no ad account'). It also references the complementary tool 'search_linkedin_ads_targeting' for resolving names to URNs, providing clear context on alternatives.

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

linkedin_bid_pricingLinkedIn suggested bid and budget rangeA
Read-only
Inspect

LinkedIn’s OWN suggested bid and daily-budget range for a specific audience — the suggested bid with a low/mid/high range, the hard bid limits, and the minimum, default and maximum daily budget, all in the ad account’s currency. Use it before proposing a number to a user instead of guessing what LinkedIn costs, and pair it with linkedin_audience_count to answer "can we afford this audience?" in one go. Below LinkedIn’s minimum bid it says delivery "may be poor" for Sponsored Update campaigns and is impossible for every other format. These are ESTIMATES for this audience, not prices, and nothing is committed until a campaign is activated with set_linkedin_ads_status(confirm:true). Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
bidTypeNodefault CPM
includeNo
currencyNo
locationsNo
matchTypeNodefault EXACT
adAccountIdNo
countryCodeNo
dailyBudgetNo
campaignTypeNodefault SPONSORED_UPDATES
objectiveTypeNooptional — LinkedIn prices some objective/optimization combinations and not others
targetingCriteriaNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
bidLimitsNo
adAccountIdNo
suggestedBidNo
dailyBudgetLimitsNo
Behavior5/5

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

Goes beyond the readOnlyHint annotation by adding that results are ESTIMATES, not prices, and that nothing is committed until campaign activation. It also discloses the delivery risk below LinkedIn's minimum bid. The 'Read-only, 0 credits' reinforces the annotation without contradicting 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?

Four sentences, each providing distinct value: output description, usage guidance, delivery caveat, and estimate/commitment disclaimer. No redundancy and the most critical information is front-loaded.

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 description thoroughly covers return values and important caveats, but for a tool with 11 parameters and no required fields, it lacks concrete guidance on how to construct the request for a specific audience. Additional hints about which parameters are essential (e.g., targetingCriteria, campaignType) would improve completeness.

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?

Schema description coverage is only 36% (3 of 11 parameters have descriptions), and the description does not compensate by explaining how to specify the audience or use parameters like targetingCriteria, include, locations, or currency. The phrase 'for a specific audience' is high-level and leaves parameter usage largely ambiguous.

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

Purpose5/5

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

The description clearly identifies the tool as returning LinkedIn's own suggested bid and budget range for a specific audience, including bid limits and daily budget levels. It distinguishes itself from sibling tools like set_linkedin_ads_budget and linkedin_audience_count by focusing on pricing estimates rather than setting or counting.

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 guidance is provided: 'Use it before proposing a number to a user instead of guessing what LinkedIn costs', and it recommends pairing with linkedin_audience_count to answer affordability. It also contrasts with activation via set_linkedin_ads_status, making the when-to-use and alternatives clear.

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

linkedin_page_analyticsOrganic performance of a LinkedIn company PageA
Read-only
Inspect

ORGANIC performance for one of the brand’s LinkedIn COMPANY PAGES: total followers, followers gained (organic vs paid) across the window, Page views (all / unique / desktop / mobile), and the impressions, unique impressions, clicks, likes, comments, shares and engagement rate of the Page’s posts. This is what answers “is our LinkedIn actually working” and “did that post land”. It is NOT linkedin_ads_report — that covers PAID campaigns; LinkedIn excludes sponsored activity from these figures entirely. Pass postUrns (the urn:li:share:… / urn:li:ugcPost:… that post_to_linkedin_page returned) for PER-POST numbers; LinkedIn forbids a date range together with named posts, so that switches to lifetime-per-post. Only Pages the user ticked in Manage accounts are readable — a Page the account merely administers is refused, by design. LinkedIn keeps 12 months, follower figures run about 2 days behind, and it OMITS posts with no recorded activity rather than returning zeros: report an absent post or an unavailable section as MISSING data, never as zero. Read-only, 0 credits. Needs LinkedIn connected with the organization scopes.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoYYYY-MM-DD, default today
postUrnsNourn:li:share:… / urn:li:ugcPost:… — switches to per-post lifetime numbers instead of the Page total
startDateNoYYYY-MM-DD, default 28 days ago (LinkedIn keeps 12 months)
organizationIdNonumeric Page id from list_linkedin_pages — omit only when exactly one Page is shared with this brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
noteNo
postsNo
endDateNo
perPostNo
followersNo
pageViewsNo
startDateNo
noActivityNo
unavailableNo
followerGainsNo
organizationIdNo
organizationNameNo
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint, but the description goes far beyond: it states the tool is read-only and costs 0 credits, requires LinkedIn connected with organization scopes, may refuse Pages not shared, keeps 12 months of data, has a 2-day lag, and omits posts with zero activity rather than returning zeros. This is exceptional transparency.

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 dense but every sentence provides functional or behavioral value. It front-loads the primary purpose and metric list, then efficiently layers caveats and operational notes. No filler or redundancy.

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 tool with nuanced LinkedIn data quirks, the description covers all essential operational context: metric categories, paid-vs-organic exclusion, permission model, data retention, freshness lag, zero-omission behavior, and per-post mode. With an output schema present, the description is fully complete for invoking the tool correctly.

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

Parameters5/5

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

While the schema already describes all parameters (100% coverage), the description adds crucial semantics: postUrns must be urn:li:share:… or urn:li:ugcPost:… and switches to lifetime per-post numbers, and organizationId comes from list_linkedin_pages and can be omitted when only one Page is shared. This meaningfully enriches the raw 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?

The description clearly states the tool provides ORGANIC performance metrics for a LinkedIn company Page, listing specific metrics like followers, Page views, impressions, and engagement. It explicitly distinguishes itself from linkedin_ads_report by noting that tool covers PAID campaigns, making the purpose unambiguous.

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

Usage Guidelines5/5

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

It explicitly names the alternative tool for paid campaigns (linkedin_ads_report) and clarifies that LinkedIn excludes sponsored activity. It also gives concrete use cases ('is our LinkedIn actually working', 'did that post land') and important usage constraints like per-post usage via postUrns and the date-range prohibition.

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-only
Inspect

List every brand on this account (id + name) and which one this connection currently acts on, PLUS any brand another account shared with you (a team workspace). Multi-brand accounts: call this, then use_brand to switch. A SHARED workspace is switched into the SAME way — pass its name or the profile id printed here to use_brand. If a brand looks empty (no connected accounts, no Library) when the app shows it full, you are almost certainly acting on a different workspace: call this first. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
brandsNoevery brand on the account ({id, name, active})
sharedWorkspacesNobrands another account shared with you ({name, ownerAccountId, profileUuid, role})
Behavior5/5

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

Beyond the readOnlyHint annotation, the description adds valuable behavioral context: it lists what data is returned (id, name, current active brand, shared brands), how to use the output with use_brand, and warns about the common pitfall of acting on the wrong workspace. It also adds 'free,' which is not in 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.

Conciseness5/5

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

The description is 4 sentences, each serving a distinct purpose: core function, multi-brand usage, shared workspace handling, and troubleshooting. No filler or redundancy; it is appropriately sized for the complexity of the tool.

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 has no parameters and an output schema exists, the description is complete: it covers the full behavior, return contents, related tools (use_brand), and a practical diagnostic scenario. Nothing important is omitted.

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 input schema has zero parameters, so schema coverage is 100% and there is nothing for the description to add about parameters. The baseline of 4 applies because no parameter descriptions are needed.

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

Purpose5/5

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

The description clearly states 'List every brand on this account (id + name) and which one this connection currently acts on, PLUS any brand another account shared with you.' This is a specific verb (list) + resource (brands) with detailed scope, distinguishing it from sibling list_* tools and get_brand.

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?

The description provides explicit when-to-use guidance: 'Multi-brand accounts: call this, then use_brand to switch.' It also gives a specific troubleshooting scenario: 'If a brand looks empty ... call this first.' This clearly instructs when to use this tool and how to proceed with the output.

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

list_business_locationsList Google business listingsA
Read-only
Inspect

List the Google Business Profile listings SHARED WITH THIS BRAND — id, title, address, website and Maps link. These are the only listings anything here can post to or read: one Google login often manages several businesses (an agency manages its clients’), and the user ticks which of them belong to this brand. Call this before posting whenever more than one is shared and let the USER pick: a Post on the wrong storefront is a public mistake Hermoso will not make for them. If nothing is shared, ask the user to choose — list_connector_accounts("google_business") then set_connector_accounts — and never name or guess a listing. Read-only, 0 credits. Needs Google Business Profile connected (Settings ▸ Connectors ▸ Google Business Profile).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
sharedNo
missingNo
locationsNo
Behavior5/5

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

Annotations already mark readOnlyHint=true and openWorldHint=true; description adds that these are the only listings tools can post to/read, explains multi-business account context, notes read-only and 0 credits, and gives setup path in Settings.

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?

Though several sentences long, every clause adds functional value: scope, fields, usage rule, fallback, safety warning, and prerequisites. Front-loaded with the core action.

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, description covers the operational nuance (user must select if multiple), prerequisite connectivity, cost, and read-only nature—leaving no critical gap for correct invocation.

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?

Tool takes zero parameters (empty schema), so baseline 4; description appropriately says nothing about parameters and focuses on result contents.

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 exactly what it lists (Google Business Profile listings shared with the brand) and the fields returned (id, title, address, website, Maps link). Distinguishes from siblings like get_business_location and list_connector_accounts by emphasizing 'shared with this brand'.

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 instructs to call before posting when more than one listing is shared, and to let the user pick; provides fallback via list_connector_accounts and set_connector_accounts if nothing is shared, and states the prerequisite connection.

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

list_connector_accountsList a connector’s accountsA
Read-only
Inspect

Show every identity a connected account can act as, and which ones this BRAND is currently allowed to use — Facebook Pages + Instagram + Meta ad accounts, Google Ads customers, LinkedIn company Pages (and the personal profile), Pinterest ad accounts, Microsoft Advertising accounts. One person often administers several; only the ticked ones can be posted to or spent from. Call this before set_connector_accounts, and let the USER pick — never guess. Providers: meta, google_ads, linkedin, pinterest, linkedin_ads, reddit_ads, microsoft_ads, google_business. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYeswhich connector’s accounts to list

Output Schema

ParametersJSON Schema
NameRequiredDescription
providerNo
identitiesNo
selectedIdsNo
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only, free'. It adds valuable behavioral context beyond annotations: that one person often administers several accounts and only the ticked ones can be posted to or spent from. This explains the meaning of the output, which is helpful for correct agent decision-making. The description does not contradict 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 longer than the minimum but highly informative. It front-loads the main purpose, then clarifies key behavioral nuance, gives an explicit usage order, names the providers, and states read-only/free. The provider list is somewhat redundant with the schema enum, but it is embedded in meaningful context. Every sentence earns its place, and the structure is logical.

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 tool with one parameter, an output schema, and readOnly annotations, this description is fully adequate. It explains what the tool returns, which accounts are usable, when to call it, which providers are supported, and its safety profile. There are no material gaps that would hinder correct invocation or interpretation.

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% with a single provider enum parameter. The description adds meaning by detailing what each provider includes (e.g., 'Facebook Pages + Instagram + Meta ad accounts, Google Ads customers, LinkedIn company Pages...'), which goes beyond the bare schema description 'which connector’s accounts to list'. This gives the agent a better sense of what to expect for each provider value.

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 starts with a specific verb 'Show every identity a connected account can act as, and which ones this BRAND is currently allowed to use', which clearly states the tool's purpose and scope. It distinguishes itself from siblings like set_connector_accounts (which is the follow-up write operation) and list_meta_pages by covering multiple providers and focusing on account-level permissions rather than individual pages.

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 guidance is provided: 'Call this before set_connector_accounts, and let the USER pick — never guess.' This tells the agent exactly when to use the tool and how to handle the results. It also lists supported providers, removing ambiguity about which connectors are eligible.

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

list_connectorsList connectorsA
Read-only
Inspect

List the third-party accounts connected to this workspace (Meta, Google Ads, Google Drive/Sheets/Docs, YouTube, LinkedIn, OneDrive, Slack, …) — provider, status and the connected account label — PLUS which providers are available to connect. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
providersNo
connectorsNo
Behavior4/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description adds that the operation is 'free' and specifies the output content (provider, status, connected account label). This gives useful behavioral context not present in annotations, without contradicting them.

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

Conciseness5/5

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

The description is concise and front-loaded with the action. It uses a single informative sentence with a parenthetical list of providers and a short second sentence for read-only/free. Every part adds relevant value 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?

For a no-parameter, read-only tool with an output schema, the description fully covers the purpose, scope, and expected return content. It mentions both connected accounts and available providers, making it complete for an agent to understand the tool's functionality.

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 has zero parameters and the input schema is empty, so there is nothing to explain. The baseline of 4 applies; the description does not need to compensate for any schema gaps.

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

Purpose5/5

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

The description clearly states the tool lists third-party accounts connected to the workspace and also which providers are available to connect. It specifies the resource (third-party accounts) and the exact information returned (provider, status, label), distinguishing it from related tools like list_connector_accounts.

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 conveys clear use context: to see connected accounts and available providers. It does not explicitly name alternatives or exclusions, but the purpose is self-evident and adequate for an agent to decide when to call it.

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

list_creatorsList saved creatorsA
Read-only
Inspect

List this workspace’s SAVED CREATORS — the reusable on-camera cast (AI creators made here, a person pulled from a social profile, a consented photo upload). Read-only, FREE. Each entry gives the name, the PORTRAIT URL, where the portrait came from and whether a real person’s likeness consent is on file, how many extra pose plates exist, and any chosen or cloned voice. TO PUT ONE IN A FINISHED AD, pass their id or name as render_ad’s creator — that casts them for the whole spot (and skips the character-portrait render, so it costs less than not casting anyone). THE PORTRAIT URL IS THE REUSE HANDLE for the raw lanes — pass it as generate_avatar’s image (a talking clip of them), generate_video’s refImage (they star in the scene), recast_motion’s image (they perform a reference clip’s motion), or generate_image’s refImages. CALL THIS BEFORE OFFERING TO GENERATE A NEW PERSON: re-casting somebody the workspace already has keeps the SAME face across every ad, while a fresh person costs credits and breaks that continuity. An empty answer means the workspace genuinely has no cast yet — say so and offer generate_avatar / save_creator, never invent a roster.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax creators to return (default 24)

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
creatorsNothe saved cast — {id, name, image, source, consented, poses, voice, voiceClone, look}
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation, explicitly stating the tool is read-only and free, describing the return fields, and disclosing important behavior like 'An empty answer means the workspace genuinely has no cast yet — say so and offer generate_avatar / save_creator, never invent a roster.' It also explains cost implications and reuse semantics, providing rich behavioral context.

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

Conciseness5/5

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

Although the description is long, it is front-loaded with the core purpose and every sentence adds operational value—covering return fields, reuse handles, cost implications, and empty-result handling. There is no redundant or filler content; the structure guides the agent from definition to usage to edge-case 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?

With an output schema present, the description doesn't need to detail return value structure, but it still explains the meaning and usage of those values. It covers cross-tool integration, cost behavior, empty-result handling, and naming conventions, making the tool fully usable in context. The description is complete for a list tool of this complexity.

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?

The input schema already fully documents the only parameter (`limit`) with its description and default, so baseline is 3. The tool description adds no parameter-specific detail beyond what the schema provides, but it does describe what the returned entries contain, which indirectly helps the agent understand the tool's result. No additional parameter explanation is necessary.

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

Purpose5/5

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

The description clearly states the action ('List this workspace’s SAVED CREATORS') and specifies the resource type, distinguishing it from other list_* siblings by focusing on saved creators as reusable on-camera cast. It also enumerates what each entry contains, making the purpose concrete and unambiguous.

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: 'CALL THIS BEFORE OFFERING TO GENERATE A NEW PERSON' and explains how to handle empty results by offering generate_avatar/save_creator. It also names alternatives and usage contexts, such as passing the portrait URL to generate_avatar, generate_video, recast_motion, or generate_image, making tool selection and invocation clear.

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

list_drive_filesList Google Drive filesA
Read-only
Inspect

List the Google Drive files & folders Hermoso can reach — the ones it created, plus any the user handed over with the Google file picker in the app (the drive.file scope exposes nothing else, never their entire Drive). This is how you find the id of a file the user picked. Filter by query (name contains …), folderId (contents of a folder), or onlyFolders:true. Paginate with pageToken. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoonly files whose name contains this
folderIdNolist the contents of this folder id
pageSizeNorows per page (1–200, default 50)
pageTokenNocursor from a previous call
onlyFoldersNolist folders only
includeTrashedNoinclude trashed files (default false)

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesNo
cursorNo
Behavior5/5

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

Beyond the readOnlyHint, the description discloses the critical scope limitation: it only returns files Hermoso created or the user shared via the picker, never the full Drive. It also mentions pagination and read-only behavior, adding significant context not available from annotations alone.

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

Conciseness5/5

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

Three sentences, starting with the core purpose, followed by scope limitation and practical usage. No redundancy; every sentence 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?

With an output schema and annotations available, the description covers the essential context: what files are listed, how to filter/paginate, and the purpose (finding file IDs). It does not need to explain return values since the output schema exists.

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 the baseline is 3. The description mentions the main filters (query, folderId, onlyFolders) and pagination, but these are already well-described in the schema, adding no new semantics.

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

Purpose5/5

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

The description clearly states the tool lists Google Drive files and folders Hermoso can access, with a specific verb and resource. It distinguishes from siblings by noting the scope limitation (drive.file) and explicitly positions this as how to find a user-picked file's ID, setting it apart from other drive tools like get_drive_file.

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 provides a concrete use case ("This is how you find the id of a file the user picked") and an exclusion (never the user's entire Drive). It lacks explicit named alternatives, but the context makes clear when to use it, especially compared to sibling tools like list_onedrive_files.

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

list_employeesList AI employeesA
Read-only
Inspect

List the hireable AI Employee personas in this workspace — the built-in specialists (Short-Form Ad Strategist, UGC Scriptwriter, Product Photographer, …) PLUS any custom personas saved here, and which one is currently active. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
activeIdNo
employeesNo
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only'. It adds valuable context beyond annotations: 'free' (no cost), 'hireable' (a specific subset of personas), and 'which one is currently active' (an extra output). These details enhance behavioral understanding without contradicting 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?

The description is a single, front-loaded sentence that starts with the action and resource. It includes examples (Short-Form Ad Strategist, etc.) and clarifiers (PLUS custom, active one, Read-only, free) without any wasted words.

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 zero-parameter read-only list tool with an output schema, the description fully covers what the tool does, its scope, and behavioral expectations. Since an output schema exists, the description need not describe return values, and it provides all necessary context for safe and correct invocation.

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 has zero parameters, so the schema already covers everything. The description doesn't need to explain parameters; the baseline for 0 params is 4, and the description maintains that by not adding irrelevant detail.

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

Purpose5/5

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

The description clearly states the tool's function: 'List the hireable AI Employee personas in this workspace' with specific details on what is included (built-in specialists and custom personas) and the active one. This distinguishes it from sibling tools like save_employee or set_active_employee.

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 context on what the tool does and its scope (workspace, built-in + custom personas, active state), and notes it is 'Read-only, free' which signals safe use. However, it does not explicitly name alternative tools or exclusion conditions, so it stops short of a 5.

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

list_errorsList errors users hitA
Read-only
Inspect

The errors actually recorded against this workspace, GROUPED by fingerprint — the same failure at the same call site is one row with a hit count and first/last seen, sorted defects-first. Each row says whose side it is: ours (a defect worth fixing), user (a refusal we deliberately authored, e.g. not-connected or out-of-credits), or unknown (a vendor 4xx we cannot attribute — never guessed). Free text, tokens, emails and creative are redacted before anything is stored, so an input echo shows shapes and lengths, not content. Filter by surface (http/mcp/agent/job/client) or kind. Read-only, 0 credits. Scoped to your own workspace; an operator whose client carries the admin key sees every account.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo'ours' = a defect; 'user' = a refusal we authored; 'unknown' = we could not tell
limitNohow many groups to return (default 50, max 200)
sinceNoISO timestamp — only groups last seen at or after this
surfaceNowhere it happened: http (an API route), mcp (an agent tool), agent (the in-app Studio agent), job (an async render/publish), client (a browser crash)

Output Schema

ParametersJSON Schema
NameRequiredDescription
scopeNo'account' (your workspace) or 'all' (fleet-wide, admin key present)
groupsNogrouped errors, defects first
totalsNoheadline counts — admin scope only
retentionNohow long groups are kept and how many are retained
Behavior5/5

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

The description goes well beyond the annotations by explaining the grouping logic, the ours/user/unknown classification semantics, redaction of free text/tokens/emails, and the admin-key scoping behavior. It explicitly states read-only and 0 credits, consistent with readOnlyHint, and adds detail about what is never stored. This is exemplary behavioral disclosure.

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

Conciseness5/5

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

The description is four sentences, each adding essential context: grouping, classification, redaction, and filtering/scoping. It is dense but not bloated, front-loading the core list-and-group behavior. Every sentence earns its place, making it an ideal length for this complexity.

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?

The description covers the tool's grouping, classification, redaction, filtering, read-only nature, and workspace scoping, which fully addresses the tool's complexity. The output schema exists to detail the return shape, so the description doesn't need to repeat it. It also notes the admin-key cross-account behavior, which is a valuable operational detail.

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 schema already covers all parameters with descriptions, so the baseline is 3. The description adds meaningful nuance to the kind enum, e.g., 'unknown' is 'a vendor 4xx we cannot attribute — never guessed', and 'user' includes examples like not-connected or out-of-credits. It also enumerates surface values without adding much beyond the schema, but the enrichment justifies a 4.

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

Purpose5/5

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

The description clearly states the tool lists errors grouped by fingerprint with hit count and first/last seen, sorted defects-first. It specifies the classification into ours/user/unknown and filtering by surface/kind, making it unmistakable what this tool does. It distinguishes from sibling list tools by its unique grouping and attribution semantics.

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 provides clear context for when to use this tool: to inspect errors for a workspace, grouped by fingerprint, and to filter by surface or kind. It does not explicitly state when not to use it or mention alternatives like error_detail for individual error traces, but the read-only and scoping notes help the agent decide.

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

list_google_ads_campaignsList Google Ads accounts / campaignsA
Read-only
Inspect

Read the connected Google Ads account(s). Call with NO customerId to list the accessible accounts (customerId + name + currency) — do this first to pick a target. Call WITH customerId to list that account’s campaigns (id, name, status, daily budget, channel) plus performance metrics (impressions, clicks, CTR, avg CPC, cost, conversions). Date window: datePreset (LAST_7_DAYS | LAST_30_DAYS | TODAY | THIS_MONTH | LAST_90_DAYS …) or since+until (YYYY-MM-DD). Read-only, free. Needs Google Ads connected (Settings ▸ Connectors ▸ Google Ads).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax campaigns (1–500, default 100)
sinceNostart date YYYY-MM-DD (with until)
untilNoend date YYYY-MM-DD
statusNofilter campaigns by status
metricsNoinclude performance metrics (default true)
customerIdNo10-digit account id (dashes ok) — omit to list accessible accounts
datePresetNometrics window preset (default LAST_30_DAYS)
loginCustomerIdNomanager (MCC) id — only if reaching a client account through a manager

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
accountsNo
campaignsNo
customerIdNo
Behavior4/5

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

Beyond the readOnlyHint annotation, the description adds 'Read-only, free' and explains the dual-mode behavior depending on customerId presence. It also discloses the requirement for a connected Google Ads account and gives setup navigation, which is useful context for an agent.

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

Conciseness5/5

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

The description is four sentences, front-loaded with an overview and then quickly detailing modes, output, date options, and prerequisites. Every sentence adds essential operational information with no redundancy.

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 of 8 parameters and a dual-mode operation, the description covers the discovery workflow, campaign output, date filtering, and setup prerequisites. An output schema exists, so the description does not need to repeat return field details; it provides sufficient context to invoke the tool correctly.

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?

Although the schema describes all 8 parameters (coverage 100%), the description adds interpretive context: it clarifies the semantic of omitting customerId to list accounts, expands on datePreset with actual enum examples, and notes the default inclusion of metrics. This goes beyond the schema's field descriptions.

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

Purpose5/5

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

The description clearly states this tool reads Google Ads accounts/campaigns with a specific verb and resource, and it distinguishes between two modes: listing accessible accounts without customerId, and listing campaigns with customerId. It enumerates exact output fields for each mode, making it distinctly different from sibling list_* tools.

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 explicitly instructs the caller to first invoke without customerId to discover accounts, then with customerId to list campaigns, providing a clear workflow. It also mentions the prerequisite of connecting Google Ads, but does not explicitly discuss when to use alternative reporting tools or when not to use it.

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

list_google_ads_conversion_actionsList Google Ads conversion actionsA
Read-onlyIdempotent
Inspect

List the conversion actions on a Google Ads account and say plainly whether smart bidding can work there. Call this BEFORE proposing MAXIMIZE_CONVERSIONS / MAXIMIZE_CONVERSION_VALUE / TARGET_CPA / TARGET_ROAS or any Performance Max campaign: an account with no ENABLED conversion action that counts toward "conversions" cannot optimise on any of them, and the campaign would spend its budget without ever learning. Shows each action’s status, type, category, counting type, and whether it counts toward "conversions". Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdNo10-digit account id (dashes ok) — omit to use the brand’s selected default account
includeRemovedNoalso list REMOVED conversion actions
loginCustomerIdNomanager id if operating through an MCC

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
countNo
usableCountNo
canRunSmartBiddingNo
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it is 'free,' shows specific per-action fields, and includes the smart-bidding feasibility assessment. This goes beyond the annotations without contradicting them.

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

Conciseness4/5

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

The description is somewhat long but every sentence earns its place: the first states purpose and the critical precondition, the second lists output content and safety. It is front-loaded with the most important usage guidance, making it effective despite being more than a single sentence.

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 moderate complexity, optional parameters, and rich output schema, the description is complete. It tells the agent when to call, why it matters, what the output contains, and the safety profile. The presence of an output schema means the return values need not be spelled out.

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?

The input schema has 100% description coverage, including details like '10-digit account id (dashes ok)' and 'also list REMOVED conversion actions.' The description does not repeat or add parameter-level details, so a baseline score of 3 is appropriate since the schema fully handles parameter semantics.

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 uses a specific verb ('List') and resource ('conversion actions'), and goes further by stating the tool will 'say plainly whether smart bidding can work there.' This clearly distinguishes it from sibling tools like list_google_ads_campaigns or create_google_ads_conversion_action.

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?

The description gives explicit when-to-use guidance: 'Call this BEFORE proposing MAXIMIZE_CONVERSIONS / MAXIMIZE_CONVERSION_VALUE / TARGET_CPA / TARGET_ROAS or any Performance Max campaign.' It also explains the negative consequence of not doing so, which is strong contextual guidance for the agent.

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

list_google_business_postsList Google Business Profile PostsA
Read-only
Inspect

List the Posts currently on the brand’s Google Business Profile listing — text, topic type, state (LIVE / PROCESSING / REJECTED / SCHEDULED / RECURRING), button and timestamps. Use it to see what is already showing before writing another, or to get the id of one to remove. Read-only, 0 credits. Needs Google Business Profile connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many to return, max 100 (default 20)
locationIdNowhich listing, from list_business_locations — only needed when there is more than one

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
postsNo
locationNo
locationIdNo
Behavior4/5

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

Adds useful context beyond the readOnlyHint annotation: '0 credits' (cost) and 'Needs Google Business Profile connected' (prerequisite). It also lists the possible state values (LIVE / PROCESSING / REJECTED / SCHEDULED / RECURRING). The 'Read-only' phrase partially restates readOnlyHint, but the additional details justify a 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?

Three sentences, each earning its place: first states purpose and return fields, second provides use cases, third covers cost and prerequisite. Front-loaded with the action verb and resource, with no filler or redundant phrasing.

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 simple read-only list tool with two optional parameters, an output schema, and readOnlyHint/openWorldHint annotations, the description is complete. It covers what the tool does, when to use it, prerequisites, and cost. The output schema handles return-value details, so no further explanation is needed.

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 already described clearly (limit has default/maximum, locationId references list_business_locations). The description does not add any additional parameter semantics beyond what the schema already provides, so it stays at the 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?

Description starts with the specific verb 'List' and clearly identifies the resource: Posts on the Google Business Profile listing. It enumerates the returned fields (text, topic type, state, button, timestamps) and differentiates from sibling tools by framing two concrete use cases: seeing what is already showing before writing another post, and obtaining the id of a post to remove.

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 explicit usage context: 'Use it to see what is already showing before writing another, or to get the id of one to remove.' It also notes the prerequisite 'Needs Google Business Profile connected' and the cost ('0 credits'). However, it does not explicitly name sibling alternatives (e.g., list_google_business_reviews) or state when not to use the tool.

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

list_google_business_questionsRead the Q&A on a Google Business listingA
Read-only
Inspect

The questions the public has asked on the brand’s Google Business Profile listing, with the answers so far and how many people upvoted each question. Unanswered questions sit publicly on the listing and are read as "this business does not respond" — the reply names the ones with no answer at all. Read-only, 0 credits. Needs Google Business Profile connected and the project approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo1–20, default 10
pageTokenNo
locationIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
countNo
questionsNo
Behavior4/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description adds useful context: 0 credits cost, required connections/approval, and the interpretation of unanswered questions as 'this business does not respond'. It also notes that the reply names questions with no answer. 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.

Conciseness5/5

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

The description is exceptionally concise, using two sentences to convey purpose, data details, behavioral nuance, prerequisites, and cost. Every sentence adds value, and the main purpose 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?

Given the presence of an output schema, the description doesn't need to explain return structure. It covers the essential context: what data is returned, prerequisites, cost, and the special handling of unanswered questions. It could be more explicit about pagination, but that's a minor gap.

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?

Schema description coverage is only 33% (only 'limit' has a description). The description does not mention any parameters, failing to clarify the meaning or purpose of locationId and pageToken. It implies a specific brand listing but does not explicitly state how to identify it, leaving a significant gap in compensating for the low schema coverage.

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

Purpose5/5

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

The description clearly states the tool lists public questions on a Google Business Profile listing, including answers and upvote counts. It uses a specific verb ('lists') and resource ('Google Business Profile listing'), and is distinct from sibling tools like answer_google_business_question (which answers questions) and list_google_business_reviews (which lists reviews).

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 provides clear context: it is a read-only Q&A listing tool with 0 credits and prerequisites (Google Business Profile connected and project approved). However, it does not explicitly mention alternatives or when not to use it, such as pointing to answer_google_business_question for responding to questions.

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

list_google_business_reviewsRead the reviews on a Google Business listingA
Read-only
Inspect

The reviews customers have left on the brand’s Google Business Profile listing — star rating, reviewer, the text, when it landed, and whether the business has replied. For a local business this is the highest-leverage surface there is: an unanswered review sits on the listing next to the ad you paid for. The reply says which ones have NO answer yet, so you can work the list rather than read it. Google reports the listing’s own average rating and total review count alongside the page — use those for "how are we doing", never a mean you computed over one page. An empty page is an empty PAGE, not proof the listing has no reviews. Read-only, 0 credits. Needs Google Business Profile connected AND the project approved for Google’s Business Profile APIs (a pending access request, not a setting — the error says so).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo1–50, default 20
orderByNodefault newest first
pageTokenNo
locationIdNowhich listing — omit when only one is shared with this brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
countNo
reviewsNo
locationNo
averageRatingNo
nextPageTokenNo
totalReviewCountNo
Behavior5/5

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

The annotations (readOnlyHint, openWorldHint) are consistent and enriched by the description. It adds concrete operational details: 'Read-only, 0 credits', the prerequisite of Google Business Profile connection and API approval (including how to interpret the error), and the open-world caveat that an empty page is not evidence of no reviews. This goes well beyond the annotations.

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

Conciseness5/5

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

The description is longer than average but every sentence contributes value: field enumeration, business context, reply prioritization, metric calculation warning, empty-page caveat, read-only/credit cost, and prerequisites. It is front-loaded with the core purpose and structured logically from main function to operational details.

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 read-only list tool with an output schema, the description covers the essential aspects: what it returns, why it matters, how to interpret results (including pitfalls), and what setup is required. The output schema handles return-form specifics, so the description's depth is sufficient for an agent to select and 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 75% (3 of 4 params described), and the schema descriptions are decent. The description adds no parameter-specific guidance, but it does indirectly mention the notion of 'no answer' which relates to reply status, not a parameter. Since coverage is below the 80% threshold but still substantial, a baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool reads reviews from a Google Business Profile listing, listing specific fields (star rating, reviewer, text, date, reply status). It distinguishes from sibling tools like reply_to_google_business_review by focusing on reading/listing rather than responding, and from other list_* tools by targeting reviews specifically.

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

Usage Guidelines4/5

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

Provides strong contextual guidance: local business context, emphasis on unanswered reviews as a priority, and advice to use Google's own aggregate metrics rather than computing a mean from one page. It also warns about empty pages being ambiguous. It does not explicitly name alternative tools, but the context makes the primary use case clear.

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

list_hooksThe hook + setting libraries, and which hooks are workingA
Read-only
Inspect

The curated menu of VISUAL scroll-stop HOOKS (how an ad opens) and SETTINGS (where it is staged) that plan_ad and render_ad accept, PLUS this brand's measured traction per hook. Call it before planning an ad to pick a hook deliberately instead of letting the model improvise one, and call it after publishing to see which ones are actually landing. Three things it will not do: it never recommends a hook from thin data — a verdict is SUPPRESSED below 5 measured posts and the reason is stated; it never compares across channels; and it reports hooks you have NEVER TRIED as a fact, not as advice, because 'you haven't tried this' is an observation and 'you should' would be a verdict drawn from zero data. A hook marked unusable in this brief says WHY (an on-screen-text hook cannot ride an authentic/UGC render, which carries zero on-screen text). Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
tierNoproduct tier, used with category — changes the FINISH of the room, never the room. Default premium.
channelNorestrict the performance half to one channel (facebook, instagram, threads, x, linkedin, youtube, tiktok, reddit, pinterest)
categoryNothe product category (e.g. 'skincare serum', 'protein powder', 'sunglasses') — returns the setting Higgsfield's Location x Tier matrix puts that category in, with the reason
authenticNotrue if the planned ad is an authentic/UGC/creator-register render — on-screen-text hooks are then reported unusable, with the reason

Output Schema

ParametersJSON Schema
NameRequiredDescription
hooksNo
rankedNo
evidenceNo
patternsNo
settingsNo
patternRuleNo
suggestedSettingNo
Behavior5/5

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

Beyond the readOnlyHint annotation, the description adds rich behavioral details: verdicts are suppressed below 5 measured posts with the reason stated; it never compares across channels; and 'you haven't tried this' is an observation, not advice. It also explains why unusable hooks are flagged (e.g., on-screen-text hook cannot ride an authentic/UGC render). This exceeds annotation coverage.

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 every sentence carries useful behavioral or usage information. It is front-loaded with a clear definition and then structured with 'Call it before...' and 'Three things it will not do.' It could be slightly trimmed without losing meaning, but it earns most of its length, earning a 4 rather than 5.

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 (4 optional params, output schema, multiple constraints), the description fully covers when to use it, what it returns (traction per hook, suppression rules), and its limitations (no cross-channel comparison, untried hooks as observation). The presence of an output schema means return-value details are deferred to the schema, so the description is 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?

The schema covers all 4 parameters with detailed descriptions (100% coverage), so the description doesn't need to add param syntax. It does tie 'authentic' to the on-screen-text hook behavior already in the schema, but adds no unique parameter semantics. Baseline 3 is appropriate given the schema's thoroughness.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'The curated menu of VISUAL scroll-stop HOOKS (how an ad opens) and SETTINGS (where it is staged) that plan_ad and render_ad accept, PLUS this brand's measured traction per hook.' It distinguishes itself from siblings by naming plan_ad and render_ad and by focusing on 'hooks' rather than generic lists. The verb 'list' and resource 'hooks' are explicit.

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 usage guidance is provided: 'Call it before planning an ad to pick a hook deliberately instead of letting the model improvise one, and call it after publishing to see which ones are actually landing.' It also gives clear exclusions: 'never recommends a hook from thin data,' 'never compares across channels,' and reports untried hooks as fact, not advice. This fully distinguishes when and why to use this tool.

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

list_instagram_mediaList the brand’s Instagram postsA
Read-only
Inspect

The connected Instagram Business account’s own recent media — id, caption, media type (feed / reel / story-era), permalink, timestamp, like and comment counts. This is where the media id every other Instagram tool needs comes from: resolve “my latest reel” yourself instead of asking the user for a link, then pass the id to meta_post_insights. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many (1–50, default 15)
pageIdNoFacebook Page id — omit when only one Page is connected

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
mediaNo
instagramIdNo
Behavior4/5

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

Annotations declare readOnlyHint and openWorldHint; the description reinforces this with 'Read-only, 0 credits' and adds scope details (own recent media only). It also discloses that this is the source of media IDs for other tools, which is useful behavioral context beyond the annotations.

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

Conciseness5/5

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

The description is three sentences: a purpose sentence, a workflow sentence, and a cost/safety note. Every sentence adds distinct value with no redundancy or 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 output schema and input schema cover structured details and annotations cover safety, the description supplies the key contextual elements: canonical ID source, zero credit cost, and integration with meta_post_insights. It is fully sufficient for an agent to select and 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?

The schema describes both parameters (limit with range 1-50/default 15, pageId with guidance to omit when one Page is connected), achieving 100% schema description coverage. The tool description adds no further parameter details, so the baseline score of 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 clearly identifies the tool as listing the connected Instagram Business account's own recent media and enumerates the returned fields (id, caption, media type, permalink, timestamp, like/comment counts). It also distinguishes itself by noting it's the canonical source of media IDs for other Instagram tools, setting it apart from sibling search/list tools.

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 explicitly tells the agent to use this tool to resolve media IDs (e.g., 'my latest reel') rather than asking the user for a link, and directs the resulting ID to meta_post_insights. It also names an alternative destination tool, though it does not state explicit exclusions (e.g., when to use search_instagram instead).

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

list_jobsList render jobsA
Read-only
Inspect

List the most recent render jobs + how many are currently running, so you can report on or resume in-flight work.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobsNorecent jobs ({id, type, status, …}), newest first
runningNohow many jobs are currently running
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the description need not re-state safety. It adds behavioral details about recency and running count, but does not mention limits, ordering, or pagination—though an output schema exists to fill some gaps.

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?

Description is a single concise sentence, front-loaded with verb and object, and every clause adds meaningful context. No wasted words.

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 no-parameter tool with an output schema, the description covers the essential behavior and use case. Minor omission: no explicit mention of result ordering limit, but the output schema likely covers return structure, so this is adequate.

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 has zero parameters, so the baseline of 4 applies. There is no parameter information needed, and the schema coverage is trivially 100%.

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?

Description clearly states the action (List), resource (render jobs), and scope (most recent + how many are currently running). This distinguishes it from siblings like get_job (fetch a single job) and render_ad (create a job).

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

Usage Guidelines4/5

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

Provides a clear purpose and context ('so you can report on or resume in-flight work'), but does not explicitly name alternatives or exclusion cases. The context is sufficient for selecting this over single-job retrieval.

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

list_libraryList libraryA
Read-onlyIdempotent
Inspect

Browse this workspace's Library — every image/video generated in the Studio, newest first (the same Library the web app shows). Returns served URLs you can open directly or hand to fetch_asset for a download link, plus each asset's kind, model, and age. Free, read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNofilter by asset kind (default 'all')
limitNomax assets to return (default 20, max 60)

Output Schema

ParametersJSON Schema
NameRequiredDescription
assetsNo
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds useful behavioral context: assets are 'newest first', it returns served URLs plus each asset's kind, model, and age, and it links to fetch_asset for downloads. It does not contradict any 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?

The description is three sentences with no filler: the first identifies the resource and scope, the second explains return contents and the fetch_asset relationship, and the third adds a cost/read-only note. Every sentence contributes value, and the structure is front-loaded with the core purpose.

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 simplicity (2 optional params, comprehensive annotations, and an output schema), the description is complete. It explains the library's scope, sort order, return contents, and downstream usage with fetch_asset, leaving no critical gaps for an agent to select and invoke the tool.

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

Parameters3/5

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

Schema description coverage is 100%, with both 'kind' and 'limit' fully documented including defaults and max. The description adds minimal extra parameter meaning beyond noting that the library contains images/videos, which is already reflected in the schema's enum. This meets the baseline for high schema coverage.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Browse this workspace's Library — every image/video generated in the Studio' with a specific verb and resource. It explicitly distinguishes itself from sibling list tools by scoping to the Library and mentioning 'the same Library the web app shows', making it unique among the many list_* tools.

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 provides clear context for when to use the tool (browsing generated media in the Library) and explicitly directs the agent to fetch_asset for a download link, which names an alternative path. However, it does not explicitly state when not to use this tool versus other listing tools, so it falls short of a 5.

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

list_linkedin_ads_campaignsList LinkedIn ad accounts / campaignsA
Read-only
Inspect

Read the LinkedIn ad accounts this connection can reach, and — with adAccountId — that account’s campaign groups and campaigns: name, status, objective, budgets, and LinkedIn’s own servingStatuses, which explain WHY something is not delivering (billing hold, start-date hold, parent-status hold). LinkedIn’s Advertising API is an approval-gated product, and on its Development tier each ad account must ALSO be mapped to the app in LinkedIn’s Developer Portal — so if nothing is reachable, say that rather than implying the user has no ad account. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusesNo
campaignIdNoalso return the CREATIVES (the actual ads) under this campaign, each with its intendedStatus, whether it isServing, and LinkedIn’s own servingHoldReasons
adAccountIdNoLinkedIn ad account id — omit to list the reachable accounts
campaignIdsNosame, for several campaigns at once

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
accountsNo
campaignsNo
creativesNo
adAccountIdNo
campaignGroupsNo
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description adds critical operational context: the API is approval-gated, accounts must be mapped on the Development tier, and servingStatuses explain non-delivery reasons. It also instructs agents on how to handle empty results, which is valuable behavioral guidance.

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 information-dense and front-loaded with the core purpose. The second sentence about API gating is slightly long but necessary for transparency. Every sentence contributes value, so it earns a high score despite not being the shortest.

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 moderate complexity, the description covers the key scenarios (listing accounts vs. campaigns), the meaning of servingStatuses, API prerequisites, and the read-only/free nature. With an output schema present, return values need no explanation, and the description is complete for practical use.

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 schema covers most parameters, but the description adds meaning by explaining the adAccountId flow (omit to list accounts) and mentions the campaign-level fields. The campaignId and campaignIds descriptions in the schema provide specific return details like creatives and servingHoldReasons, complementing the main description.

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

Purpose5/5

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

The description clearly states it reads LinkedIn ad accounts and campaign groups/campaigns, with specific fields like name, status, objective, budgets, and servingStatuses. This distinguishes it from sibling list tools for other ad platforms and from search_linkedin_ads.

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 provides clear context: use without adAccountId to list accounts, use with adAccountId to get campaign groups and campaigns. It also gives behavioral guidance about LinkedIn's approval-gated API and how to report unreachable accounts, though it does not explicitly mention alternatives or exclusions.

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

list_linkedin_pagesList the LinkedIn company Pages this account administersA
Read-only
Inspect

List the LinkedIn COMPANY PAGES the connected account administers — id, name and the role held on each. ALWAYS call this before post_to_linkedin_page when there is more than one Page: publishing to the wrong company Page is a public mistake and Hermoso never chooses for the user. If it comes back empty, the account holds no Page admin role, or LinkedIn has not granted this app the organization scopes — say that plainly rather than guessing an id. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
organizationsNo
Behavior5/5

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

Adds context beyond annotations: states 'Read-only, free', explains the 'Hermoso never chooses' behavior, and clarifies what an empty result means (no admin role or missing scopes). This aligns with readOnlyHint and provides valuable operational context.

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 with a distinct purpose: what it returns, when to use it, and how to handle empty results. No wasted words.

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 zero parameters, an output schema present, and readOnly/openWorld annotations, the description covers the essential information: purpose, usage timing, and empty-result handling. Nothing critical 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?

The tool has no parameters, so there is nothing to describe. The description mentions return fields (id, name, role), which is relevant but not parameter semantics. Baseline 4 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 clearly states the tool lists LinkedIn company pages the connected account administers, including id, name, and role. This distinguishes it from sibling tools like list_linkedin_ads_campaigns or post_to_linkedin_page.

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 instructs to call before post_to_linkedin_page when there is more than one page, explaining the risk of posting to the wrong page and that the system never chooses for the user. Also provides guidance on interpreting an empty result.

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

list_memoryList memoryA
Read-only
Inspect

List the durable facts & preferences saved in this workspace’s Memory (what the studio remembers about the brand, audience, taste, and do/don’t rules) — the same Memory the web app shows. These shape every future ad. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax items (default 50, max 200)
categoryNofilter to one bucket (Brand/Audience/Taste/Do/Don’t/Preference)

Output Schema

ParametersJSON Schema
NameRequiredDescription
memoryNo
Behavior3/5

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

The readOnlyHint annotation already declares the safe read-only nature, and the description redundantly says 'Read-only' but adds new context: it's free, it mirrors the web app's memory, and that these facts shape every future ad. However, it doesn't disclose details like pagination or return structure, though the output schema covers that, so it adds modest value beyond annotations.

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

Conciseness5/5

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

The description is two punchy, front-loaded sentences. It states the action immediately, explains what memory is, gives the business context, and ends with 'Read-only, free.' Every sentence earns its place with zero 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?

Given the simple tool (2 optional, well-documented params), the presence of an output schema, and annotations covering read-only, the description is complete. It explains what the tool does, what memory contains, why it matters, and the free/read-only nature. No further context is needed.

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% (both limit and category have descriptions). The tool description does not add any parameter-specific meaning beyond the schema, so the baseline of 3 is appropriate. No gaps in parameter understanding.

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: 'List the durable facts & preferences saved in this workspace's Memory.' It further clarifies the contents (brand, audience, taste, do/don't rules) and distinguishes itself from sibling tools like remember/forget by noting it's read-only. This is as clear as the high-caliber example 'get_calls'.

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

Usage Guidelines3/5

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

The description implies usage (use this to inspect the workspace's memory) and notes it's read-only, but does not explicitly state when to use it versus alternatives like remember or forget. No exclusions are given. This is implied usage, not explicit guidance, so it falls below a 4.

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

list_meta_adsList Meta campaigns / ad sets / adsA
Read-only
Inspect

Read the EXISTING campaigns, ad sets, or ads on a connected Meta ad account — id, name, status, budget, objective. Pass adAccountId (from list_meta_pages) and level (campaign|adset|ad). Scope to a parent with campaignId (→ its ad sets/ads) or adsetId (→ its ads), and filter by status (ACTIVE/PAUSED/…). Read-only — use it to inspect an account before editing/deleting, or to answer "what’s running?".

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNowhat to list (default campaign)
limitNomax rows (1–200, default 50)
statusNofilter by effective status, e.g. ACTIVE / PAUSED
adsetIdNolist the ads under this ad set
campaignIdNolist the ad sets / ads under this campaign
adAccountIdYesad account id (act_… or digits — from list_meta_pages)

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
itemsNo
levelNo
cursorNo
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces 'Read-only' and 'Read the EXISTING'. It adds beyond annotations by detailing the fields returned (id, name, status, budget, objective) and the parent-child scoping behavior via campaignId/adsetId. It does not cover pagination or error conditions, but the output schema likely handles return structure.

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 sentences, front-loaded with the core purpose and immediately followed by essential usage instructions. Every sentence carries useful information, and there is no redundant or filler content.

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

Completeness5/5

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

Given the tool has 6 parameters, 1 required, and an output schema, the description covers the required parameter, optional level, scoping, filtering, and the read-only use case. It is complete for a listing tool with rich schema annotations, and the output schema can describe return values.

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 description coverage is 100% (baseline 3), but the description adds extra semantics: adAccountId originates from list_meta_pages, level values are enumerated (campaign|adset|ad), and the hierarchical relationship between campaignId, adsetId, and level is explained. This goes beyond the schema without repeating it.

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: 'Read the EXISTING campaigns, ad sets, or ads on a connected Meta ad account' and lists the returned fields (id, name, status, budget, objective). It clearly distinguishes from sibling tools by naming the exact object types and scoping levels.

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 when-to-use guidance: 'use it to inspect an account before editing/deleting, or to answer "what’s running?"'. It explains how to pass adAccountId and level, and how to scope with campaignId or adsetId. However, it does not explicitly name alternative tools or when-not-to-use scenarios, so it stops short of a 5.

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

list_meta_audiencesList Meta custom audiences + lookalikesA
Read-only
Inspect

List the custom audiences and lookalikes on a connected Meta ad account — id, name, type, approximate size, and whether Meta says it is ready to target. Call it before create_meta_audience (so you never build a duplicate) and before targeting one: the ids go straight into create_meta_ad’s targeting.customAudiences / excludedCustomAudiences. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax rows (1–200, default 50)
adAccountIdYesad account id (act_… or digits)

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
cursorNo
audiencesNo
adAccountIdNo
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the description doesn't need to restate safety, but it adds 'Read-only, free' to confirm and disclose cost. It also reveals that the tool returns 'approximate size' and 'whether Meta says it is ready to target', which are meaningful behavioral/data nuances beyond the schema. No contradictions with annotations.

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

Conciseness5/5

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

Three sentences, each earning its place: the first states purpose, the second gives workflow context, the third covers cost and read-only nature. It is front-loaded with the core function and contains 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 simplicity, the output schema, and annotations, the description is fully complete: it covers what, when, and how to use the results. It even provides integration details for create_meta_ad and duplicate prevention, which goes beyond the minimum for this list-like tool.

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%: both adAccountId and limit are fully described in the input schema (e.g., 'act_… or digits', '1–200, default 50'). The description adds no extra parameter-level detail beyond what the schema already provides, so the baseline of 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 starts with a specific verb and resource: 'List the custom audiences and lookalikes on a connected Meta ad account' and enumerates the exact fields returned (id, name, type, approximate size, readiness). It clearly differentiates from siblings like list_meta_ads and create_meta_audience by naming them and stating the purpose.

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 usage guidance is provided: 'Call it before create_meta_audience (so you never build a duplicate) and before targeting one'. It also tells the agent how to use the output ('the ids go straight into create_meta_ad’s targeting.customAudiences / excludedCustomAudiences'), naming specific alternative tools and establishing a workflow order.

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

list_meta_commentsRead comments on a Meta postA
Read-only
Inspect

Read the comments under a Facebook Page post or Instagram media object — customer questions, objections and the exact language real people use about the product. Good raw material for ad copy, and the first step before replying or moderating.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many comments (1–50, default 25)
pageIdNoPage id — omit when only one Page is connected
postIdYespost/media id

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
commentsNo
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces this by saying 'read the comments'. It adds value by describing the content type (customer questions, objections, exact language), which goes beyond a simple 'list comments' statement. No contradictions.

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

Conciseness5/5

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

Two sentences, both essential. The first sentence states the core purpose and scope; the second explains its practical value. No fluff or repetition.

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 a simple, read-only profile with an output schema available. The description covers the purpose, scope, and use cases. It doesn't discuss pagination or edge cases, but these are not critical given the annotations and 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?

The input schema has 100% parameter coverage with clear descriptions. The tool description adds minimal extra meaning beyond clarifying that postId can refer to a Facebook post or Instagram media object, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool reads comments under a Facebook Page post or Instagram media object. It distinguishes from siblings like list_meta_posts and reply_to_meta_comment by focusing on the read-only retrieval of comments.

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 explicitly frames when to use it: as raw material for ad copy and as the first step before replying or moderating. This gives concrete context, though it doesn't mention excluded scenarios or direct alternatives.

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

list_meta_pagesList Meta pages & ad accountsA
Read-only
Inspect

List the Facebook Pages (with any linked Instagram business account) and ad accounts on the connected Meta account — use before post_to_meta / create_meta_campaign to pick the target. Requires the user to have connected Meta (Settings ▸ Connectors ▸ Meta); returns a connect hint if not.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
pagesNo
adAccountsNo
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=true, so the base behavioral expectations are covered. The description adds value beyond annotations by specifying what entities are included ('Facebook Pages (with any linked Instagram business account) and ad accounts') and disclosing the connect-hint behavior when Meta isn't connected. It doesn't discuss pagination or error handling, but those are expected for a list operation and the output schema exists.

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 sentences, front-loaded with the main action and resource, and then provides the usage context and prerequisite. Every clause adds distinct information: what's listed, when to use it, and the prerequisite/behavior if unmet. No redundancy or 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?

Despite having no parameters and a simple read-only operation, the description covers purpose, timing, prerequisites, and fallback behavior. Combined with the existing annotations and output schema, the agent has everything needed to select and invoke this tool correctly. The explicit tie-in to downstream tools completes the contextual picture.

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 has zero parameters, so there are no parameter semantics to clarify. The description compensates by explaining the tool's role and context, which is the appropriate baseline for no-parameter tools. It doesn't need to describe parameter behavior since none exist.

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

Purpose5/5

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

The description clearly identifies the tool's verb ('List') and resource ('Facebook Pages... and ad accounts'), specifies the scope ('on the connected Meta account'), and distinguishes it from siblings like list_meta_ads and list_meta_posts by naming its exact output. It also explicitly ties it to prerequisite tools (post_to_meta, create_meta_campaign), making its purpose 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?

The description states exactly when to use it: 'use before post_to_meta / create_meta_campaign to pick the target.' It also discloses a prerequisite ('Requires the user to have connected Meta') and the fallback behavior if that prerequisite isn't met ('returns a connect hint if not'). This is explicit, actionable guidance that no sibling tool description provides.

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

list_meta_postsList the Page’s / Instagram account’s own postsA
Read-only
Inspect

List the connected Facebook Page's or Instagram account's OWN existing posts — id, caption, permalink, publish date and format. THIS IS THE TOOL THAT GETS YOU THE postId every other Meta read needs: meta_post_insights, list_meta_comments and manage_meta_post all require one, and until now the only way to have a postId was to have just published it yourself with post_to_meta. Use it for "how did our last few posts do", to find a post the user describes loosely, or before backfill_posts. Pass target:'instagram' for the linked IG account (Stories are excluded — Meta's media edge does not return them); Facebook hides unpublished drafts unless you ask for them. Only ever reads a Page the brand has connected. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many posts (default 25, max 100)
cursorNopaging cursor returned by a previous call
pageIdNowhich connected Page — omit when the brand has only one
targetNodefault facebook; 'instagram' reads the Page's linked IG business account
includeUnpublishedNoFacebook only — also return unpublished drafts (hidden by default)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
postsNo
cursorNo
pageIdNo
targetNo
accountNo
Behavior4/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses read-only and 0 credits, excludes Instagram Stories, notes that Facebook drafts are hidden unless requested, and clarifies it only reads a connected Page. It doesn't describe pagination behavior in detail, but adds meaningful context.

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 moderately long but every sentence adds value—purpose, key use case, platform nuances, and safety profile. It is well-structured, starting with core function, then importance, use cases, and caveats.

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?

Given the output schema exists, the description covers purpose, usage, exclusions, platform-specific behaviors, and safety. It slightly lacks explicit mention of pagination or multi-page handling, but those are covered by parameters. Overall very complete.

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 adds semantic layer: target:'instagram' for the linked IG account, implications of includeUnpublished, and the fact that Stories are not returned. This goes beyond basic schema properties.

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

Purpose5/5

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

The description clearly states the tool lists the connected Facebook Page's or Instagram account's OWN existing posts with return fields. It explicitly distinguishes itself by being the source of postId needed by meta_post_insights, list_meta_comments, and manage_meta_post, and contrasts with backfill_posts.

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

Usage Guidelines4/5

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

Provides clear use cases: checking post performance, finding a loosely described post, and as a prerequisite for backfill_posts. It also names downstream tools that need the postId. However, it doesn't explicitly state when NOT to use this tool versus alternatives like list_instagram_media or list_published_posts, though the target param covers Instagram.

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

list_microsoft_ads_campaignsList Microsoft Advertising accounts / campaignsA
Read-only
Inspect

Read the brand’s connected Microsoft Advertising (Bing Ads) account(s). Call with NO accountId to list the accounts shared with this brand — do this first to pick a target. Call WITH accountId to list that account’s campaigns (id, name, status, daily budget, campaign type, and whether the budget is SHARED). Microsoft statuses are Active / Paused — never Google’s ENABLED — and Microsoft also sets BudgetPaused, BudgetAndManualPaused and Suspended on its own, so report the status you read rather than assuming a paused campaign was paused by a person. Read-only, free. Needs Microsoft Advertising connected (Settings ▸ Connectors ▸ Microsoft Advertising).

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdNoMicrosoft ad account id — omit to list the accounts shared with this brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
accountsNo
accountIdNo
campaignsNo
allCampaignTypesNo
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses important behavioral nuances: Microsoft statuses are Active/Paused, not Google's ENABLED, and Microsoft can auto-pause via BudgetPaused, BudgetAndManualPaused, and Suspended. It instructs the agent to report the status as read rather than inferring human action. It also confirms the operation is read-only and free and requires the Microsoft Advertising connector.

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 just three sentences and a note, yet it covers the dual-mode usage, status semantics, prerequisites, and cost. Every sentence carries substantive information, with the primary action front-loaded in the first sentence. No filler or redundancy.

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 two-mode behavior, platform-specific status differences, and prerequisite, the description is comprehensive. It covers what the tool does, how to invoke each mode, what data is returned, critical status caveats, and setup requirements. The output schema exists to document return shapes, so the description does not need to repeat those details.

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 adds value beyond the schema by explaining the consequence of omitting accountId (list accounts) vs. providing it (list campaigns), and by enumerating the returned campaign fields (id, name, status, daily budget, campaign type, shared budget). This contextualizes the single parameter more richly than the schema 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?

The description opens with a specific verb and resource: 'Read the brand's connected Microsoft Advertising (Bing Ads) account(s).' It clearly distinguishes two modes (list accounts vs. list campaigns) and differentiates from sibling tools like list_google_ads_campaigns or list_linkedin_ads_campaigns by naming Microsoft Advertising explicitly.

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 explicit when-to-use guidance: 'Call with NO accountId to list the accounts shared with this brand — do this first to pick a target' and 'Call WITH accountId to list that account's campaigns.' It also notes the prerequisite of being connected. It does not explicitly name alternative tools for other platforms, but the platform-specific naming and context make the usage clear.

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

list_onedrive_filesList OneDrive filesA
Read-only
Inspect

List files & folders in the user’s OneDrive — the root by default, a folder’s contents (folderId), or a name search (query). onlyFolders:true lists folders only. Paginate with pageToken (the cursor from a previous call). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNosearch — only items whose name matches this
folderIdNolist the contents of this folder id
pageSizeNorows per page (1–200, default 50)
pageTokenNocursor from a previous call
onlyFoldersNolist folders only

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesNo
cursorNo
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description redundantly restates 'Read-only' but adds valuable behavioral context by explaining the three listing modes and pagination with pageToken. It also clarifies that onlyFolders filters to folders only, which goes beyond the schema and 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?

The description is two sentences, front-loaded with the core purpose, and each clause adds distinct operational guidance. No wasted words.

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 read-only listing tool with 5 fully described parameters and an output schema, the description covers all functional modes, pagination, and filtering. It doesn't need to explain return values due to the output schema, and read-only status is already annotated.

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 schema covers 100% of parameters, but the description adds integrated semantics by showing how query, folderId, and onlyFolders combine into different listing modes. It also explains pageToken as a cursor for pagination, enriching the raw schema descriptions.

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

Purpose5/5

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

The description clearly states 'List files & folders in the user’s OneDrive' with a specific verb and resource. It distinguishes from sibling tools like list_drive_files by explicitly naming OneDrive and explaining distinct listing modes (root, folderId, query). This is a strong, specific purpose statement.

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 provides concrete usage modes ('root by default, a folder’s contents (folderId), or a name search (query)') and pagination instructions. However, it doesn't explicitly state when not to use it or mention alternative tools (e.g., list_drive_files for Google Drive), so it misses explicit exclusions and alternatives.

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

list_openai_ads_audiencesList ChatGPT Ads custom audiencesA
Read-only
Inspect

List the custom audiences on the connected ChatGPT Ads account. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
audiencesNo
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the 'Read-only' phrase is redundant. However, the description adds 'free' and specifies the data source ('connected ChatGPT Ads account'), which provides some context beyond annotations. It does not describe pagination, result ordering, or other behavioral details, but the output schema exists to cover return structure.

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 short sentences, front-loading the main purpose and adding behavioral context. Every word contributes meaning, with no fluff or repetition of schema details.

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 is simple with one optional parameter, output schema exists, and annotations are helpful. However, the absence of any explanation for the limit parameter is a noticeable gap. Given the low schema coverage, the description could have added a brief note about limit to make the tool fully self-contained.

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 input schema has one optional parameter, limit, with a type of 'number' but no description. Schema description coverage is 0%, and the description does not mention limit or its semantics, such as maximum value or default behavior. The parameter name gives a hint, but the description fails to compensate for the lack of schema-level documentation.

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

Purpose5/5

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

The description clearly states the action ('List') and the resource ('custom audiences on the connected ChatGPT Ads account'), using a specific verb and resource. It is easily distinguishable from sibling tools like create_openai_ads_audience or list_openai_ads_campaigns, which operate on different resources or actions.

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 provides clear context: it lists custom audiences on the connected ChatGPT Ads account, which is a read-only operation. It does not explicitly mention alternatives or exclusions, but the scope is self-evident and no competing list tool exists for OpenAI audiences. The 'read-only' and 'free' notes help set expectations for when this tool is appropriate.

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

list_openai_ads_campaignsList ChatGPT Ads account / campaigns / ad groups / adsA
Read-only
Inspect

Read the brand’s connected ChatGPT Ads account — the ads that appear below ChatGPT answers. Call with NO ids to get the ad account itself (name, currency, status, review state) plus its campaigns; with campaignId to list that campaign’s ad groups; with adGroupId to list that ad group’s ads, including each ad’s REVIEW status, which is what decides whether it can ever show. Statuses here are active / paused / archived. Read-only, free, zero spend risk. Needs ChatGPT Ads connected (Settings ▸ Connectors ▸ ChatGPT Ads): the user pastes an Advertiser API key from ChatGPT Ads Manager ▸ Settings — there is no OAuth and no manager account, and one key is scoped to one ad account.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNopagination cursor from a previous page
limitNopage size, default 100
adGroupIdNolist this ad group’s ads
campaignIdNolist this campaign’s ad groups

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
adsNo
countNo
levelNo
accountNo
hasMoreNo
adGroupsNo
campaignsNo
Behavior5/5

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

The description adds substantial behavioral context beyond the readOnlyHint annotation: it is free, has zero spend risk, reveals the review status significance, explains the one-key-per-account scoping, and clarifies there is no OAuth. These details help the agent understand side effects and prerequisites, going well beyond the annotations.

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

Conciseness4/5

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

The description is dense but every sentence adds useful information: usage modes, status meanings, read-only safety, and connection prerequisites. It is slightly long, but the structure is logical and front-loaded with the primary purpose, making it easy to scan for the most relevant details.

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 multi-level hierarchy and connection requirements, the description covers all essential aspects: what each call returns, the meaning of review status, available statuses, safety profile, and setup steps. The presence of an output schema means return-value details are not needed, and the description fully covers operational context.

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 schema already documents each parameter with descriptions (100% coverage), so the baseline is 3. The description adds value by explaining the no-IDs case for fetching the account itself and by framing the parameter hierarchy (campaignId → ad groups, adGroupId → ads), which reinforces and extends the schema descriptions.

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

Purpose5/5

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

The description clearly states the tool reads the brand's connected ChatGPT Ads account and lists campaigns, ad groups, and ads based on the IDs provided. It specifies the exact resource hierarchy (account → campaigns → ad groups → ads) and distinguishes it from sibling tools by naming the ChatGPT Ads context and read-only nature.

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 usage instructions: call with no IDs to get the account and campaigns, with campaignId to get ad groups, and with adGroupId to get ads. It explicitly notes the tool is read-only and requires ChatGPT Ads to be connected, but it does not name alternative tools or explicitly state when not to use it.

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

list_openai_ads_conversion_eventsList ChatGPT Ads conversion eventsA
Read-only
Inspect

List the conversion event settings on the connected ChatGPT Ads account. Their ids are what a campaign points at (conversionEventSettingIds) so it optimises for CONVERSIONS rather than raw clicks — without one, conversion-optimised bidding has nothing to optimise toward. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
eventsNo
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only, free,' adding cost information. It also explains the role of conversionEventSettingIds, offering useful context beyond the annotations, though it doesn't cover pagination or limit behavior.

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 three sentences, with the main purpose front-loaded. The second sentence provides useful explanatory context about conversionEventSettingIds, which is relevant but could be trimmed. Overall, it is reasonably concise and well-structured.

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 list tool with an output schema and annotations, the description provides necessary context about purpose and significance. However, it omits any explanation of the 'limit' parameter, leaving a notable gap in completeness.

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

Parameters1/5

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

The sole parameter 'limit' is undocumented in both the schema and the description, with schema description coverage at 0%. The description does not mention the parameter at all, leaving the agent without any semantic guidance for a required (though optional) input.

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

Purpose5/5

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

The description clearly states the tool lists conversion event settings on the connected ChatGPT Ads account, using a specific verb and resource. It distinguishes itself from sibling list tools by focusing exclusively on conversion events, not audiences or campaigns.

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 explains the significance of conversionEventSettingIds for conversion-optimised bidding, providing clear context for when to use this tool. It doesn't explicitly mention alternatives, but the context implies its role in retrieving IDs needed for campaign setup.

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

list_pinterest_ads_campaignsList Pinterest ad accounts / campaignsA
Read-only
Inspect

Read the brand’s connected Pinterest AD account(s). Call with NO adAccountId to list the ad accounts shared with this brand — do this first to pick a target. Call WITH adAccountId to list that account’s campaigns (id, name, status, objective, budget, and Pinterest’s own summary status). Add campaignId to get that ONE campaign’s whole tree — its AD GROUPS and ADS with their ids, statuses and review status. That is the only way to enumerate them, and it matters: Pinterest has no delete, so an ad group you cannot see is one you cannot even archive. All money is in the AD ACCOUNT’S currency, which is not necessarily dollars. Pinterest’s own list default hides DRAFT and ARCHIVED objects; this asks for all four statuses so nothing is silently missing. Read-only, free. Needs Pinterest connected (Settings ▸ Connectors ▸ Pinterest) and the ad account ticked under Manage accounts.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusesNo
campaignIdNoone campaign → its ad groups and ads too (the only way to enumerate them)
adAccountIdNoPinterest ad account id — omit to list the ad accounts shared with this brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
adsNo
noteNo
countNo
accountsNo
adGroupsNo
currencyNo
campaignsNo
adAccountIdNo
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses critical behaviors: Pinterest has no delete, the default API hides DRAFT/ARCHIVED objects, this call explicitly requests all statuses, and currency is not necessarily dollars. It also notes connector and manage-account requirements and confirms the operation is read-only and 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?

Every sentence earns its place: mode selection, rationale for the campaign tree, status/currency warnings, and prerequisites. It is front-loaded with the core purpose and organized clearly around the three parameter-driven use cases, despite being a single paragraph.

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?

The description covers prerequisites, invocation sequences, status coverage, currency, and Pinterest-specific limitations. With an output schema present for return values, no significant operational gaps remain for safe and correct tool invocation.

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

Parameters5/5

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

The description adds real meaning to every parameter: adAccountId controls whether accounts or campaigns are listed, campaignId unpacks the entire ad group/ad tree, and statuses are requested explicitly to avoid silent omissions. This goes well beyond the schema's basic property descriptions and enum.

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 'Read the brand's connected Pinterest AD account(s)' and explicitly explains the three listing modes (ad accounts, campaigns, campaign tree). This clearly distinguishes it from sibling ad tools for other platforms and from Pinterest reporting tools.

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 explicit step-by-step guidance: call without adAccountId first to list accounts, then with it for campaigns, and with campaignId for the full tree. It also explains prerequisites and status behavior, but it does not name alternative tools to use instead for analytics or metrics.

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

list_pinterest_boardsList Pinterest boardsA
Read-only
Inspect

List the boards on the user’s connected Pinterest account — id, name, privacy and pin count. ALWAYS call this before post_to_pinterest and let the USER pick: Pinterest requires a board and Hermoso never chooses one for them. Read-only, 0 credits. Needs Pinterest connected (Settings ▸ Connectors ▸ Pinterest).

ParametersJSON Schema
NameRequiredDescriptionDefault
privacyNofilter by board privacy; default is everything the connection can see

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
boardsNo
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint. The description adds valuable context: 'Read-only, 0 credits' (cost), 'Needs Pinterest connected' (prerequisite), and the policy that Hermoso never chooses a board for the user. This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

Three sentences, each earning its place: the first states the tool's core function, the second gives a critical usage directive, and the third covers cost and prerequisites. No redundant or filler 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?

For a simple list tool with one optional parameter and an output schema, the description covers the purpose, usage context, prerequisites, and read-only nature. The output schema handles return details, so nothing essential 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?

The only parameter 'privacy' is fully documented in the input schema with its enum and default behavior ('filter by board privacy; default is everything the connection can see'), giving 100% schema_description_coverage. The tool description does not add extra parameter meaning, so the baseline score of 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 clearly states the action ('List the boards'), the resource ('user’s connected Pinterest account'), and the returned fields ('id, name, privacy and pin count'). It distinguishes itself from siblings like post_to_pinterest and create_pinterest_board by focusing on listing existing boards.

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?

The description explicitly says 'ALWAYS call this before post_to_pinterest and let the USER pick', explaining the reason ('Pinterest requires a board and Hermoso never chooses one for them'). It also notes the prerequisite of a connected Pinterest account, giving clear when-to-use guidance.

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

list_pinterest_pinsList Pins on a Pinterest boardA
Read-only
Inspect

The Pins on one of the account’s boards — or, with no boardId, the account’s own Pins across all of them. Each row carries the Pin id, title, description, destination link, alt text, board, creation date, and whether it HAS BEEN PROMOTED in an ad. THIS IS WHERE THE pinId EVERY OTHER PIN TOOL NEEDS COMES FROM: post_to_pinterest returns an id only at the instant it pins, so an agent that did not itself just pin had no way to name a Pin. Prefer passing a boardId — Pinterest’s own spec warns the account-wide listing has known timeouts. Read-only, 0 credits. Needs Pinterest connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo1–100, default 25
cursorNothe cursor a previous call returned
boardIdNonumeric board id from list_pinterest_boards — omit for the account’s own Pins across all boards

Output Schema

ParametersJSON Schema
NameRequiredDescription
pinsNo
countNo
cursorNo
boardIdNo
Behavior5/5

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

Annotations already declare readOnlyHint, and the description reinforces it with 'Read-only, 0 credits.' It adds the Pinterest spec timeout warning, the distinction between board-scoped and account-wide queries, and the role as source for pinIds used by other tools. 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.

Conciseness5/5

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

The description is front-loaded with the core definition, then provides output fields, cross-tool context, usage guidance, and cost/prerequisite in a logical order. Each sentence carries unique information; no fluff.

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 purpose, modes, output fields, pinId relevance, timeout caveat, read-only nature, credit cost, and connection prerequisite. With output schema present, no return structure explanation is needed; the description fully equips an agent to select and invoke the tool.

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

Parameters3/5

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

Schema coverage is 100% and each parameter has a clear description (limit, cursor, boardId). The description adds little beyond the schema, only repeating the boardId omission behavior and preference.

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

Purpose5/5

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

The description clearly states the tool lists Pins from a board or account-wide, distinguishes the two modes, and enumerates the row fields. It differentiates from siblings like list_pinterest_boards and post_to_pinterest by positioning itself as the canonical pinId source.

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 recommends passing a boardId, warns about account-wide timeouts, and explains when to use this tool (when an agent needs pinIds for other pin tools). It also notes the prerequisite 'Needs Pinterest connected' and contrasts with post_to_pinterest.

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

list_playbooksList playbooksA
Read-only
Inspect

List the PLAYBOOKS saved in this workspace — the reusable strategy cards (winning hooks, angles, formats and the concrete plays to run) kept from teardowns, angle mining and creatives worth repeating. The same Playbooks the web app's Playbooks tab lists. Read one before planning an ad so you re-run what already worked instead of starting cold. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNotrue to return every hook/angle/play in the text, not just the headline counts
limitNomax playbooks to return (default 25, max 100)

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNo
playbooksNo
Behavior4/5

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

The description goes beyond the readOnlyHint annotation by adding 'free' (a cost guarantee) and explicitly scoping to 'this workspace.' It also clarifies these are the stored strategy cards kept from teardowns/mining. The read-only nature is repeated, but additional context about cost and workspace scope adds value beyond annotations.

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

Conciseness4/5

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

The description is four sentences, each serving a purpose: definition, web-app equivalence, usage advice, and safety/cost note. It is somewhat verbose but front-loaded with the key action and remains scannable. Minor redundancy ('Read-only' mirrors annotation) prevents a 5.

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 simple list tool with two optional parameters and an output schema, the description is complete: it explains the resource, why it matters, when to use it, and its safety profile. No crucial context is missing, and the output schema covers return shape.

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 schema already documents 'full' and 'limit' with detailed descriptions. The tool description adds context about what playbooks are (hooks, angles, plays), but does not add new parameter-specific semantics beyond what the schema already provides. Baseline of 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb-object pair, 'List the PLAYBOOKS saved in this workspace,' and then defines playbooks concretely as 'reusable strategy cards (winning hooks, angles, formats and the concrete plays to run).' It also ties them to a familiar UI element ('same Playbooks the web app's Playbooks tab lists'), making the purpose unmistakable and distinct from sibling list tools.

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 a clear 'when to use' instruction: 'Read one before planning an ad so you re-run what already worked instead of starting cold.' This provides strong contextual guidance and implies the tool should be used during ad planning, but it does not explicitly name alternatives or exclusions, so it falls short of a 5.

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

list_product_photosList product photosA
Read-only
Inspect

List the product photos ALREADY saved in your workspace — the brand's product library plus any app-store screens (also surfaces photos locked in your OTHER creations, since a set product lands in the shared library). FREE — returns each photo's url + label. Call it before set_product_image to see the existing photos you can reuse. Reads YOUR saved brand (pass brandId to target a specific brand — that switches this key's active brand like use_brand).

ParametersJSON Schema
NameRequiredDescriptionDefault
brandIdNoa brand id/name from list_brands whose product library to list; omit to use the active brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
photosNothe saved photos ({url, label, …})
summaryNoa readable rundown of the saved product photos
Behavior5/5

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

Beyond the readOnlyHint=true annotation, the description discloses that the tool is FREE, returns URL+label, surfaces photos from other creations, and switches the active brand when brandId is provided. These are non-obvious behavioral traits that enrich understanding and prevent surprises.

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 dense sentences, front-loaded with the core purpose, then key details. Every clause adds value (free, side effect, usage with set_product_image). No filler or repetition.

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?

Despite having an output schema, the description still mentions return contents (url + label). It covers cost, side effects, and usage context. For a simple list tool with one optional parameter, this is fully complete.

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% for brandId, so the baseline is 3. The description adds valuable context: brandId accepts names from list_brands and has the side effect of switching the active brand, which is not in the schema. This goes beyond the schema without over-explaining.

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

Purpose5/5

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

The description clearly states the tool lists product photos already saved in the workspace, distinguishing it from broader list tools like list_library. It specifies the scope (brand's product library plus app-store screens) and explicitly relates to set_product_image, making its purpose 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?

It provides direct usage guidance: 'Call it before set_product_image to see the existing photos you can reuse.' It also clarifies when to pass brandId and notes the side effect of switching the active brand, giving clear context for when and how to use the tool.

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

list_published_postsList what this brand has publishedA
Read-only
Inspect

List every post Hermoso has recorded publishing for this brand — channel, permalink, caption, format, the HOOK and SUBJECT it was written to, and its measured engagement. This is the brand's own publishing history across all nine channels in one place, and it is the memory that makes 'which hook worked?' answerable at all. Each row says how it was recorded: 'captured' (written at publish time — the hook is what the author actually intended) or 'backfilled' (reconstructed from the platform afterwards, where the hook is only known if the post matched a Hermoso creation). A dash for engagement means the platform reported no number — that is NOT zero engagement. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax posts (default 50, max 200), newest first
channelNofilter to one channel: facebook, instagram, threads, x, linkedin, youtube, tiktok, reddit, pinterest, google_business

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsNo
totalNo
windowsNo
Behavior5/5

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

Even though readOnlyHint=true already signals a safe read, the description adds substantial behavioral detail: rows are either 'captured' or 'backfilled,' explaining how the hook data came to be, and it explicitly warns that a dash for engagement means no reported number, not zero. It also states the operation is read-only and costs 0 credits, going beyond the annotation.

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

Conciseness5/5

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

The description is front-loaded with the primary function and return fields, and every subsequent sentence adds a meaningful nuance (data provenance, dash semantics, read-only/credit cost). It is compact for the amount of context it delivers and does not repeat schema details verbatim.

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 description is mostly complete for a read-only list tool with an output schema and fully documented parameters, covering scope and data semantics. One minor gap is that it says 'all nine channels' while the schema lists ten channel options, and it does not mention pagination beyond the limit parameter; this is a slight inaccuracy rather than a major omission.

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?

The input schema already covers both parameters with 100% description coverage (limit default/max/newest-first and channel enum). The description does not add additional parameter-level semantics, so the baseline of 3 is appropriate; it only broadly references the channels.

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 specific action and object: 'List every post Hermoso has recorded publishing for this brand' and enumerates the returned fields (channel, permalink, caption, format, HOOK/SUBJECT, engagement). It clearly differentiates this from channel-specific list tools like list_meta_posts by framing it as the brand's own publishing history across all channels.

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 provides a clear use case: it is 'the memory that makes which hook worked answerable,' so an agent can choose this tool when reasoning about historical posting performance. It does not explicitly name alternatives or when-not-to-use it, but the context is sufficient to guide selection.

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

list_reddit_ads_audiencesList Reddit custom audiencesA
Read-only
Inspect

List the CUSTOM AUDIENCES (uploaded customer lists) on a Reddit ad account, with each one’s match-size range and status. Reddit will not deliver to an audience under about 1,000 matched redditors, and the reply says which ones fall short — an audience that is too small silently reaches nobody rather than erroring. Use an id here as customAudienceIds in ad-group targeting to retarget it, or as excludedCustomAudienceIds to suppress existing customers from a prospecting campaign. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNofilter by name
limitNodefault 50, max 100
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
audiencesNo
adAccountIdNo
Behavior5/5

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

Even with readOnlyHint=true annotations, the description adds crucial non-obvious behavior: the ~1,000 matched redditor threshold and the silent failure mode ('an audience that is too small silently reaches nobody rather than erroring'). It also confirms 'Read-only, free,' adding value beyond annotations.

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

Conciseness5/5

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

Three dense, front-loaded sentences: clear purpose, then the critical threshold caveat, then usage. No filler; every sentence earns its place.

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?

The description covers purpose, key behavioral caveat, and downstream usage. An output schema exists, so return values need not be explained. It is complete for a read-only listing tool with annotations.

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% (name and limit have descriptions, adAccountId does not). The description does not explain input parameters directly, though it implies adAccountId by saying 'on a Reddit ad account.' It does describe how the output id is used, which adds some contextual meaning but not full compensation.

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 specific verb+resource: 'List the CUSTOM AUDIENCES (uploaded customer lists) on a Reddit ad account.' It distinguishes custom audiences from saved audiences and states the output includes match-size range and status, making it distinct from sibling tools like list_reddit_ads_saved_audiences.

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 provides clear usage context: 'Use an id here as customAudienceIds in ad-group targeting to retarget it, or as excludedCustomAudienceIds to suppress existing customers.' This gives actionable guidance, though it does not explicitly name alternatives or when-not-to-use, so it stops short of a 5.

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

list_reddit_ads_campaignsList Reddit ad accounts / campaignsA
Read-only
Inspect

Read the brand’s connected Reddit AD account(s). Call with NO adAccountId to list the ad accounts shared with this brand — do this first to pick a target. Call WITH adAccountId to read that account’s whole tree at once: campaigns, ad groups and ads, each with its configured status and Reddit’s own effective status (the effective one is what says whether it could actually serve — PENDING_APPROVAL, CAMPAIGN_PAUSED, REJECTED and so on). Read-only, free. Needs Reddit Ads connected (Settings ▸ Connectors ▸ Reddit Ads) and the ad account ticked under Manage accounts.

ParametersJSON Schema
NameRequiredDescriptionDefault
adAccountIdNoReddit ad account id (a2_…) — omit to list the ad accounts shared with this brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
adsNo
nameNo
accountsNo
adGroupsNo
campaignsNo
adAccountIdNo
Behavior5/5

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

The description goes well beyond the readOnlyHint and openWorldHint annotations by disclosing that the call reads the entire object tree, distinguishes between configured and effective statuses, and provides examples of effective statuses. It also notes the operation is free and requires specific connector setup, adding valuable behavioral context.

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

Conciseness4/5

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

The description is well-structured and front-loaded with the main purpose, then conditional guidance. It is efficient, but the initial typo ('A read') and the somewhat lengthy enumeration of statuses make it slightly less polished. Overall, every sentence serves a purpose, but minor verbosity and the typo keep it from a perfect 5.

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 has an output schema, the description does not need to explain return values in detail. It nevertheless covers the most important contextual aspects: prerequisites, conditional usage, the scope of data returned, and the meaning of effective status. This makes the description complete for an agent to correctly invoke the tool.

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

Parameters5/5

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

The description thoroughly explains the only parameter adAccountId, including the exact format ('a2_…') and the behavior when omitted vs. provided. The schema description is also present, but the tool description adds practical semantics like 'do this first to pick a target' and the tree-reading behavior, significantly enhancing the schema's basic definition.

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

Purpose5/5

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

The description clearly states the tool reads Reddit ad accounts/campaigns with a specific verb ('Read') and resource ('Reddit AD account(s)'). It distinguishes from siblings by explaining its dual behavior: listing accounts without an ID and reading the full tree with an ID. This makes the tool's purpose unambiguous and well-scoped.

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?

Usage guidance is explicit: 'Call with NO adAccountId to list the ad accounts shared with this brand — do this first to pick a target. Call WITH adAccountId to read that account’s whole tree at once.' This provides clear when-to-use instructions and a recommended workflow. It also states prerequisites (Reddit Ads connected, account ticked) which helps the agent determine readiness.

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

list_reddit_ads_lead_formsList Reddit lead generation formsA
Read-only
Inspect

List the lead generation forms on a Reddit ad account, with the fields each one asks for. Reddit publishes NO endpoint for reading the leads a form has collected — the user downloads those from Reddit’s Ads Manager. Say that plainly if asked for the leads themselves; do not imply they can be fetched. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNodefault 50, max 100
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
formsNo
adAccountIdNo
Behavior5/5

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

Beyond the readOnlyHint annotation, the description adds critical behavior: it discloses the API limitation about lead data and instructs the agent how to respond to lead-fetch requests. This is valuable context that prevents misleading the user. The 'Read-only, free' note further aligns 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.

Conciseness5/5

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

Three sentences with front-loaded purpose, followed by a crucial caveat and a clear instruction. No wasted words; every sentence adds necessary 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 simple listing tool with an output schema available, the description covers its purpose, the main limitation, and expected agent behavior. The optional parameters are straightforward, and the output schema handles return-value details.

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 50% (limit is described, adAccountId is not). The description's phrase 'on a Reddit ad account' implies adAccountId is the account selector, but it adds no details about the limit parameter or how to obtain the account ID. It provides only minimal compensation for the schema gap.

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

Purpose5/5

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

The description clearly states the tool lists lead generation forms on a Reddit ad account, adding that it includes the fields each form asks for. This specific verb-resource pairing distinguishes it from sibling list_reddit_ads_* tools.

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 provides explicit when-not guidance: Reddit has no endpoint for reading collected leads, and the user must download them from Ads Manager. It tells the agent to say this plainly and not imply leads can be fetched. It does not name sibling tools as alternatives, but it clearly scopes when this tool should not be used.

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

list_reddit_ads_pixelsList Reddit conversion pixels (and whether they are firing)A
Read-only
Inspect

List the conversion pixels on a Reddit ad account, each with the LAST TIME IT FIRED — which is the difference between "a pixel exists" and "conversion tracking works". Call this before building anything: since 13 July 2026 Reddit REQUIRES a pixel on every ad group and every CBO campaign, so an account with none cannot run ads at all. IMPORTANT: the Reddit API has no operation that creates a pixel — if the account has none, the only fix is for the user to add it in Reddit’s Events Manager (ads.reddit.com ▸ Events Manager); never claim you can create one. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
adAccountIdNoReddit ad account id (a2_…) — omit when only one is shared

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
pixelsNo
adAccountIdNo
Behavior5/5

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

Annotations already provide readOnlyHint=true and openWorldHint=true, and the description adds 'Read-only, free' for clarity. More importantly, it discloses the critical limitation that the Reddit API has no pixel-creation operation and that the only fix is manual user action in Events Manager — context far beyond what annotations or schema convey. No contradiction exists.

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 front-loaded with the core action and key output ('LAST TIME IT FIRED'), then adds necessary context and a critical caveat. Each sentence earns its place: why it matters, the policy deadline, the manual workaround, and a cost/safety note. It is dense but not bloated.

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 simple 1-parameter schema and an output schema present, the description delivers the missing business context: the pixel requirement, the inability to create via API, and the user-side fix. It is complete for both selecting and invoking 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?

The schema covers 100% of the single optional parameter with a helpful description ('Reddit ad account id (a2_…) — omit when only one is shared'). The tool description adds no additional parameter detail, so the baseline of 3 for high schema coverage 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 uses a specific verb ('List') and resource ('conversion pixels on a Reddit ad account') and highlights the distinctive value: 'each with the LAST TIME IT FIRED'. This clearly separates it from sibling list_reddit_ads_* tools by focusing on a unique resource and the key diagnostic insight.

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 explicitly instructs 'Call this before building anything' and explains why — Reddit REQUIRES a pixel on every ad group and CBO campaign since 13 July 2026 — so an account with none cannot run ads. It also warns that no API operation creates pixels, telling the agent to direct the user to Events Manager instead of claiming it can create one. This gives strong when-to-use and when-not-to-attempt guidance.

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

list_reddit_ads_postsList a Reddit profile’s ad postsA
Read-only
Inspect

List the POSTS on a Reddit profile — these are the creatives Reddit ads promote. Use it to find an existing post to advertise rather than creating a near-duplicate. Call list_reddit_ads_profiles first for redditProfileId. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNo
adAccountIdNo
redditProfileIdYesthe Reddit profile id (t2_…) from list_reddit_ads_profiles

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
postsNo
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, and the description reinforces this with 'Read-only.' It adds new behavioral context by stating it's 'free' and requiring a preceding call for redditProfileId. However, it doesn't disclose details like pagination behavior, which is slightly beyond the annotation coverage.

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 sentences long, front-loaded with the primary action ('List the POSTS'), and every sentence carries meaningful information. The inclusion of 'Read-only, free' is brief and reinforces the annotations without bloating the text.

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 return format is documented externally. Annotations cover the read-only nature. The description provides the essential purpose, use case, and prerequisite. The main gap is the lack of explanation for optional parameters, making the overall description slightly incomplete for a tool with this many moving parts.

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?

Schema description coverage is only 25%, with only redditProfileId having a description. The description adds value by explaining where redditProfileId comes from, but completely ignores the other three parameters (type, limit, adAccountId), leaving their semantics unclear. Given the low coverage, more compensation was needed.

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

Purpose5/5

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

The description clearly states the action ('List the POSTS on a Reddit profile') and the resource's purpose ('these are the creatives Reddit ads promote'). It distinguishes itself from sibling tools like list_reddit_ads_profiles by explicitly focusing on posts, making it unambiguous.

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 provides a concrete use case: 'find an existing post to advertise rather than creating a near-duplicate.' It also gives a clear prerequisite with an alternative call: 'Call list_reddit_ads_profiles first for redditProfileId,' which guides the agent on the correct sequence and tool selection.

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

list_reddit_ads_profilesList the Reddit profiles an ad account can publish asA
Read-only
Inspect

List the Reddit PROFILES attached to an ad account. A Reddit ad promotes a POST, and every post is published AS one of these profiles — so this is the first call in any Reddit creative build, and its id is what create_reddit_ads_post needs. If it comes back empty, the ad account has no profile attached and nothing can be advertised from it yet. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
profilesNo
adAccountIdNo
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint. The description adds behavioral nuance: an empty result means no profile is attached and nothing can be advertised, and the ID is required for post creation. This goes beyond the annotations without contradicting them.

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

Conciseness4/5

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

Four sentences, front-loaded with the core purpose, then important context about the workflow and empty results. Every sentence adds value, though 'Read-only, free' partially repeats annotation info.

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 details are provided there. The description supplies workflow context, dependency information, and empty-result semantics. For a simple list operation with one parameter, this is sufficient.

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?

Schema description coverage is 0%; the description does not explain adAccountId or where to find it. The parameter name is somewhat self-explanatory, but the description does not compensate for the missing schema coverage, nor does it address why the parameter is not required.

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 'List the Reddit PROFILES attached to an ad account' with a clear verb, resource, and scope. It distinguishes itself from sibling tools by positioning this as the first call in any Reddit creative build and explicitly connecting its id to create_reddit_ads_post.

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 explicit when-to-use context: 'first call in any Reddit creative build' and 'its id is what create_reddit_ads_post needs.' It also explains the meaning of an empty result. However, it does not name alternative tools or when-not conditions, so it doesn't reach a full 5.

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

list_reddit_ads_saved_audiencesList Reddit saved audiencesA
Read-only
Inspect

List the SAVED AUDIENCES on a Reddit ad account — named, reusable targeting definitions (communities, interests, geos, devices and so on) that an ad group can point at instead of repeating the whole block. The reply says how many live ad groups each one is attached to, which is what makes editing one a decision rather than a formality. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNodefault 50, max 100
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
adAccountIdNo
savedAudiencesNo
Behavior4/5

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

The description discloses a specific behavioral trait: the reply includes the number of live ad groups each audience is attached to, which is useful context beyond the readOnlyHint. It also reiterates 'Read-only, free,' confirming safety, but adds value by explaining the output's decision-relevant content.

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 three sentences, front-loaded with the main action, and each sentence adds value: what it lists, why saved audiences matter, and the key output detail. No fluff or redundancy.

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 list operation with an output schema and read-only annotations, the description covers the purpose, the nature of the resource, and a key output detail. It does not explicitly address pagination or the adAccountId parameter, but the output schema and simple parameter list reduce the need for more.

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 description does not explain the parameters. The schema covers 'limit' with default and max, but 'adAccountId' lacks description, and the description only vaguely references 'a Reddit ad account.' With 50% schema coverage, the description should compensate but does not add meaningful parameter semantics.

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

Purpose5/5

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

The description clearly states the action: 'List the SAVED AUDIENCES on a Reddit ad account.' It distinguishes from regular audiences by capitalizing 'SAVED' and explains the concept of saved audiences, making the tool's purpose unambiguous and differentiated from sibling tools like list_reddit_ads_audiences.

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 provides clear context by explaining that saved audiences are reusable targeting definitions and that the reply shows how many live ad groups each is attached to, implying it is used before editing an audience. However, it does not explicitly mention when not to use it or name alternatives, so it falls slightly short of a 5.

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

list_reddit_commentsComments on a Reddit postA
Read-only
Inspect

Read the comments under one of the connected account’s Reddit posts — author, text, score, whether it is the poster’s own reply, and when. On Reddit the thread IS the value of a post, and this is where the questions, objections and exact customer wording live: the same raw material for ad copy that list_meta_comments and list_youtube_comments give you on the other channels, from the audience that argues back hardest. Each row carries the fullname to pass to reply_to_reddit_comment. Read-only, 0 credits. Needs Reddit connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNodefault top
limitNo1–100, default 25
postIdYesthe post id, its t3_… fullname, or the permalink

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
titleNo
totalNo
postIdNo
commentsNo
subredditNo
Behavior5/5

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

Beyond the annotations (readOnlyHint, openWorldHint), the description adds valuable behavioral context: 'Read-only, 0 credits' (cost), 'Needs Reddit connected' (auth requirement), and the detail that each row carries a fullname for passing to reply_to_reddit_comment. These are meaningful disclosures that go beyond what annotations alone provide.

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 four sentences, each earning its place: functionality, motivational context, integration, and prerequisites. It is slightly more verbose than strictly necessary, but the structure is logical and front-loads the core action. Minor redundancy in the last sentence ('Read-only, 0 credits') could be trimmed without loss.

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 moderate complexity (3 params, output schema present, annotations available), the description is highly complete: it covers the output fields, the strategic value proposition, the integration with reply_to_reddit_comment, and operational prerequisites. The output schema handles return-value details, so the description adequately fills the remaining gaps.

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?

The input schema already provides 100% coverage with descriptions for all three parameters (postId, sort, limit). The description does not add parameter-specific syntax or formatting details; its main parameter-related addition is implying that the post must belong to the connected account, which is a slight constraint but not enough to elevate beyond the baseline for high schema coverage.

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 uses the specific verb 'Read' with a clear resource ('the comments under one of the connected account's Reddit posts') and enumerates the returned fields (author, text, score, whether it's the poster's own reply, when). It also explicitly differentiates itself from sibling tools list_meta_comments and list_youtube_comments by framing itself as the Reddit counterpart.

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?

The description gives explicit usage context: it points to the same raw material for ad copy as list_meta_comments and list_youtube_comments, but on Reddit, effectively saying 'use this for Reddit comments, those for other channels.' It also references reply_to_reddit_comment as the next step, and notes the prerequisite 'Needs Reddit connected.' This is strong when-to-use and alternative guidance.

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

list_reddit_postsThe connected Reddit account’s own postsA
Read-only
Inspect

The connected Reddit account’s OWN submissions — id, title, subreddit, score, comment count, whether the subreddit removed it, and whether its body can be edited at all. THIS IS WHERE THE postId EVERY OTHER REDDIT TOOL NEEDS COMES FROM: post_to_reddit returns an id only at the instant it publishes, so an agent that did not itself just post had no way to name a post and had to ask the user for a link. Read-only, 0 credits. Needs Reddit connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNodefault new
limitNo1–100, default 25
cursorNothe cursor a previous call returned

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
postsNo
cursorNo
usernameNo
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces this with 'Read-only, 0 credits'. It adds significant context beyond the annotations: that it returns only OWN submissions (not all posts), the specific fields returned, and the behavioral quirk of post_to_reddit's id handling. This extra information helps the agent understand the tool's role and limitations.

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 a bit verbose but each sentence provides essential information: the scope and fields, the critical postId sourcing context, and operational notes (read-only, cost, connection). The all-caps sentence is emphatic but arguably unnecessary; however, it conveys the core usage guideline effectively. Overall, while not minimal, it is well-structured and every sentence earns its place.

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 simple nature (3 optional params, output schema exists, annotations present), the description covers purpose, usage, prerequisites, cost, read-only behavior, and the critical relationship to other Reddit tools. It does not need to explain return values since an output schema exists. The description is fully adequate for an agent to select and 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?

The input schema covers all three parameters (sort, limit, cursor) with descriptions, yielding 100% coverage. The tool description does not need to add parameter details. However, it does not explicitly clarify how these parameters affect the listing beyond the schema, so a baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states this tool lists the connected Reddit account's OWN submissions, listing specific fields (id, title, subreddit, score, etc.), and explicitly distinguishes it from other Reddit tools by positioning it as the source of postId needed by other tools. This unambiguous verb+resource+scope fully differentiates it from siblings like search_reddit or list_reddit_comments.

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?

The description explicitly explains when to use this tool: it is where the postId for every other Reddit tool comes from, because post_to_reddit only returns an id at publish time. It also states prerequisites ('Needs Reddit connected') and cost/read-only nature. This provides clear context for selection over alternatives.

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

list_scheduledList scheduled and past postsA
Read-only
Inspect

Show what is queued to post and what already went out. Each fired item reports PER-CHANNEL outcomes, so you can see that (say) Instagram published and TikTok failed on the same item rather than a single misleading verdict. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
historyNo
scheduledNo
Behavior4/5

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

Annotations already indicate readOnlyHint and openWorldHint. The description adds meaningful behavioral context: it reports per-channel outcomes for fired items, preventing misleading single verdicts (e.g., Instagram published but TikTok failed). It also states 'Read-only, 0 credits,' reinforcing safety and cost implications. This exceeds what annotations alone provide without contradicting them.

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

Conciseness5/5

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

The description is two sentences long, with the main purpose stated in the first sentence. The second sentence gives a concrete, valuable example of per-channel reporting. No fluff or redundancy—every sentence contributes 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 read-only list tool with zero parameters and an existing output schema, the description covers everything needed: what it lists, the behavioral nuance about per-channel outcomes, and its safety/cost profile. It is fully complete for the tool's complexity and distinguishes it from similar sibling tools.

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 has zero parameters, and the schema coverage is 100%. With no parameters to document, the description carries no burden for parameter semantics. The absence of parameters means the baseline is 4, and the description does not need to add any parameter-related details.

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

Purpose5/5

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

The description clearly identifies the tool's function: showing queued and past posts. It uses a specific verb ('Show') and names the resource type ('scheduled and past posts'), which distinguishes it from related siblings like list_published_posts or schedule_post. The inclusion of per-channel outcomes adds precision about what the tool reveals.

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 provides clear context on what the tool does and when it would be relevant (checking queued and posted content). It also notes that it is read-only and costs 0 credits, which is useful guidance for safe usage. However, it does not explicitly mention when to prefer this over alternatives like list_published_posts or list_jobs, so it stops short of a 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.

list_sheet_tabsList the tabs in a Google SheetA
Read-only
Inspect

The tabs in a Google Spreadsheet, each with its name, numeric sheetId, row/column count and position. Call this BEFORE naming a tab in update_sheet / clear_sheet_range / manage_sheet_tabs / format_sheet, and before proposing to delete one — it is how you learn what the file actually contains instead of guessing at a name. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
sheetUrlNoa Google Sheets URL — the id is extracted from it
spreadsheetIdNothe spreadsheet id (from create_sheet, or list_drive_files for one the user picked)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
tabsNo
countNo
titleNo
spreadsheetIdNo
Behavior4/5

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

The description adds 'Read-only, free', reinforcing the readOnlyHint annotation and adding the free aspect. It also discloses the returned fields (name, sheetId, row/column count, position), which is useful behavioral detail beyond what annotations provide. 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.

Conciseness5/5

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

The description is three sentences, each earning its place: what is returned, when to call it, and its safety/cost profile. It is front-loaded and contains zero filler words.

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 simple read-only listing tool with a full output schema and perfect parameter schema coverage, the description covers the return contents, usage timing, and safety/cost. No significant gaps remain.

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%: both sheetUrl and spreadsheetId have descriptive comments. The description does not add any new parameter-level information beyond implying that the tool accepts a spreadsheet URL or ID, which the schema already states. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states exactly what the tool does: lists the tabs in a Google Spreadsheet with name, numeric sheetId, row/column count, and position. It distinguishes itself from siblings by referencing specific tools it supports (update_sheet, clear_sheet_range, manage_sheet_tabs, format_sheet), making the purpose and scope clear.

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?

The description explicitly states when to call this tool: 'BEFORE naming a tab in update_sheet / clear_sheet_range / manage_sheet_tabs / format_sheet, and before proposing to delete one.' It also explains the rationale ('it is how you learn what the file actually contains instead of guessing at a name'), giving clear usage context and exclusions.

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

list_skillsList skillsA
Read-only
Inspect

List the bundled Hermoso SKILLS — multi-step workflow instructions (SKILL.md) that orchestrate the other tools (research an ad space, plan+render a finished ad, product photoshoot, raw generation) — plus the in-app strategy skills and creative recipes. Call get_skill to load a bundle. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
inAppNoin-app strategy skills + creative recipes ({id, kind/group})
customNothe workspace’s own custom skills ({id, name, directive}) saved via save_skill
bundlesNobundled skills ({name, description}) loadable via get_skill
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only, free,' adding the extra detail that it is free. It also adds context about the skill categories and the relationship to get_skill, which goes beyond the annotation.

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

Conciseness5/5

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

The description is compact and front-loaded with the action ('List the bundled Hermoso SKILLS'). It uses parentheses effectively to clarify scope and each sentence adds value: definition, next-step, and safety/cost note.

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 zero-parameter read-only list tool with an output schema present, the description fully explains what is listed, the nature of skills, and the recommended follow-up tool. No critical gaps remain.

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 has zero parameters and schema coverage is 100%, so the description has no parameter burden. The baseline of 4 applies because no parameter documentation is needed.

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

Purpose5/5

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

The description clearly states the tool lists bundled Hermoso SKILLS and defines what they are (multi-step workflow instructions). It distinguishes itself from get_skill by explicitly directing users to call get_skill to load a bundle.

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 provides clear context about what the tool lists and explicitly names get_skill as the follow-up action for loading a bundle. It does not exhaustively list when-not-to-use scenarios, but the guidance is sufficient for a read-only list tool.

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

list_swipefileList the swipefileA
Read-only
Inspect

List this workspace's SWIPEFILE — the saved-ad research board: every named collection and the ads/creatives kept in it (advertiser, headline, body copy, media URL, platform, when it was saved, and any taste tags). The SAME board the web app's Swipefile tab shows. Use it to answer "what have we saved?", to mine the user's own taste before planning an ad, or to find a reference to remix. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax ads to return (default 50, max 500)
collectionNoonly list ads in this collection (by name or id) — omit for every collection

Output Schema

ParametersJSON Schema
NameRequiredDescription
adsNothe saved ads ({key, collection, advertiser, title, body, image, video, link, platform, savedAt, tags})
totalNohow many ads the board holds in total, before any collection filter or limit
collectionsNothe named collections ({id, name, ads} counts)
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false; the description adds 'Read-only, free' and confirms the tool is workspace-scoped and mirrors the same board as the web app's Swipefile tab. This adds useful context beyond the annotations, though it omits details like ordering or pagination, which are partially covered by the output schema.

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 front-loaded with 'List this workspace's SWIPEFILE' and uses three tight sentences to convey scope, contents, web-app parity, and use cases. There is no filler or redundant restatement of the name/title.

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 low complexity, the presence of an output schema, and full schema coverage for parameters, the description supplies sufficient context: purpose, board identity, content fields, workspace scoping, use cases, and a read-only/free note. An agent can confidently select and invoke 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?

The input schema already documents both parameters (limit and collection) with descriptions, achieving 100% schema description coverage. The tool description does not add parameter-level meaning beyond what the schema provides, so the baseline score of 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 uses a specific verb ('List') and a specific resource ('this workspace's SWIPEFILE'), identifies it as the 'saved-ad research board', and enumerates the fields returned. This clearly distinguishes it from the many sibling list_* and ad-research tools.

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 provides three concrete use cases: answering 'what have we saved?', mining the user's own taste before planning an ad, and finding a reference to remix. It does not explicitly state when not to use it or name alternatives, but the context is clear enough for selection.

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

list_teamList team membersA
Read-only
Inspect

List the members of the current brand workspace — email, role (admin/member) and status. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
membersNo
Behavior4/5

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

The description adds 'Read-only, free' beyond the annotations, reinforcing safety and adding cost context. It also mentions the output fields, which is useful behavioral information. No contradiction with readOnlyHint=true.

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, well-front-loaded sentence conveys all necessary information without fluff. Every word earns its place, including the read-only and free details.

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 simple, parameterless list tool with an output schema present, the description fully covers what the agent needs to know: what is listed, the fields returned, and the safety/cost profile. No gaps remain.

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?

This tool has zero parameters, so the baseline is 4. The description adds value by listing the fields returned (email, role, status), which helps the agent understand the output even though the schema is empty.

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

Purpose5/5

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

The description clearly states the tool lists members of the current brand workspace with specific fields (email, role, status). This specific verb+resource scope distinguishes it from sibling list tools like list_employees or list_connectors.

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 'current brand workspace' provides clear context for when to use this tool. It does not explicitly name alternatives or exclusions, but the scope is evident from the description and sibling tools like invite_member/remove_member.

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

list_threads_mentionsThreads mentions of the brandA
Read-only
Inspect

Posts where someone MENTIONED the brand on Threads — anywhere, not just under your own posts. This is brand listening: real objections, questions and the exact language customers use, which is strong raw material for ad copy and for mine_angles. Use list_threads_replies instead when you want the conversation under one specific post.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many mentions (1–50, default 25)

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
mentionsNo
usernameNo
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description doesn't need to restate safety. It adds behavioral context by clarifying the result scope ('anywhere, not just under your own posts') and the nature of the content ('real objections, questions and the exact language customers use'), which goes beyond structured 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?

The description is three sentences, each earning its place: the first defines the core function, the second explains the strategic value, and the third gives an explicit alternative. There is no redundancy or filler, and the key information is front-loaded.

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 simple list tool with one parameter, the description covers purpose, scope, usage context, and provides an alternative. The output schema exists, so return values are already documented. No critical selection or invocation details are 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?

The only parameter 'limit' is fully described in the schema ('how many mentions (1–50, default 25)'), and the description does not add any additional semantics for it. Since schema coverage is 100%, the baseline score of 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 clearly states the tool's function: 'Posts where someone MENTIONED the brand on Threads — anywhere, not just under your own posts.' This is a specific verb+resource+scope, and it explicitly distinguishes from sibling 'list_threads_replies' by contrasting 'anywhere' vs. 'conversation under one specific post.'

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 guidance is provided: 'Use list_threads_replies instead when you want the conversation under one specific post.' It also gives context for when to use this tool, such as for brand listening and as raw material for ad copy and mine_angles, which helps the agent decide between similar list/search tools.

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

list_threads_postsList your Threads postsA
Read-only
Inspect

List recent posts on the brand’s connected Threads account (id, text, media, permalink, timestamp). Use it to find a post id for threads_insights, list_threads_replies, reply_to_thread or delete_thread.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many posts (1–50, default 15)

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
postsNo
usernameNo
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the agent knows this is a safe read operation. The description adds context by listing returned fields and the account scope, but does not disclose further behavioral details such as pagination behavior, sorting order, or rate limits. This matches the expected bar given annotation coverage, providing some value but not rich behavioral context.

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

Conciseness5/5

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

Two concise sentences. The first sentence states the action and resource with key output fields; the second gives direct use cases. Every word earns its place, and the most important information is front-loaded.

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 simple tool with one optional parameter and an output schema, the description is complete. It conveys the purpose, the data returned, and the typical use case for downstream tools. No critical missing context for an agent to select and invoke 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%: the only parameter 'limit' is fully described (range and default). The description adds nothing new about parameters, so the schema carries the semantic weight. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's purpose: listing recent posts from a brand's connected Threads account. It lists the specific fields returned (id, text, media, permalink, timestamp) and distinguishes it from sibling tools like list_threads_replies by focusing on posts rather than replies.

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 explicitly states when to use the tool: to find a post ID for threads_insights, list_threads_replies, reply_to_thread, or delete_thread. It names specific dependent tools, providing strong contextual guidance. However, it does not explicitly comment on when not to use it or mention alternative listing tools, so it just misses the top score.

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

list_threads_repliesList replies on a Threads postA
Read-only
Inspect

Read the replies on a Threads post. Set conversation:true to walk the entire thread rather than only direct replies. Use before reply_to_thread so you answer with the actual conversation in view.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many replies (1–50, default 25)
postIdYespost id from list_threads_posts
conversationNotrue = the whole thread, not just direct replies

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
repliesNo
Behavior3/5

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

The readOnlyHint annotation already establishes this as a safe read operation. The description does not add significant behavioral disclosure beyond what the schema provides for the conversation parameter, nor does it mention rate limits or pagination. It is not contradictory to 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?

The description is three short sentences, front-loaded with the main action, and each subsequent sentence adds targeted value (parameter guidance and usage context). No filler or redundancy.

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 rich output schema and annotations, the description covers the core purpose, the pivotal parameter adjustment, and the workflow relation to reply_to_thread. It is complete for an agent to decide when to use and how to invoke.

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?

All three parameters are fully described in the JSON schema (100% coverage), including defaults and sources. The description's talk of 'conversation:true' mirrors the schema description without adding new semantics for limit or postId.

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 uses a specific verb+resource ('Read the replies on a Threads post') and clearly distinguishes this tool from siblings by introducing the conversation:true behavior and referencing reply_to_thread. It leaves no ambiguity about what the tool does.

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

Usage Guidelines5/5

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

It explicitly instructs the agent to use this tool 'before reply_to_thread' so the conversation is in view, and explains when to set conversation:true (to walk the entire thread vs. direct replies). This provides clear context for selection among siblings.

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

list_tiktok_videosList the connected account’s TikTok postsA
Read-only
Inspect

The connected account’s own TikTok posts with per-video stats — views, likes, comments, shares, duration, cover image and link. TWO WAYS TO ASK: with no arguments it lists the most recent (newest first, up to 20 a page); with videoIds it reads THOSE posts directly however old they are, which is how you answer "how did that specific video do" without paging back through the account. Any id TikTok does not return comes back under unresolved — meaning it is not on this account or no longer exists, which TikTok does not distinguish — never as a zero. Only ever the connected user’s OWN videos. ⚠️ TIKTOK OFFERS NO WAY TO DELETE OR EDIT A PUBLISHED POST through its API — not the caption, not the privacy level, not the comment/duet/stitch settings, not the cover. Every one of those is fixed at the moment of publishing. If the user wants a TikTok changed or taken down, tell them plainly that it has to be done in the TikTok app; do not look for a tool for it. Read-only, 0 credits. Needs TikTok connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo1-20, default 10 (ignored when videoIds is given)
videoIdsNoread these specific TikTok video ids instead of listing recent ones — up to 20 per call

Output Schema

ParametersJSON Schema
NameRequiredDescription
cursorNo
videosNo
hasMoreNo
unresolvedNo
Behavior5/5

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

Even with readOnlyHint and openWorldHint annotations, the description adds substantial context: the meaning of unresolved (not on account vs. no longer exists, never zero), pagination and ordering behavior, the interaction between params, and the critical limitation that TikTok's API offers no edit/delete. It also discloses 'Read-only, 0 credits' and auth requirement, going beyond the annotations.

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

Conciseness4/5

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

The description is longer than average but efficiently structured: main capability first, then usage modes, a caveat, and a critical warning. The all-caps warning is lengthy but prevents a common mistake of seeking edit/delete tools. Every sentence earns its place, though it could be slightly tightened.

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 output schema exists, the description needn't enumerate return fields. It covers all essential context: ownership scope, two invocation modes, unresolved semantics, auth requirement, credit cost, and the lack of edit/delete capabilities. No significant gaps for a read-only list 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?

The schema already provides descriptions for both parameters (100% coverage), but the tool description adds valuable usage semantics: limit is ignored when videoIds is given, videoIds enables fetching specific old posts without pagination, and unresolved handles IDs TikTok doesn't return. This enriches the schema with strategic context, though the schema itself is already thorough.

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

Purpose5/5

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

The description clearly states the tool lists the connected account's own TikTok posts with per-video stats, using specific verbs and resource scope. It distinguishes itself from siblings by emphasizing 'Only ever the connected user’s OWN videos' and contrasting with search-oriented tools.

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 provides clear context for when to use the tool, including two modes (no args vs. videoIds) and explicitly demonstrates how to answer 'how did that specific video do'. It also includes an exclusion: do not look for a tool to edit or delete TikTok posts. However, it doesn't explicitly name alternative tools for other uses, so it falls short of a 5.

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

list_x_ads_accountsList X ad accountsA
Read-only
Inspect

List the X (Twitter) ad accounts this brand can act on, with the PERMISSION LEVEL held on each so you can tell an admin grant from a read-only one before attempting a write. X grants API access PER AD ACCOUNT, not per app: the customer adds Hermoso’s X user to their ad account at business.x.com → Account access, and it appears here. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
accountsNo
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, which the description reinforces. Beyond that, it adds useful context: the tool returns permission levels, and access is per ad account (not per app), including setup steps. This adds meaningful behavioral information without contradicting 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?

The description is two sentences but every clause earns its place: it states purpose, highlights permission-level value, explains the access model, and notes it is free. It is front-loaded with the core action and resource.

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 zero-parameter list tool with an output schema, the description is complete. It provides essential context about X's per-ad-account access model and the permission levels returned, which is valuable for deciding when to call this tool. The output schema covers return format.

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?

There are zero parameters, so the baseline is 4. The description adds no parameter-specific details, but none are needed since the input schema is empty. It does not need to compensate for schema gaps.

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

Purpose5/5

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

The description clearly states the tool lists X (Twitter) ad accounts with permission levels, distinguishing it from sibling tools like list_x_ads_campaigns. It also states the specific resource ('ad accounts') and the value of knowing permission levels before writes.

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 provides implicit usage guidance by explaining that you can use this to distinguish admin grants from read-only access before attempting writes. It also explains the X-specific access model, but it does not explicitly name alternatives or state when not to use it.

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

list_x_ads_campaignsList X ads campaignsA
Read-only
Inspect

List campaigns on an X ad account — status, budgets, and whether X considers each servable. Omit accountId when only one account is reachable and it resolves itself. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
accountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
accountIdNo
campaignsNo
Behavior4/5

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

Annotations already include readOnlyHint and openWorldHint. The description adds context beyond these by noting the tool is 'Read-only, free' and that it returns servability status. It also explains account auto-resolution behavior, which is useful behavioral insight without contradicting 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?

The description is two sentences, front-loaded with purpose and followed by a brief usage tip. No redundant wording; every clause adds 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?

For a list operation with an output schema and readOnly annotations, the description covers key aspects: purpose, returned fields, a parameter caveat, and cost implications. It lacks detail on limit semantics and pagination, but these are secondary given the output schema.

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?

Schema description coverage is 0%, so the description must compensate for parameter meanings. It explains accountId indirectly via the 'omit accountId' note, but limit is never mentioned or contextualized. The output content (status, budgets, servability) is described but not mapped to 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 clearly states the tool's function: 'List campaigns on an X ad account — status, budgets, and whether X considers each servable.' The verb 'List' and specific resource (X ads campaigns) distinguish it from sibling list tools for other platforms (e.g., list_google_ads_campaigns, list_linkedin_ads_campaigns).

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 provides a specific usage instruction: 'Omit accountId when only one account is reachable and it resolves itself,' which clarifies parameter usage. It does not explicitly mention alternatives or when-not-to-use, but the platform-specific scope gives clear context.

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

list_x_ads_funding_instrumentsList X ad account payment methodsA
Read-only
Inspect

List the funding instruments (payment methods) on an X ad account — type, currency, credit limit, credit remaining, and whether each can currently fund a campaign. THIS IS THE ANSWER TO “why is my X campaign not delivering?” whenever the cause is a cancelled card or an exhausted credit line, which is invisible from the campaign itself, and it shows what a campaign will spend against BEFORE anyone activates it. Hermoso cannot add a payment method — that is done at ads.x.com. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
accountIdNo
usableCountNo
fundingInstrumentsNo
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=true, and the description reinforces 'Read-only, free.' It adds significant behavioral context: the diagnostic purpose, that it reflects pre-activation spend capability, and the limitation that payment methods cannot be added through Hermoso. 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?

The description is front-loaded with the core purpose in the first sentence, followed by usage context and limitations. The all-caps sentence 'THIS IS THE ANSWER...' is attention-grabbing but slightly verbose. Overall, each sentence adds value, though it could be tightened.

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 simple single-parameter tool with an output schema and good annotations, the description is complete. It covers what is returned, when to use it, the diagnostic scenario, the inability to add payment methods, and the read-only/free nature. No significant gaps remain.

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?

The schema has one required param, accountId, with no schema description (0% coverage). The description does not explicitly explain the accountId format or source, but it says 'on an X ad account,' which implies accountId identifies that account. This is implicit rather than explicit, so it only partially compensates for the lack of schema description.

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

Purpose5/5

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

The description clearly states the tool lists funding instruments on an X ad account and specifies the exact fields returned (type, currency, credit limit, credit remaining, campaign-funding eligibility). This distinguishes it from sibling tools that list campaigns, line items, or accounts.

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?

The description explicitly identifies when to use this tool: as the answer to why an X campaign is not delivering when caused by a cancelled card or exhausted credit line. It also gives an exclusion — Hermoso cannot add a payment method, directing that to ads.x.com. This is clear when-to-use guidance with alternatives mentioned.

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

list_x_ads_line_itemsList X ads line itemsA
Read-only
Inspect

List the line items on an X ad account — X's name for an ad group, and the level that carries the objective, the placements, the bid, the targeting and the creatives. Pass campaignId to scope it to one campaign. servable is X's own verdict on whether the line item could run. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
accountIdYesfrom list_x_ads_accounts
campaignIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
accountIdNo
lineItemsNo
Behavior4/5

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

With annotations already declaring readOnlyHint=true and openWorldHint=true, the description adds valuable context beyond structured data: it explains that 'servable' is X's own verdict on whether the line item could run. It reinforces read-only/free status. 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.

Conciseness5/5

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

Three tight sentences front-load the action, then provide a clarifying analogy, scoping instruction, and a field explanation. Every sentence earns its place with no filler or redundancy.

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 output schema exists and annotations cover safety, the description supplies all necessary invocation context: what a line item is, how to scope by campaign, and a key field meaning. It is complete for an agent to select and 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 only 33%, so the description must compensate. It properly explains campaignId ('Pass campaignId to scope it to one campaign'), but limit remains undocumented in both schema and description. accountId has a schema description ('from list_x_ads_accounts') but no further explanation. The description adds some value but does not fully cover all parameter semantics.

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

Purpose5/5

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

The description clearly states the action ('List the line items on an X ad account') and the resource (line items), distinguishing it from sibling tools like create_x_ads_line_item and list_x_ads_campaigns. It also adds context that line items are X's ad groups carrying objective, placements, bid, targeting, and creatives, removing ambiguity.

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 provides clear context: it is read-only and free, and it instructs to pass campaignId to scope to one campaign. It does not explicitly name alternatives or exclusions, but the only close siblings (create/status/report) are clearly different operations, so the usage intent is well understood.

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

list_x_ads_promoted_tweetsList X promoted postsA
Read-only
Inspect

List the promoted posts (the CREATIVES) attached to an X line item, or across the whole ad account. Two things only this can tell you: each post's APPROVAL STATUS, so an ad X rejected — which can never serve however the statuses are set — is visible rather than mysterious; and the promoted-tweet ID, which is the only way to remove one. NOTE a promoted post cannot be PAUSED on X (its PUT accepts only an approval appeal), so the reversible way to stop it is to pause its LINE ITEM. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
accountIdYes
lineItemIdNoscope to one line item

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
accountIdNo
promotedTweetsNo
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds valuable context beyond this: it notes the operation is read-only and free, explains what the tool uniquely reveals, and discloses the limitation that promoted posts cannot be paused (PUT only accepts an approval appeal). This is genuine behavioral insight.

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 moderately long but every sentence carries unique information: purpose, unique outputs, and a critical caveat. It is front-loaded with the main action. Slightly conversational phrasing ('Two things only this can tell you') could be trimmed, but overall it is efficient and well-structured.

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 details are already covered. The description includes scope, unique value, and an operational caveat, making it sufficiently complete for a list tool. It does not mention pagination, but openWorldHint and output schema mitigate that concern.

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 only 33% (only lineItemId has a description). The description compensates by explaining the two scopes: line item or whole ad account, which maps to lineItemId and accountId. However, it does not elaborate on limit or accountId format, leaving some room for inference. Still, it adds meaning beyond the bare 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?

The description clearly states the tool lists promoted posts (creatives) on X, scoped to a line item or entire ad account. It uniquely identifies the two things only this tool can tell (approval status and promoted-tweet ID), distinguishing it from sibling tools like list_x_ads_line_items or set_x_ads_status.

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 implies when to use this tool: when you need approval status or the promoted-tweet ID for removal. It also provides an important guideline: since promoted posts cannot be paused on X, pause the line item instead. No alternative tool is explicitly named, but the context is clear.

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

list_x_ads_targetingList an X line item’s targetingA
Read-only
Inspect

List every targeting criterion an X line item carries, WITH THE ID of each — the id needed to remove one with delete_x_ads_object. READ THE EMPTY CASE CORRECTLY: no targeting criteria on X means the line item is UNRESTRICTED and will reach the broadest possible audience once ACTIVE — it does NOT mean it cannot serve. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYes
lineItemIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
accountIdNo
targetingNo
lineItemIdNo
Behavior4/5

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

The description explicitly states 'Read-only, free,' which aligns with readOnlyHint annotation. It goes beyond annotations by explaining the behavioral nuance of an empty targeting list, which is crucial for correct interpretation. This adds valuable context not conveyed by annotations alone. However, it does not detail the output structure or any other behavior, though an output schema exists.

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 compact, with two sentences that each add essential information. The first sentence states the primary purpose and the ID benefit; the second emphasizes a critical edge-case interpretation. There is no redundancy or padding, and the all-caps warning is justified for clarity.

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 output schema exists, the description sufficiently covers the tool's behavior and interpretation. It explains the read-only nature, the ID inclusion, and the empty-case implication, which are the key non-obvious aspects. The tool is simple (2 params, no nested objects), and the description is fully adequate for correct invocation and result interpretation.

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?

The schema has 0% description coverage for accountId and lineItemId, and the description does not explicitly define them. It mentions 'an X line item' which implicitly references lineItemId, but accountId is not addressed. This partial compensation is not sufficient for complete parameter understanding, though the tool name and context make them somewhat predictable.

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

Purpose5/5

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

The description clearly states the tool's purpose: list every targeting criterion for an X line item, including the ID of each, which is needed for removal via delete_x_ads_object. It also clarifies the empty-case semantics, distinguishing this from a simple list operation and preventing misinterpretation. This differentiates it from siblings like list_x_ads_line_items.

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 implies when to use the tool: when you need the targeting criteria and their IDs, particularly before removing a targeting criterion with delete_x_ads_object. It also provides a critical usage caveat about the empty case (unrestricted vs. cannot serve). However, it does not explicitly contrast with siblings or state when not to use it, leaving some room for interpretation.

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

list_youtube_commentsRead comments on one of your YouTube videosA
Read-only
Inspect

Read the comments under a video on the connected channel — the questions, objections and exact wording real viewers use. Same raw material for ad copy that list_meta_comments gives you on Meta. Returns author, text, like count, timestamp and reply count, newest first. Read-only, 0 credits. Needs a connected YouTube channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax comments, default 25, cap 100
videoIdYesthe YouTube video id

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
videoIdNo
commentsNo
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint, but the description adds valuable behavioral context: '0 credits', 'newest first' ordering, the exact list of returned fields (author, text, like count, timestamp, reply count), and the connection requirement. 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.

Conciseness5/5

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

Four sentences, each serving a distinct purpose: what it does, why you'd use it, what it returns, and key operational facts. Front-loaded with the core action, no redundancy or fluff.

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 list tool, the description covers purpose, use case, return format, ordering, cost, and prerequisites. The output schema exists, so return values are already specified. Minor gap: it doesn't point to how to obtain a videoId, but sibling tools like list_youtube_videos likely cover that.

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%: both 'limit' and 'videoId' have descriptive schema documentation. The description does not add param-specific detail beyond what the schema already states, so the baseline of 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 opens with a specific verb and resource: 'Read the comments under a video on the connected channel.' It distinguishes itself from siblings by referencing list_meta_comments as the Meta equivalent, making the platform and purpose unmistakable.

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 context for when to use it: to gather 'questions, objections and exact wording' for ad copy, and explicitly positions it as the YouTube counterpart to list_meta_comments. It also states a prerequisite ('Needs a connected YouTube channel'). It stops short of explicitly naming alternatives to avoid, but the use case is clear.

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

list_youtube_report_jobsList YouTube bulk reporting jobsA
Read-only
Inspect

The YouTube BULK reporting jobs running on this channel — which report each one generates, its report type id, and when it was scheduled. Call this to find out whether thumbnail-CTR history is already accumulating, and since when, BEFORE promising a user a number: the bulk API can only answer about days after a job existed. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobsNo
noteNo
countNo
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint. The description adds value by explaining a key behavioral trait: the bulk API can only answer about days after a job existed, and it reiterates read-only and 0 credits. This goes beyond the annotations by disclosing a limitation that affects interpretation of results.

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 the core purpose, then usage guidance and a critical limitation. Every sentence adds value without redundancy. The read-only note is brief and reinforces the annotation without noise.

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 simple, read-only list tool with an output schema, the description is complete: it explains what is listed, why an agent would need it (to check thumbnail-CTR accumulation before promising data), and a key limitation. The output schema handles return format details, so no additional description is needed.

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 has zero parameters, so the schema covers all parameters (vacuously). The description provides context about what the list contains (report generation, type id, schedule time) but does not need to explain parameter syntax. Baseline for 0 params is 4.

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

Purpose5/5

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

The description clearly states the tool lists YouTube bulk reporting jobs with specifics (which report, report type id, scheduled time) and scopes it to 'this channel'. This distinguishes it from siblings like list_jobs and delete_youtube_report_job, which have broader or different purposes.

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 explicit guidance on when to call it: to check whether thumbnail-CTR history is accumulating before promising a user a number. It also notes the API's temporal limitation. It lacks explicit exclusions or alternative tool names, but the context is clear enough for correct selection.

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

list_youtube_videosList the brand’s own YouTube uploadsA
Read-only
Inspect

List the connected channel’s OWN recent uploads — video id, title, publish date and privacy — so you can resolve a video WITHOUT asking the user for a link. Call this whenever the user names a video loosely ("my latest", "the shorts one", part of a title) and match it yourself; only ask them when two titles are genuinely ambiguous. This is the tool that gets you the videoId every other YouTube tool needs — youtube_channel returns counts only, and search_youtube searches the PUBLIC index, not your uploads. Includes UNLISTED and PRIVATE videos, which are invisible to any public search. Read-only, 0 credits. Needs a connected YouTube channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many recent uploads to return (default 25, max 50)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
videosNo
Behavior5/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds key context: includes UNLISTED and PRIVATE videos (invisible to public search), 'Read-only, 0 credits', and 'Needs a connected YouTube channel.' These are behavioral traits beyond the structured annotations, giving the agent a fuller understanding of what the tool does and its prerequisites.

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 concise and front-loaded, with four sentences each serving a distinct purpose: core action, usage guidance, differentiation, and privacy/requirements. No redundant or filler information. Every sentence earns its place, making it appropriately sized for the tool's importance.

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?

The tool is simple (one optional parameter) and has an output schema, so return values need no explanation. The description fully covers usage context, differentiation from siblings, privacy scope, and prerequisites. It is complete for an agent to select and invoke the tool correctly without further clarification.

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%: the only parameter 'limit' has a clear description ('how many recent uploads to return (default 25, max 50)'). The description adds minimal semantic value beyond the schema, mostly reinforcing 'recent uploads' and the absence of required parameters. Baseline 3 is appropriate because the schema already carries the parameter meaning.

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

Purpose5/5

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

The description clearly states the tool's function: 'List the connected channel’s OWN recent uploads — video id, title, publish date and privacy'. It distinguishes from siblings by explicitly contrasting with youtube_channel ('returns counts only') and search_youtube ('searches the PUBLIC index, not your uploads'). This provides a specific verb+resource scope that differentiates it from related tools.

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: 'Call this whenever the user names a video loosely... and match it yourself; only ask them when two titles are genuinely ambiguous.' It also states when not to use alternatives, clarifying that youtube_channel and search_youtube serve different purposes. This is model behavior for usage guidelines.

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

make_explainerMake an explainer videoAInspect

Turn a TOPIC into a finished narrated explainer video. Writes a sectioned script, paints a BURST of pictures per section (about one every 1.5s — most of them one-detail edits of the frame before, so it reads as movement rather than a slideshow), narrates each section with TTS, holds each picture PERFECTLY STILL for its own slice of the narration (the motion is the CUT RATE, exactly as Higgsfield's stills pipeline does it — a slow move on a still shimmers), then composites the end card (and any on-screen text you asked for) with the Chrome+ffmpeg engine the ads use (text is never model-painted, so it never garbles). BURNED ON-SCREEN TEXT IS OFF BY DEFAULT — the narration carries the point and the pictures carry the story, so the film ships clean unless the user asks otherwise; captions:true adds held key points and subtitles:true adds narration-timed CAPS (see both). It is an image film WITH motion, not N video-model renders — that's what keeps it affordable. style picks the visual family: the default 'cinematic' is photoreal editorial; every other id is a STYLED, strictly non-photoreal look (illustrated / collage / clay / pixel …) that first renders ONE style-key image and then locks every scene to it, so the whole film holds one look. Cost at the default frame density: a ~130-credit hold for a 60s explainer on the default style, ~100 styled; frameDensity:'lean' roughly halves it and 'minimal' (one picture per section) is ~30. All settle to the exact per-frame image + narration spend (a longer target = more sections = more). Takes SEVERAL minutes — one image render per frame; independent frames are painted concurrently, so it is far faster than the frame count suggests. Needs the writing model and a narration voice engine connected. NOT the tool for a short product ad — use render_ad or generate_video for those, and make_template_ad for the deterministic native formats.

ParametersJSON Schema
NameRequiredDescriptionDefault
musicNomusic bed under the narration, measured to sit about 14 dB under the voice and sidechain-ducked beneath it. Omit and the KIDS and FAIRYTALE channels get their recommended bed COMPOSED for this film — those two are the only channels a bed is due on unasked, and it costs a small flat fee; every other channel ships dry. 'off' forces silence. 'library' takes a free curated track only, and ships dry when none is on file. NAME A MOOD — upbeat / calm / warm / epic / tense / playful / elegant / hype / chill / dramatic — to compose one on ANY channel, at the same fee. hermoso_capabilities reports the exact figure as explainerMusicCredits; quote it before you turn a bed on or pick a mood.
styleNovisual style. 'cinematic' (default) is photoreal; the rest are non-photoreal styled looks — editorial_collage (halftone cutouts + marker accents), flat_vector, stickman, whiteboard, ink_marker, silhouette, storybook (gouache), paper_diorama, isometric, claymation, pixel_art, watercolor, fluffy_toy (felted plush), low_poly, stylized_3d (matte clay render), studio_3d (preschool toy 3D on a white sweep — the Kids default), mannequin (clay-render reenactment figures — a History alternate). Ask the user which they want rather than picking silently; a styled pick costs more (see the cost note).
topicYeswhat the explainer should teach or explain — a topic or a short brief
voiceNonarration voice name — omit for the default warm read
channelNothe CHANNEL TYPE — it sets the pacing, the narration register and the default look, and is orthogonal to `style` (a named style always wins): explainer (casual second-person, fast cuts), history (witty chronological retelling / documentary), kids (fastest, question-first, warm teacher), fairytale (slow, atmospheric myth or folklore). Default 'explainer'.
endCardNoappend the branded end card (default true)
upscaleNooptional FINAL upscale — 2 doubles each side, 4 quadruples. Captions and the end card are burned BEFORE it so they upscale with the frame. It is priced BY LENGTH and it is the expensive part — several times the cost of rendering the film itself. hermoso_capabilities reports the exact figures per length as explainerUpscaleCredits. Never turn it on unasked: quote the number and let the user choose.
captionsNoturn ON-SCREEN TEXT on. DEFAULT FALSE, and leave it false unless the user asks — the narration already says the point and the pictures carry it, so the clean film is the better default. `captions:true` on its own burns SUBTITLES (see below), because that is what a caption is for: showing what is being said when the phone is on mute. Slim white CAPS, thin black outline, bottom safe band, no plate, no box.
brandNameNobrand name for the end card — omit to leave it unbranded
subtitlesNowhich on-screen text, once `captions` is on. LEAVE IT UNSET (or true) for SUBTITLES — every spoken word, in order, timed to the narration; free, no extra render, no extra credits, and there is NO cue limit, so the whole film is subtitled however long it runs (at most 5 words / 32 characters a line). Set it FALSE only if the user explicitly wants section HEADINGS instead: one short summary label held over each ~7-15s section. That is NOT what is being said — it is a label about it — so it is the wrong answer to "add captions" and to anyone watching on mute. `subtitles:true` also implies `captions:true`. TIMING: each cue is anchored to that section’s REAL measured narration length and distributed inside the section by character count — exact at every section boundary, approximate to a few tenths of a second within one. It is not a word-level speech clock, so never promise frame-accurate sync.
aspectRatioNo'9:16' default
frameDensityNohow many pictures per second of narration, and therefore what it costs. 'standard' (default) is a frame about every 1.5s — the density Higgsfield's own stills pipeline enforces; 'lean' is one about every 2.5s (the longest hold that still reads as a film, ~40% of the frames and ~40% of the cost); 'minimal' is ONE picture per narration section, which is cheapest and is frankly a slideshow. Only drop below the default if the user asked for something cheaper.
durationSecondsNotarget length 20-120s (default 60); drives the section count — ~10s of narration each, 3-8 sections

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior5/5

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

Annotations are all false (no hints), so description carries full burden. It reveals behavioral traits: image-film-with-motion pipeline, cost structure, default text-off behavior, style lock, time duration, and prerequisites. 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?

The description is long but front-loaded with the core purpose and each sentence adds operational detail (costs, defaults, exclusions). For a tool with 13 params, this density is justified, though it lacks visual structure, so 4 rather than 5.

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, the description covers pipeline stages, costs, timing, defaults, prerequisites, and exclusions. Output schema exists, so return values needn't be explained. Very complete.

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 3. The description adds cross-parameter semantics (e.g., frameDensity cost implications, captions vs subtitles interplay, style cost differences) that go beyond individual schema descriptions, earning a 4.

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 specific verb+resource: 'Turn a TOPIC into a finished narrated explainer video.' It clearly distinguishes from siblings by explicitly stating 'NOT the tool for a short product ad — use render_ad or generate_video for those, and make_template_ad for the deterministic native formats.'

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 usage context: when to use (explainer videos) and when not (product ads), naming alternative tools. Also states prerequisites ('Needs the writing model and a narration voice engine connected') and gives guidance on selecting styles/channels.

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

make_template_adMake template adAInspect

Render a NATIVE-STYLE TEMPLATE ad from pure HTML — no AI video/image model in the loop, renders in ~30 seconds for a couple of credits. Perfect for native-feel social ads at volume. YOU author the content (short, casual, believable — never marketing-speak). Templates (pass as config.template): 'imessage-chat' (VIDEO ~15s: a real-looking iMessage thread where a friend reveals the product as a rich-link card; config: { thread: { contactName, messages: [{from:'them'|'me', text?, product?:{image,title,domain}}] }, theme?:'dark'|'light', endCard:{headline,cta,domain,logo?,color} } — 4-6 short lowercase bubbles, product card mid-thread from 'me', 1-2 excited replies after); 'chatgpt-chat' (VIDEO: a ChatGPT answer streams the punchline; config: { question, answer (may bold the brand), productImage?, endCard }); 'apple-notes' (VIDEO: an iPhone note types itself out; config: { title, lines: string[], theme?, endCard }); 'value-prop' (VIDEO ~17s kinetic typography: config: { hook (≤40 chars), claims: string[] (3-5 COMPLETE phrases, ≤6 words / ≤34 chars each — a finished thought, NEVER a clipped clause like 'Looks good on any'), productImages: string[] (2-3 DISTINCT photos — one rotates per card), palette: string[], endCard }); 'static-mockup' (IMAGE: config: { style:'imessage'|'notes'|'card', size?:{w,h}, ...style fields }); 'airdrop-carousel' (VIDEO ~10s: an iOS AirDrop share card springs up and cycles 3-16 REAL product photos to a full-lineup payoff; config: { brandName, products: [{image, title?}], contactLine?, endCard }); 'app-ui-tour' (VIDEO ~12-16s for APP brands: floating-iPhone mockup walks through REAL app screenshots with kinetic captions; config: { hook?, appName, iconImage?, beats: [{screenImage, caption}] (2-6), palette?, fontStack?, endCard }); 'imessage-cascade' (VIDEO ~12s: iOS notification banners spring in and stack over a blurred backdrop; config: { notifications: [{sender, text}] (4-8), backgroundImage?, endCard }); 'photo-grid' (VIDEO ~8s: collage assembles real photos one at a time; config: { title?, photos: [{image, label?}] (4-9), palette?, fontStack?, endCard }); 'vignette' (VIDEO ~12s: cinematic Ken-Burns hero film; config: { hook, lines: [2-4 ≤40ch], heroImage, palette?, fontStack?, endCard }); 'kinetic-type' (VIDEO ~9-15s typographic motion design with NO VOICEOVER — it is NOT a silent asset: it always carries its own synthesised SFX (whoosh/tick/chime) and, once a curated track is on file, the family's loudest music bed at -16 LUFS; config.music:'off' silences the bed but never the SFX: 3-6 short phrases each land word by word on a full-bleed brand card (product beats caption the phrase over the photo instead), the longest word picked out in the brand accent, and a skewed accent slab wipes every cut; supply productImages and every OTHER beat becomes a full-bleed product shot with its phrase captioned over it — with none it renders as pure typography, so it needs NO photos; config: { phrases: string[] (3-6, ≤34 chars each — punchy, declarative, ONE idea per phrase, a finished thought never a clipped clause), productImages?: string[] (up to 4 DISTINCT photos), palette?: string[], fontStack?, endCard }); 'myth-vs-fact' (VIDEO ~15-26s VO-FIRST kinetic explainer with a real VOICEOVER — the family's ONE paid-audio format: a calm-authority read busts 2-4 myths, each MYTH line slamming in with a red per-line strike then the counter FACT line landing bold+affirmative, word-level KARAOKE lighting each word as the VO speaks it; config: { pairs: [{ myth (≤50ch, the common wrong belief), fact (≤60ch, the corrective truth — wrap its payoff phrase in [brackets] to accent it) }] (2-4), palette?, fontStack?, endCard }. Real product truths only — NEVER invent stats. Costs the flat template credits PLUS a small voiceover charge); 'carousel' (MULTI-IMAGE: 5-10 branded 1080×1080 PNG slides for Meta/LinkedIn/IG carousels — returns an images[] array, one PNG per slide; config: { cover: { hook?, title }, slides: [{ headline (≤8 words), support? (≤16 words), stat?: { value, label } }] (3-8; a stat slide is a REAL user-supplied number like '94%' or '40k+' + a label, never invented), cta: { headline, cta?, domain? }, productImage?, logo?, palette?, fontStack?, endCardColor? }). Every VIDEO format except myth-vs-fact (VO-first, deliberately dry) also gets a mood-matched MUSIC BED when a curated track is on file (the library ships empty — no track means no bed, never a paid generation) under its own SFX, from the curated library — free, no model, no extra credits; set config.music:'off' for a silent cut or a mood name (upbeat/calm/warm/epic/tense/playful/elegant/hype/chill/dramatic) to re-mood it. Image URLs may be any public URL — the server localizes them. Spends a couple of credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesthe template config — MUST include config.template (one of the template ids above) plus that template's fields

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior5/5

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

Annotations are all false, so the description carries the full burden. It discloses rendering time (~30 seconds), credit cost ('Spends a couple of credits'), a hard no-AI-model constraint, music/SFX behavior including the empty-library caveat, and per-template constraints like 'NEVER invent stats' and 'real product truths only.' This far exceeds what annotations could convey.

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 extremely detailed, covering 12 templates with nested configs, but it is a single dense paragraph that could be more scannable with bullets or headers. However, it is front-loaded with the core value proposition and every sentence carries substantive information; the length is justified by the tool's complexity, though a tighter structure would improve it.

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?

Despite the high complexity (12 templates, multiple media types, config variations), the description covers all necessary aspects: template selection, config fields, constraints, cost, audio behavior, and output type (e.g., 'returns an images[] array' for carousel). The output schema exists, so return-value detail is handled elsewhere. This makes the description complete for an agent to select and invoke the tool.

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

Parameters5/5

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

The input schema only defines a single opaque `config` object with no nested properties, and the schema description merely points to 'template ids above.' The tool description is the sole source for every template variant's fields, constraints (e.g., 'phrases: string[] (3-6, ≤34 chars each)'), and config options, adding immense meaning 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?

The description opens with a precise action statement: 'Render a NATIVE-STYLE TEMPLATE ad from pure HTML — no AI video/image model in the loop, renders in ~30 seconds for a couple of credits.' This defines the tool's unique function and distinguishes it from sibling generation tools like generate_video or render_ad by emphasizing the HTML/template approach and native-style output.

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?

The description states 'Perfect for native-feel social ads at volume' and explicitly instructs 'YOU author the content (short, casual, believable — never marketing-speak),' giving clear when-to-use and content guidelines. It also distinguishes template subtypes by use case (e.g., 'app-ui-tour' for APP brands, myth-vs-fact as the only VO-first paid-audio format), and notes when config.music:'off' is appropriate, providing rich usage context.

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

make_thumbnailMake video thumbnailAInspect

Render a click-driving YOUTUBE / Shorts / Instagram THUMBNAIL or video cover — the full production pipeline (concept framework → casting → scene → render → surgical tweaks → text), not a bare image prompt. Use this for any "thumbnail", "video cover", "video preview" or MrBeast-style packaging ask INSTEAD of generate_image. About 9 credits per variant; the headline overlay is free.

CONCEPT — every thumbnail must open an INFORMATION GAP (the image raises a question the title answers) while staying truthful to the video. Brainstorm ≥5 concepts across the 16 frameworks before you pick, and feel free to combine two. Frameworks (pass as framework): before_after · social_ui · three_step · screenshot · posed_portrait (the default) · posed_action · specific_day · graphical · landscape · map_aerial · product · adding_text · repetition · size_difference · news_clip · amplified_reality. Call hermoso_capabilities for each one's full 'realize it with' note plus the emotion, overlay-style, font and rim-colour catalogs.

THREE GATES, all BEFORE you render:

  1. WHO IS IN FRAME — never assume and never silently substitute a stranger. If the framework puts a person in frame and no face photo is attached, the tool refuses (nothing rendered, nothing charged) and tells you to ask the user once: themselves (send a face photo → the identity gets locked), a generated person (castGenericPerson:true), or a people-free framework.

  2. TEXT — the default is a CLEAN render with the headline TYPESET OVER THE TOP afterwards (free, always legible, correctly spelled). Just pass headline. Only set bakeText:true if the user explicitly asks for the words painted INTO the image — verified live, that renders the asked-for words correctly but leaks garbled invented text across the rest of the frame. Never infer text intent from the topic or the framework.

  3. HOW MANY — ask once whether they want one thumbnail or a SET (offer 4: the same concept at different emotions and/or camera takes). Default is 1; variants caps at 16.

IDENTITY LOCK is automatic for every attached face photo. emotion is the single biggest CTR lever on a face: shock · hype · fear · confusion · determination · smug · charisma · disgust · awe · rage · laugh (or your own phrase). Finished thumbnail needs a fix? Re-call with tweak + sourceImage for a surgical, pixel-faithful edit (emotion / background / background_color / rim_light) instead of re-rendering — tweaks chain. ALWAYS check the returned postRenderCheck against the image before you present it.

PROMPT LANGUAGE — write every DESCRIPTIVE field in ENGLISH (sceneBrief, keyElements, location, composition, background, topic, each person's describe, and every reference field), translating the user's wording where needed: the image models are trained on English and a non-English scene description renders noticeably worse. Text that gets BAKED OR TYPESET stays verbatim in the user's own language — headline, headlineLines and bakedUiText are never translated.

ParametersJSON Schema
NameRequiredDescriptionDefault
fontNoheadline font (default Anton). Alternatives incl. Bebas Neue, Oswald, Archivo Black, Montserrat, Inter, Playfair Display
logoNoa brand logo URL or path to place into the composition
splitNosplit/panel LAYOUT — only when the user asks for one ("split", "before/after", "versus screen"). "X vs Y" as a SCENE stays one unified frame
takesNocamera takes per emotion, 1–4: designed framing / low-angle hero / extreme close-up / wide dutch tilt
topicNothe video's topic — used to pick the hero object when you don't name keyElements
tweakNosurgical pixel-faithful edit of a FINISHED thumbnail — needs sourceImage
logo3dNofirst turn the flat logo into a volumetric 3D render (one extra billed image), then composite that
peopleNopeople described in prose instead of by photo (each still gets the chosen expression)
emotionNothe expression on the face (default 'shock') — a preset id or your own phrase
bakeTextNodefault false. true paints the headline INTO the generation — only on an explicit user ask; it leaks garbled text elsewhere in the frame
emotionsNorender one variant per emotion (variants = emotions × takes, max 16)
headlineNo2–4 word headline. Typeset OVER the finished render by default (free, always legible); newlines split it into stacked lines
locationNoplace, time of day, weather, atmosphere
rimColorNocolored back+hair light — ONLY when the user names one: 'ice-blue' / 'neon-magenta' / 'toxic-lime' / 'amber-gold' / 'pure-white'
variantsNohow many thumbnails to render (default 1, max 16). Each is its own billed render — offer a set of 4 rather than assuming
frameworkNoconcept framework id (default 'posed_portrait'); see the list in this description / hermoso_capabilities
referenceNofields YOU extracted by eye from a reference thumbnail. Extract ALL of: brief (one dense sentence on the concept), subject (pose/action generically, NEVER a specific identity), elements, location, composition, background, split (boolean), split_count, person_count (0-3), emotion (one of the 11 presets or 'other'), emotion_detail (one vivid sentence covering eyes, brows, mouth, head angle). emotion + emotion_detail carry the reference's actual facial performance, which is the single biggest CTR lever on a face; split/split_count reproduce its panel structure. The reference image itself is never sent to the model
backgroundNooverride the default bold saturated colour-field background
faceImagesNoup to 3 face photos (URLs or local paths) — each becomes a locked CHARACTER identity, in order
sceneBriefNowhat the thumbnail depicts — the concept in one dense sentence, rendered exactly
aspectRatioNo'16:9' (YouTube, default) / '9:16' (Shorts) / '4:5' (Instagram) / '4:3' / '1:1'
bakedUiTextNoshort label for a text-carrying framework (a chat bubble, a DAY N badge, a news lower-third, a map callout) — needs frameworkRequested:true
compositionNooverride the default large-foreground-subject composition
keyElementsNosignature props / effects that make it pop — oversized, flying toward camera
sourceImageNothe finished thumbnail URL a `tweak` edits; tweaks chain, so feed each accepted output into the next
overlayStyleNoheadline style: 'beast' (default, white + heavy black stroke) / 'fire' / 'neon-lime' / 'clean-glass' / 'marker'
forceGenerateNorender the 'screenshot' framework anyway (it is normally a real video frame, not a generation)
headlineLinesNoexplicit headline lines (up to 3) — overrides splitting `headline` on newlines
headlinePlaceNowhere the headline sits — never over the face (default 'bottom')
restrainedGradeNotrue for a calm / premium / muted look instead of the default punchy poster grade
castGenericPersonNopass true only after the user has explicitly chosen a generated stranger over their own face
frameworkRequestedNotrue ONLY when the USER named this framework — it is what authorizes a text-carrying framework (social_ui / news_clip / specific_day / map_aerial) to bake its short UI label

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNowhat to tell the user / do next
frameworkNothe framework that was rendered
thumbnailsNothe rendered variants — each with its served image URL, framework, emotion and take
creditsUsedNocredits billed
textDeliveryNo'clean' / 'typeset-overlay' / 'baked-into-generation'
notAGenerationNotrue when nothing was rendered because the framework wants a real video frame
postRenderCheckNothe checks to run against every image before presenting it
needsFaceDecisionNotrue when nothing was rendered because who is in frame has not been decided
Behavior5/5

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

Annotations are all false (no extra hints), so the description carries full weight. It discloses key behavioral traits: ~9 credits per variant, free headline overlay, refusal behavior if no face photo (nothing charged), garbled text leak when bakeText:true, identity lock, tweak chaining, and a postRenderCheck to verify. This richly informs the agent about what to expect.

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 well-structured with clear headers (CONCEPT, THREE GATES, IDENTITY LOCK, PROMPT LANGUAGE). Every section serves a purpose—covering concept generation, approval gates, identity lock, and language constraints. While verbose, it is organized and front-loaded with the core purpose, making it navigable for an agent.

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 tool with 32 parameters and high complexity, the description covers all critical operational aspects: definition, workflow, gates, pricing, language best practices, edit chain, and verification step. It references hermoso_capabilities for additional framework details, and since an output schema exists, not explaining return values is acceptable. The agent has enough context to invoke it correctly.

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

Parameters5/5

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

Schema coverage is 100%, but the description significantly adds meaning beyond the schema. It lists the `framework` options (not fully defined in the schema), the `emotion` presets, explains the policy for `castGenericPerson`, describes `bakeText` side effects, and details the `tweak` workflow. These additions help the agent correctly interpret 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 clearly states the tool's specific purpose: 'Render a click-driving YOUTUBE / Shorts / Instagram THUMBNAIL or video cover' with a full production pipeline. It explicitly contrasts itself with generate_image ('INSTEAD of generate_image'), making the tool's scope and distinction from siblings unambiguous.

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?

The description provides explicit guidance on when to use this tool: 'Use this for any "thumbnail", "video cover", "video preview" or MrBeast-style packaging ask INSTEAD of generate_image.' It also outlines a structured three-gate workflow (who is in frame, text handling, how many variants) and procedural rules, giving clear context and alternatives.

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

manage_linkedin_postEdit or delete a LinkedIn postA
DestructiveIdempotent
Inspect

Edit or delete a published LinkedIn post — personal profile or company Page. Pass postUrn, the full urn returned when it was published. action:"edit" changes ONLY THE COPY: LinkedIn does not allow the image or video of a published post to be replaced, so a new visual means a NEW post — tell the user that instead of promising a swap. action:"delete" is immediate and public and requires confirm:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNothe new copy, for action:"edit"
actionYes
confirmNoREQUIRED true to delete
postUrnYesthe full LinkedIn post urn returned by publishing

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
editedNo
deletedNo
Behavior5/5

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

The description adds significant behavioral context beyond the annotations: edit only changes copy, LinkedIn disallows replacing images/videos, delete is immediate and public, and requires confirm:true. It also explains the fallback behavior (tell the user about a new post). This goes well beyond the annotations' readOnly/destructive flags, offering operational nuance.

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 concise yet complete, packing four distinct pieces of information into a short paragraph. Every sentence earns its place: scope, parameter requirement, edit limitation, and delete requirement. No fluff or repetition.

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?

Given the dual-action nature and the presence of an output schema, the description is largely complete. It covers prerequisites (published post, postUrn), action-specific caveats, and confirmation. It lacks edge-case handling (e.g., already-deleted posts, error states), but those are likely covered by the output schema and annotations. Slight room for more details on failure scenarios.

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 input schema already covers 75% of parameters with descriptions, and the description reinforces key parameter behavior: postUrn must be the full published urn, action:'edit' has limitations, and confirm:true is required for delete. The description adds meaning by connecting parameters to real-world constraints, elevating it beyond schema-only documentation.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Edit or delete a published LinkedIn post — personal profile or company Page.' It specifies the exact actions (edit/delete) and the resource (LinkedIn post), and distinguishes between personal and Page contexts. This clearly differentiates it from sibling tools like post_to_linkedin or manage_meta_post.

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 provides clear guidance on when to use this tool: for editing or deleting published posts, with the prerequisite of passing the postUrn from publishing. It also gives an explicit alternative for a common mistake (new visual → new post) and notes the confirm requirement for deletion. It does not explicitly name alternative tools, but the context makes it clear.

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

manage_meta_postEdit or delete a published postA
Destructive
Inspect

Edit the text of, or delete, a published post. target:"facebook" → edit the message (action:"edit", message:…) OR delete (action:"delete"); target:"threads" → delete only (Threads has no edit API); target:"instagram" → DELETE ONLY — Meta lets you change nothing on a published Instagram post except whether comments are enabled, so a caption cannot be fixed; deleting covers ordinary posts, Stories, Reels and ENTIRE carousel albums (Instagram cannot remove one card out of an album — pass the album’s own media id, from list_instagram_media). Deleting is permanent. FOR INSTAGRAM, CALL IT WITHOUT confirm FIRST: nothing is deleted and you get back the post’s real caption, its likes and comments and how many carousel cards go with it — show the user exactly that, then call again with confirm:true plus confirmName (and confirmChildren for an album) if the refusal asks for them. A post nobody has liked or commented on yet stays a one-call delete. INSTAGRAM DELETE NEEDS A RECONNECT AND IS PENDING APP REVIEW: the instagram_manage_contents permission joined Hermoso’s Meta grant on 2026-08-05, so any Meta connection made before then must be reconnected (Settings ▸ Connectors ▸ Meta) — and until Meta App Review clears, Meta grants that permission only to admins, developers and testers of the app. Tell the user that rather than retrying.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesedit the text (FB only) or delete the post
pageIdNowhich Page to use — needed when the post id has no page prefix, or when the brand has several Pages and you are deleting an Instagram post
postIdYesthe post id returned by post_to_meta — for Instagram, the media id from list_instagram_media
targetNodefault facebook
confirmNoREQUIRED true to delete (permanent)
messageNothe new post text (action:"edit" on facebook)
confirmNameNoInstagram only: the post’s exact caption line, exactly as the unconfirmed call reported it — required once the post has any likes or comments
confirmChildrenNoInstagram only: how many carousel cards the delete also destroys, as the unconfirmed call reported

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
actionNo
postIdNo
targetNo
deletedNo
verdictNo
permalinkNo
blastRadiusNo
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses several non-obvious behaviors: permanent deletion, Instagram's lack of edit support, the need for an unconfirmed call first, the deletion of entire carousel albums, and the pending app review permission constraint. These add significant operational context not inferable from annotations alone.

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

Conciseness4/5

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

The description is lengthy, but every sentence contributes necessary information about platform differences, the confirmation protocol, and permission caveats. While dense and slightly run-on, the structure is acceptable given the tool's complexity and need for precise instructions.

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?

The description covers all essential aspects: operations, platform-specific rules, required confirmation steps, unconfirmed call return data, and permission/reconnect requirements. With an output schema available, the description completes the context without needing to detail return formats.

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 input schema already provides 100% parameter coverage, but the description enriches semantics by explaining the confirmation flow for confirmName and confirmChildren, and clarifying that postId for Instagram is a media id. This goes beyond the schema descriptions, offering critical usage context.

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

Purpose5/5

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

The description clearly states the tool edits or deletes a published post, with a specific verb and resource. It further distinguishes itself from sibling tools by specifying platform-specific behaviors (Facebook edit/delete, Threads delete-only, Instagram delete-only), which sets it apart from generic meta object operations.

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 provides explicit when-to-use guidance per platform, including the mandatory two-call Instagram flow and the direction to use list_instagram_media for media IDs. It does not explicitly name alternative tools for when-not scenarios, but the platform-specific constraints effectively imply exclusions (e.g., don't attempt to edit Instagram captions).

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

manage_sheet_tabsAdd, rename or delete a sheet tabA
Destructive
Inspect

Add, rename or delete a tab in a Google Spreadsheet. action:"add" + title · action:"rename" + tab + newTitle · action:"delete" + tab. Name the tab by its TITLE or its numeric sheetId (list_sheet_tabs gives both); an unknown tab is refused with the real list rather than a Google error nobody can map back. DELETING a tab destroys everything on it: call it without confirm first to get the filled-cell count, then confirm:true + confirmCells. Google does not allow removing the LAST remaining tab in a file, and that is refused by name with the way out (clear it, or delete the whole file with delete_drive_file). Every action is read back from the spreadsheet before it is reported as done.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNowhich tab — its title or numeric sheetId (rename / delete)
titleNothe name for the new tab (action:"add")
actionYes
confirmNo
newTitleNowhat to rename the tab to (action:"rename")
sheetUrlNo
confirmCellsNo
spreadsheetIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
wasNo
noteNo
titleNo
actionNo
sheetIdNo
verifiedNo
destroyedNo
spreadsheetIdNo
Behavior5/5

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

Annotations already indicate destructive and non-read-only behavior, but the description adds crucial details: deletion destroys all content, unknown tabs are refused with a real list instead of a cryptic Google error, the last remaining tab cannot be removed, and every action is verified by reading back from the spreadsheet. This goes well beyond the structured annotations without contradicting them.

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

Conciseness5/5

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

Though dense, every sentence serves a purpose: syntax, tab identification, error handling, destructive warning, edge case, and verification. The structure is logical and front-loaded with the main verb, making it easy to scan and apply.

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 8 parameters and multiple action modes, the description covers all essential usage contexts: add, rename, delete, confirmation, tab identification, last-tab restriction, and the way out. Since an output schema exists, the lack of return-value explanation is acceptable. The tool is fully explained for safe and correct invocation.

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

Parameters5/5

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

Schema description coverage is low (38%), so the description must compensate. It explains how parameters combine per action (title for add, tab + newTitle for rename, tab for delete), how to identify a tab (title or sheetId), and the confirm/confirmCells flow for deletion. This adds substantial meaning beyond the bare schema descriptions.

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 'Add, rename or delete a tab in a Google Spreadsheet,' which clearly identifies the verb and resource. It distinguishes from sibling tools like create_sheet, list_sheet_tabs, and update_sheet by enumerating the three specific actions and their required arguments.

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?

The description provides explicit usage patterns for each action (e.g., 'action:"add" + title') and tells users when to call the tool without confirm first to get the filled-cell count. It also names alternatives for edge cases, such as delete_drive_file for deleting the whole file and list_sheet_tabs for retrieving tab identifiers.

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

meta_insightsMeta ad performance metricsA
Read-only
Inspect

Pull performance INSIGHTS (spend, impressions, reach, clicks, CTR, CPC, CPM, conversions) for a connected ad account, or a specific campaign / ad set / ad. Pass adAccountId (for auth); optionally objectId to scope to one object and level to break the numbers down. BREAKDOWNS are what make the numbers actionable — a flat total says an ad cost $X, never WHO it worked on: pass breakdowns:"age,gender", "publisher_platform,platform_position" (which placement), "country" / "region" / "dma" (where), "impression_device" / "device_platform" (what they held). Comma-separated; "placement", "device" and "geo" are accepted as aliases; an unknown value is REJECTED, never silently ignored. THREE breakdowns need an ad-account OPT-IN from 2026-08-06 — impression_device, hourly_stats_aggregated_by_audience_time_zone and frequency_value: Meta returns NO ROWS (not an error) for an account that has not opted in, so they are always ATTEMPTED, and if nothing comes back the report is re-run WITHOUT them and droppedBreakdowns + a note name the missing dimension and say an account admin can enable it in Ads Manager. A dropped dimension is ABSENT, never zero — never present the remaining total as if it were still split by it. Date window: datePreset OR since+until (YYYY-MM-DD). datePreset is Meta's OWN enum — today, yesterday, last_3d, last_7d, last_14d, last_28d, last_30d, last_90d, this_week_mon_today, this_week_sun_today, last_week_mon_sun, last_week_sun_sat, this_month, last_month, this_quarter, last_quarter, this_year, last_year, maximum, data_maximum. THERE IS NO "lifetime": Meta disabled it in Graph API v10.0 and replaced it with "maximum" (the last 37 months); anything unrecognised is refused by name here rather than 400ing at Meta. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNobreak the numbers down by this level
sinceNostart date YYYY-MM-DD (use with until)
untilNoend date YYYY-MM-DD
objectIdNoa campaign / ad set / ad id to scope to (default: the whole account)
breakdownsNocomma-separated, e.g. "age,gender" | "publisher_platform,platform_position" | "country" | "impression_device"
datePresetNoMeta's date_preset enum, default last_30d: today | yesterday | last_3d | last_7d | last_14d | last_28d | last_30d | last_90d | this_week_mon_today | this_week_sun_today | last_week_mon_sun | last_week_sun_sat | this_month | last_month | this_quarter | last_quarter | this_year | last_year | maximum | data_maximum. NOT "lifetime" — Meta retired it in v10.0; use "maximum" (37 months) or since+until.
adAccountIdYesad account id (act_… or digits)
actionBreakdownsNocomma-separated, e.g. "action_type,action_device" — splits the conversion/action counts

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
rowsNo
linesNo
objectIdNo
breakdownsNo
breakdownStatusNo
actionBreakdownsNo
droppedBreakdownsNo
breakdownsRequestedNo
Behavior5/5

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

Annotations only state readOnlyHint and openWorldHint, but the description goes far beyond: it explains the Meta date preset enum, that 'lifetime' is no longer supported, that unknown breakdown values are rejected (not ignored), and the exact fallback behavior for opt-in breakdowns (re-run without them, droppedBreakdowns, absent not zero). It also closes with 'Read-only,' reinforcing the annotation. No contradictions.

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

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place. It is densely packed with actionable detail: metrics, scoping options, breakdown rules, opt-in caveats, date handling, and a read-only note. The structure is logical: metrics → parameters → breakdowns semantics → dates → safety. There is no fluff; it is efficient for the complexity it covers.

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 8 parameters, an output schema, and complex Meta-specific behavior (breakdown opt-ins, date preset limits), this description is exceptionally complete. It covers not only what the tool returns but also failure modes (unknown breakdown rejected, missing opt-in returns no rows), aliases, and the 'maximum' vs 'lifetime' distinction. An agent has everything needed to invoke it correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds substantial meaning: adAccountId is for auth, breakdowns semantics including aliases ('placement', 'device', 'geo'), the opt-in edge case, and the full datePreset list with the 'lifetime' caveat. It explains the interplay between objectId and level, and why breakdowns matter. This is much richer than the schema's brief field descriptions.

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 begins with a specific verb+resource: 'Pull performance INSIGHTS (spend, impressions, reach, clicks, CTR, CPC, CPM, conversions) for a connected ad account, or a specific campaign / ad set / ad.' This clearly distinguishes it from sibling insight tools like meta_page_insights, meta_post_insights, and instagram_insights, which are scoped to pages/posts/Instagram rather than ad accounts.

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 context on when to use it (for ad performance metrics) and how to use it: pass adAccountId for auth, optionally objectId/level to scope, breakdowns to make numbers actionable, datePreset or since+until. It also warns against using 'lifetime' and explains the opt-in behavior. However, it does not explicitly name alternative tools for other contexts, leaving the when-not-to-use guidance implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

meta_page_insightsFacebook Page + Instagram insightsA
Read-only
Inspect

Organic performance for the brand’s connected Facebook Page — views and unique reach (page_media_view / page_total_media_view_unique, Meta’s own replacements for the impressions family it retired), post engagements, video views, daily follows, plus follower and Page-like counts — with the linked Instagram account’s headline numbers alongside. This is ORGANIC reach; use meta_insights for paid ad performance, and instagram_insights for the full Instagram set and its audience demographics. Any metric Meta returns no value for is named as MISSING data, which must never be reported as zero.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdNoPage id — omit when the brand has exactly one Page connected
periodNowindow (default week)

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageNo
pageNameNo
instagramNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the bar is lower. The description adds valuable behavioral context beyond annotations: it clarifies the metric family (Meta's replacements for impressions), emphasizes ORGANIC-only scope, and warns that missing values are labeled MISSING data and must not be reported as zero. 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?

Two sentences, front-loaded with 'Organic performance'. The first sentence is long but every metric listed is relevant and earns its place. The second sentence handles exclusions and missing-data policy. Could be slightly trimmed but overall efficient.

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 read-only analytics tool with two optional params and an output schema, the description covers scope, metrics, exclusions, and missing-data handling. The only minor gap is the vague term 'headline numbers' for Instagram, but it does not undermine completeness.

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 pageId and period having descriptions. The tool description does not add further parameter meaning beyond the schema, so baseline 3 applies. It mentions 'connected Facebook Page' but that does not clarify parameter syntax beyond what 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 names the specific resource (brand's connected Facebook Page) and the exact metrics (views, unique reach, post engagements, video views, daily follows, follower counts) plus linked Instagram headline numbers. It distinguishes from siblings by explicitly contrasting with meta_insights and instagram_insights.

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 states when to use the tool: for ORGANIC reach, and names alternatives: 'use meta_insights for paid ad performance, and instagram_insights for the full Instagram set and its audience demographics.' This provides clear 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.

meta_post_insightsInsights for one Facebook/Instagram postA
Read-only
Inspect

Performance for a single organic post — on Facebook views/reach (post_media_view, post_total_media_view_unique — Meta’s own replacements for the retired impressions family), clicks, reactions and video watch time; on Instagram views, reach, likes, comments, saves, shares, total interactions and (where the media type has them) follows, profile visits, story navigation and reel watch time. Use it to find which organic posts earned their reach before turning one into a paid ad. A metric Meta returns no value for is reported by name as MISSING — never read it as zero.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdNoPage id — omit when only one Page is connected
postIdYespost/media id returned by post_to_meta
targetNowhich metric set to ask for (default facebook)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
postIdNo
metricsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the MISSING sentinel behavior for metrics Meta returns no value for and warns not to interpret it as zero. It also notes that metric availability varies by media type. This adds meaningful behavioral context beyond the readOnlyHint and openWorldHint 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 composed of three dense, front-loaded sentences. The metric enumeration is lengthy but relevant, and the sentinel warning earns its place. It is slightly verbose but not redundant.

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 output schema and annotations, the description covers the tool's scope, platform-specific metrics, and special missing-value behavior. It is complete enough for an agent to select and invoke the tool correctly without additional external knowledge.

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?

The input schema already provides complete descriptions for all three parameters, so the description does not need to add parameter-level syntax. The description's metric list and MISSING note are behavioral context rather than parameter semantics, which is fine because schema coverage is 100%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns performance metrics for a single organic Facebook/Instagram post, enumerating the metric families for each platform. It distinguishes itself from broader analytics tools by scoping to one post and naming specific metric sets.

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 an explicit use case: 'Use it to find which organic posts earned their reach before turning one into a paid ad.' It does not explicitly name alternative tools or exclusions, but the context is clear enough for an agent to decide when to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

microsoft_ads_budget_opportunitiesWhere Microsoft says budget is capping deliveryA
Read-only
Inspect

Where a Microsoft Advertising campaign is BUDGET-CONSTRAINED — Microsoft’s own recommended budget against the current one, the estimated WEEKLY click and impression gain from raising it, and a budget/return curve. Omit campaignId for the whole account. SAY THIS WHEN REPORTING: these are Microsoft’s FORECASTS, never measurements — a projected increase has not happened — and acting on one spends real money, so it takes set_microsoft_ads_budget and an explicit yes from the user. Microsoft EXCLUDES user-paused campaigns from this analysis, so a paused campaign is absent by design rather than well-funded. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdNo
campaignIdNoomit for the whole account

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
countNo
opportunitiesNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though annotations already declare readOnlyHint and openWorldHint, the description adds substantial behavioral context: these are forecasts that haven't happened, acting costs real money, requires explicit user approval, and paused campaigns are excluded by design. This goes far beyond the annotation basics and warns the agent appropriately.

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 somewhat long but every sentence adds necessary information. It is front-loaded with the core concept, includes parameter usage, reporting caveats, exclusion behaviors, and cost/access details. A bit verbose but not wasteful.

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 and simple parameters (0 required), the description covers all essential behavioral caveats and usage constraints. It explains what the data means, how to interpret it, and what follow-up actions require. Complete for an agent to select and invoke correctly.

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?

Schema coverage is 50% (only campaignId has a description), and the description only repeats what the schema already says ('Omit campaignId for the whole account'). accountId remains completely unexplained, and the description adds no parameter semantics beyond the schema. No compensation for the uncovered parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's function: showing where Microsoft Advertising campaigns are budget-constrained, including recommended vs current budget, estimated weekly gains, and a budget/return curve. The title and description use a specific verb+resource and distinguish this from sibling tools like microsoft_ads_report or set_microsoft_ads_budget.

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 provides clear context: these are forecasts, not measurements, and acting on them requires set_microsoft_ads_budget with user consent. It also notes Microsoft excludes paused campaigns. However, it stops short of explicitly naming alternative tools or providing a direct 'use when...' vs 'use instead...' distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

microsoft_ads_keyword_ideasMicrosoft Advertising keyword plannerA
Read-only
Inspect

Microsoft Advertising’s KEYWORD PLANNER — real monthly search volume, competition, suggested bid and ad impression share, expanded from seed keywords, a landing-page URL to mine, or a category. Run it BEFORE choosing keywords for a Microsoft campaign, exactly as you would google_ads_keyword_ideas for Google. Unlike Google’s Keyword Planner there is NO planning-tier gate here — a developer token is sufficient. locationIds is REQUIRED and deliberately not defaulted: a search volume with no market attached is a number nobody can act on, and inventing a country would silently answer about the wrong market — use microsoft_ads_geo_search to resolve a country or city name to an id, free. SAY THIS WHEN REPORTING: Competition is Microsoft’s Low/Medium/High bucket, NOT a percentage; MonthlySearchCounts is a per-month series rather than one number; SuggestedBid is in the account currency. An empty result means Microsoft found no ideas for those seeds, never that nobody searches for them. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoa landing page for Microsoft to mine ideas from
networkNo
keywordsNoseed terms to expand from
languageNodefault English
accountIdNo
attributesNowhich idea attributes to return — omit for all
categoryIdNo
competitionNofilter to Low | Medium | High
expandIdeasNofalse = do not expand; then keywords[] is mandatory
locationIdsYesREQUIRED — Microsoft location ids (microsoft_ads_geo_search resolves names to ids, free)
maxSearchVolumeNo
minSearchVolumeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
countNo
ideasNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and openWorldHint annotations, the description discloses crucial behaviors: no planning-tier gate with a developer token, why locationIds is deliberately not defaulted, empty result meaning, and reporting pitfalls (Competition is a bucket not percentage, MonthlySearchCounts is a per-month series, SuggestedBid currency). This goes far beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but highly structured and front-loaded with the core function, then usage, then caveats. The 'SAY THIS WHEN REPORTING' section is essential for correct output interpretation, and every sentence earns its place. Slightly verbose, but justified by the tool's complexity.

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 purpose, when-to-use, parameter semantics, output interpretation, empty result behavior, authentication requirements, and credit cost. The presence of an output schema handles return structure. Only minor details like pagination or rate limits are omitted, and those are not critical for this 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?

The description adds meaning to key parameters: locationIds (required, how to resolve, why not defaulted), competition (Low/Medium/High not a percentage), and input sources like keywords/URL/category. Schema coverage is 58%, so it fills the most critical gaps, though not all 12 parameters are individually explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it's Microsoft Advertising's Keyword Planner, returning monthly search volume, competition, suggested bid, and ad impression share. It explicitly distinguishes from google_ads_keyword_ideas and mentions the geo_search tool for location resolution, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use: 'Run it BEFORE choosing keywords for a Microsoft campaign' and directly parallels google_ads_keyword_ideas. It also names microsoft_ads_geo_search as the alternative for resolving location IDs, giving clear usage context and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

microsoft_ads_reportMicrosoft Advertising performance reportA
Read-only
Inspect

Performance for a Microsoft Advertising account — impressions, clicks, CTR, average CPC, spend, conversions. reportType picks WHICH report, and that is the whole Microsoft reporting surface, not just campaigns: AdGroupPerformance, AdPerformance, KeywordPerformance, SearchQueryPerformance (the actual search terms people typed), GeographicPerformance, UserLocationPerformance, AgeGenderAudience and ProfessionalDemographicsAudience (LinkedIn-sourced job function and industry, inside Bing), ConversionPerformance, DestinationUrlPerformance, ShareOfVoice, AssetPerformance, ProductDimensionPerformance, SearchCampaignChangeHistory ("what changed on Tuesday") and ~30 more — an unknown name is refused WITH the full list rather than forwarded. aggregation controls the row grain (Summary / Daily / Hourly / Weekly / Monthly / Yearly / HourOfDay / DayOfWeek). Two reports keep far less history than the usual 36 months — AssetPerformance 30 days, ShareOfVoice 6 — and the reply says so, because an empty short-retention report is a retention limit, not an absence of delivery. Window via timePeriod (Today | Yesterday | LastSevenDays | Last14Days | Last30Days | ThisWeek | LastWeek | LastFourWeeks | ThisMonth | LastMonth | LastThreeMonths | LastSixMonths | ThisYear | LastYear | ThisWeekStartingMonday | LastWeekStartingMonday | LastFourWeeksStartingMonday) or since+until (YYYY-MM-DD) — default Last30Days. An unrecognised timePeriod is REFUSED, never silently swapped for another window. Microsoft generates reports ASYNCHRONOUSLY: this can return pending:true with a reportRequestId, and you must call again rather than reporting any numbers. A report that succeeds with ZERO rows genuinely means there was no delivery in that window — say exactly that; never present zeros as measured performance. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoYYYY-MM-DD custom range start (with until)
untilNoYYYY-MM-DD custom range end
columnsNoreport columns — defaults to campaign performance. Each report type accepts only its OWN column set; Microsoft also refuses impression-share columns alongside BidMatchType / BudgetName / DeviceOS / Goal / TopVsOther in the same request.
accountIdNoMicrosoft ad account id — omit to use the brand’s single shared account
reportTypeNowhich report — default CampaignPerformanceReportRequest. An unknown name is refused with the full list.
timePeriodNopredefined Microsoft window, default Last30Days — must be one of the values in the description; anything else is rejected
aggregationNodefault Summary. Hourly accepts only Today/Yesterday or a custom range.
reportRequestIdNopick up a report that came back pending — pass it back and this RESUMES that exact report instead of submitting a new one

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
rowsNo
countNo
pendingNo
accountIdNo
reportRequestIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and openWorldHint annotations, the description discloses critical behaviors: asynchronous report generation with pending:true and reportRequestId, refusal of unknown reportType/timePeriod with the full list, short retention for AssetPerformance and ShareOfVoice, and the meaning of zero-row results. This is exemplary transparency.

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 dense with essential information. It is front-loaded with the key metrics and purpose, followed by necessary caveats. While it reads as a single run-on paragraph, every sentence adds value, though a bulleted structure could improve scannability. Aptly sized for the tool's complexity.

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 an 8-parameter tool with an output schema and annotations, the description covers all significant operational aspects: report type selection, aggregation, time windows, retention limits, async handshake, error handling, and result interpretation. It leaves no critical ambiguity for an agent invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds substantial meaning beyond the schema. It enumerates many reportType options, explains aggregation grain choices, lists all timePeriod values, clarifies custom range via since/until, and explains reportRequestId as a way to resume a pending report. This greatly enriches parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a Microsoft Advertising performance report, listing specific metrics (impressions, clicks, CTR, average CPC, spend, conversions). It also emphasizes that reportType covers the entire Microsoft reporting surface, distinguishing it from sibling ad report tools for other platforms.

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 provides clear context for when to use this tool (Microsoft Advertising reporting) and describes important usage details like timePeriod options, aggregation, and async behavior. It doesn't explicitly state 'use this instead of google_ads_report', but the platform-specific naming and content make the intended use unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

microsoft_ads_traffic_estimatesMicrosoft Advertising traffic estimatesA
Read-only
Inspect

What a set of keywords would DELIVER on Microsoft Advertising at a given bid — estimated impressions, clicks, CTR, average CPC, average position and total cost. maxCpc is REQUIRED because a traffic estimate IS a function of the bid; estimating without one would be inventing the input. locationIds is REQUIRED for the same reason a search volume needs a market. SAY THIS WHEN REPORTING: Microsoft returns a MINIMUM and a MAXIMUM per keyword — quote the range, never average the two into a single figure — and every number here is a FORECAST, so never present it as measured performance. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
maxCpcYesREQUIRED — the max CPC bid to estimate at, in the account currency
networkNo
keywordsYesthe keywords to estimate
languageNo
accountIdNo
matchTypeNodefault Exact
dailyBudgetNo
locationIdsYesREQUIRED — Microsoft location ids

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
countNo
estimatesNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description adds critical behavioral disclosures: Microsoft returns min/max ranges, numbers are forecasts not measured performance, and the tool costs 0 credits. It also explicitly says 'Read-only,' reinforcing the annotation without contradiction. This is valuable context an agent needs to report results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than a single sentence but every sentence earns its place: purpose, required-param rationale, and reporting rules (quote range, never average, forecast not measured). It is structured logically and front-loaded with the core purpose, making it easy for an agent to parse.

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 has an output schema (so return format is documented elsewhere), the description fully covers what an agent needs: what the tool does, required params and why, how to interpret results (min/max ranges), and the read-only/credit status. It is complete for a forecasting tool of this complexity.

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 50%, and the description compensates strongly for the two most important required parameters (maxCpc and locationIds) by explaining their semantic necessity. It does not describe optional parameters (network, language, accountId, dailyBudget), but their names and the schema's matchType description cover some ground. This is better than baseline but not exhaustive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb ('would DELIVER') and resource ('a set of keywords on Microsoft Advertising'), enumerating the exact outputs (impressions, clicks, CTR, average CPC, average position, total cost). This distinguishes it from sibling tools like microsoft_ads_keyword_ideas or microsoft_ads_report.

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 explains why maxCpc and locationIds are required and gives context for their necessity ('estimating without one would be inventing the input'). It implies when to use the tool (for bid-based traffic estimates) but does not explicitly name alternatives or exclusions, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mine_anglesMine customer anglesA
Read-only
Inspect

Mine ad ANGLES from real customer language: gathers the customer's own words (Reddit, TikTok, the brand's review page + review-site results) and returns a RANKED angle bank — each angle tagged (pain / outcome / identity / fear / competitive-displacement / social-proof / contrast), 2-5 VERBATIM proof quotes, a 0-100 score with breakdown, and a ready-to-run hook in the customer's own voice. Reads YOUR saved brand (pass brandId to target a specific brand — that switches this key's active brand like use_brand). To tear down a COMPETITOR use competitor_teardown instead. Spends a few ScrapeCreators credits + LLM tokens.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandIdNoa brand id/name from list_brands to mine for; omit to use the active brand

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNowhy no angles were returned, when the bank is empty
anglesNothe ranked angle bank ({category, angle, score, hook_draft, proof_quotes})
sourceCountNohow many customer sources were mined
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and destructiveHint annotations, the description discloses that the tool spends ScrapeCreators credits and LLM tokens, and that passing brandId switches the key's active brand like use_brand. This is important behavioral context not visible in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but well-structured, front-loading the purpose and then detailing output, parameters, alternatives, and cost. Each sentence contributes essential information without redundancy.

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?

The description covers the tool's inputs, outputs, side effects, cost, and the main alternative tool. Given the presence of an output schema, it provides enough context for an agent to select and invoke the tool correctly.

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 schema already fully describes brandId as a brand id/name from list_brands. The description adds the crucial detail that passing brandId switches the active brand, which is not evident from the schema 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?

The description opens with 'Mine ad ANGLES from real customer language,' which is a specific verb+resource pairing. It lists concrete sources and output components, and explicitly differentiates from competitor_teardown, making the tool's purpose 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?

The description states to use competitor_teardown for competitors, and explains when to pass brandId versus omit it, including the side effect of switching the active brand. This gives the agent clear decision guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

moderate_meta_commentHide, unhide or delete a Meta commentA
DestructiveIdempotent
Inspect

Moderate a comment on the brand’s Facebook or Instagram post. Prefer hide over delete — hiding is reversible and invisible to the commenter. Deleting is PERMANENT and requires confirm:true after the user has agreed.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNodefault hide
pageIdNoPage id — omit when only one Page is connected
confirmNorequired (true) only for delete
commentIdYescomment id from list_meta_comments

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
actionNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description adds valuable context: deletion is permanent, requires confirm:true, and hiding is reversible and invisible to the commenter. This supplements the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the primary purpose, and every sentence provides essential guidance. It avoids redundancy and is highly scannable.

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 description sufficiently covers the tool's functionality, action-specific behavior, and the source of comment IDs (list_meta_comments). With an output schema present and annotations rich, this is adequately complete, though it could briefly mention unhide as an explicit option.

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 parameters are already well-documented. The description reinforces the confirm parameter's purpose ('requires confirm:true after the user has agreed') but does not significantly add new semantic details 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?

The description clearly states the tool moderates a comment on the brand's Facebook or Instagram post, with a specific verb 'Moderate' and resource. The title explicitly lists the three actions (hide, unhide, delete), distinguishing it from the sibling reply_to_meta_comment tool.

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 provides clear internal guidance by recommending 'Prefer hide over delete' and explaining that delete is permanent and requires confirm:true. It gives context for when to use which action, though it does not explicitly mention alternatives like reply_to_meta_comment.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

openai_ads_reportChatGPT Ads performance reportA
Read-only
Inspect

Performance for ChatGPT Ads — impressions, clicks, spend, CTR, CPC, CPM. The scope follows the id you pass: none = the whole ad account, or campaignId / adGroupId / adId. granularity is hourly, daily, monthly or none (default daily); the default window is the last 30 days; segment by country or device for a breakdown, and level rolls the rows up by campaign / ad group / ad. A report with NO rows genuinely means there was NO delivery in that window — say exactly that; never present zeros as measured performance. Read-only and free, so run it FIRST after connecting: it proves the key works with zero spend risk.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNo
levelNoroll rows up to this level
limitNo
sinceNoYYYY-MM-DD
untilNoYYYY-MM-DD
segmentNoextra group-by dimension (at most one)
adGroupIdNo
campaignIdNo
granularityNodefault daily

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
rowsNo
countNo
scopeNo
totalsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and openWorldHint annotations, the description adds critical behavioral context: a report with NO rows means no delivery, never present zeros as measured performance. It also clarifies that the tool is free and zero-risk, and explains default window and granularity behavior.

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 dense and front-loaded with key metrics, then explains scope, defaults, and the critical empty-row interpretation. Every sentence adds value; no redundancy or 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 output schema exists, the description covers all essential aspects: metrics, scope, time window, granularity, segment, level, and empty-result interpretation. It also addresses operational risk (free, read-only) and proves connectivity. Very complete for a report 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?

The description compensates for the 56% schema coverage by explaining the id scope semantics (none = whole account, or campaignId/adGroupId/adId), granularity defaults, segment options, and level roll-up. It doesn't describe the 'limit' parameter or the 'product' segment, but the schema already partially covers those.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a ChatGPT Ads performance report, listing specific metrics (impressions, clicks, spend, CTR, CPC, CPM). It distinguishes from sibling report tools by explicitly naming the platform (ChatGPT Ads) and specifying the resource scope.

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 provides strong guidance: 'run it FIRST after connecting: it proves the key works with zero spend risk.' It also explains scope options (account vs campaign/adGroup/ad) and default behavior. It doesn't explicitly mention alternatives or when not to use, but the context makes this clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pinterest_ads_async_reportPinterest deep (async) ad reportA
Read-only
Inspect

The DEEP Pinterest ad report — Pinterest’s ASYNCHRONOUS lane, which reaches 914 DAYS back (2.5 years) where pinterest_ads_report stops at 90, and carries roughly three times the metric columns (conversion, ROAS and cross-device families the quick report does not have). Use it for anything older than three months, and for revenue questions. Levels: ADVERTISER / CAMPAIGN / AD_GROUP / PIN_PROMOTION / KEYWORD / PRODUCT_GROUP / PRODUCT_ITEM plus their *_TARGETING twins. Pinterest generates it asynchronously, so this may come back pending:true with a token — CALL AGAIN WITH THAT TOKEN to pick it up, and never re-submit without it (a second submit generates a second report). Pinterest’s own windows are enforced here with the reason rather than as an opaque 400: 914 days back over at most 186 days; at HOUR granularity 8 days back over 3; at a PRODUCT_ITEM level 92 back over 31. A finished report link is valid five minutes and the report one hour, so an EXPIRED status means run it again, not that anything failed. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdsNo
levelNoADVERTISER | CAMPAIGN | AD_GROUP | PIN_PROMOTION | KEYWORD | PRODUCT_GROUP | PRODUCT_ITEM (+ _TARGETING variants) — default CAMPAIGN. An unknown level is refused with the list.
sinceNoYYYY-MM-DD (default 30 days ago)
tokenNoRESUME a pending report — pass the token back instead of re-submitting
untilNoYYYY-MM-DD (default today)
columnsNoPinterest async metric columns — omit for the standard spend/impressions/clicks/CTR/conversions set
adGroupIdsNo
adAccountIdNo
campaignIdsNo
granularityNo
reportFormatNo
targetingTypesNoonly valid with a *_TARGETING level

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
rowsNo
countNo
tokenNo
pendingNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses extensive behavioral traits: async generation, pending:true with token, re-submission pitfalls, Pinterest's enforced windows (914/186, HOUR 8/3, PRODUCT_ITEM 92/31), link expiration (5 minutes), report expiration (1 hour), and EXPIRED status meaning rerun. This far exceeds what annotations provide.

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 dense but every sentence earns its place—purpose, sibling comparison, use cases, levels, async mechanics, windows, expiration, and read-only status. It is front-loaded with the core purpose and handles complexity without unnecessary fluff.

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 async tool, the description is remarkably complete: it covers the entire lifecycle (submit, pending, token resume, expiration), time windows for all granularity/level combinations, levels list, and error semantics. Combined with an output schema, the agent has everything needed to invoke and handle the tool correctly.

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 covers only 50% of parameters, and the description compensates meaningfully: it explains the token parameter's role in resuming reports, enumerates valid levels, and relates since/until to time-window constraints. While not detailing every ID parameter, it adds significant context to the most operationally critical ones.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies this as an asynchronous Pinterest ad report with deep historical range and richer metrics, explicitly contrasting with pinterest_ads_report's 90-day limit and fewer columns. This provides a specific verb+resource+scope and differentiates from sibling tools.

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?

The description explicitly states when to use this tool: for anything older than three months and for revenue questions, directly pointing to the alternative pinterest_ads_report for quicker needs. It also gives critical operational guidance on resuming pending reports with a token and never re-submitting.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pinterest_ads_reportPinterest ads performance reportA
Read-only
Inspect

Performance for a Pinterest ad account — spend, impressions, clicks, CTR, effective CPC and conversions, by campaign. Window via since/until (YYYY-MM-DD) and granularity. Pinterest keeps only 90 days and refuses ranges longer than 90 days (at HOUR granularity: 8 days back, 3-day windows) — this refuses those up front with the reason rather than letting Pinterest return an opaque error. A report with ZERO rows genuinely means nothing delivered in that window; say exactly that and never present zeros as measured performance. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoYYYY-MM-DD, default 30 days ago
untilNoYYYY-MM-DD, default today
columnsNoPinterest metric column names — omit for the standard set
adAccountIdNo
campaignIdsNobreak down by campaign — omit for the whole ad account
granularityNodefault TOTAL

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
rowsNo
countNo
currencyNo
adAccountIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond the annotations: it discloses that the tool refuses invalid date ranges up front with a reason, that a zero-row report genuinely means no delivered data (never present zeros as measured performance), and that it is free. These are important traits not captured by the readOnlyHint/openWorldHint 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?

The description is compact and well-structured. It leads with the core purpose, then covers metrics, parameters, constraints, and interpretation of zero rows—all in four sentences. Every sentence contributes unique information, and there is no redundancy with the 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?

For a read-only report tool with an output schema and comprehensive annotations, the description is very complete. It covers purpose, parameter usage, behavioral constraints, and edge-case handling (zero rows). It even provides guidance on how to interpret results, which goes beyond what the schema or annotations offer.

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 high (83%), so the baseline is 3. The description adds valuable parameter constraints not present in the schema: the 90-day limit, the HOUR granularity specifics (8 days back, 3-day windows), and that omitting columns/campaignIds returns the standard set. This meaningfully helps an agent choose valid parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides performance metrics (spend, impressions, clicks, CTR, effective CPC, conversions) for a Pinterest ad account, with breakdown by campaign. It distinguishes itself from sibling report tools by explicitly naming the platform (Pinterest) and resource type (ad account).

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 context on when to use the tool: specify a date window with since/until, choose granularity, and it explains the 90-day restriction and refusal behavior. However, it does not explicitly mention alternatives (e.g., pinterest_analytics) or state when not to use this tool, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pinterest_analyticsPinterest organic analyticsA
Read-only
Inspect

ORGANIC Pinterest performance — impressions, saves, Pin clicks, outbound clicks and their rates, for the whole ACCOUNT, for the TOP PINS, for the TOP VIDEO PINS (with view-through and average watch time), or for ONE Pin. This is unpaid reach; pinterest_ads_report covers paid. Use scope:"top_pins" to answer "what is actually working on our Pinterest" — it ranks the account’s own Pins by whichever metric you sort on. NOTE Pinterest keeps only 90 DAYS of organic analytics and refuses a longer window, which is refused here with the reason rather than as an opaque error. A VIDEO Pin takes a different metric set from a static one (pass video:true for scope:"pin"). THERE IS NO BOARD ANALYTICS: Pinterest’s v5 API publishes no such endpoint, so board-level performance genuinely does not exist in any API — do not promise it. An unknown metric is refused by name, and a metric Pinterest omits from a row is MISSING data ("if a column has no value, it may not be returned"), never a measured zero. Works on Pinterest’s Trial access tier — unlike creating Pins, every read row in Pinterest’s access-tier table is available on Trial. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNotop_pins / top_video_pins: how many (1–50, default 10)
pinIdNorequired for scope:"pin" — the id post_to_pinterest returned
scopeNodefault account
sinceNoYYYY-MM-DD, default 30 days ago; Pinterest allows at most 90 days back
untilNoYYYY-MM-DD, default today
videoNoscope:"pin" only — true when the Pin is a VIDEO, which has its own metric set
sortByNotop_pins / top_video_pins: the metric to rank by (default the first metric)
appTypesNo
splitFieldNoaccount: NO_SPLIT | APP_TYPE | OWNED_CONTENT | SOURCE | PIN_FORMAT
metricTypesNowhich metrics; omit for all of the ones valid at this scope. Unknown values are refused with the valid list.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
dataNo
noteNo
scopeNo
sinceNo
untilNo
metricTypesNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/openWorldHint annotations, the description discloses critical behavioral nuances: 90-day data retention with explicit refusal reason, video pins having a different metric set, missing data being distinct from zero, unknown metric refusals, trial-tier access, and read-only/0 credits. No annotation contradiction.

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 detailed but every sentence serves a purpose: purpose, differentiation, scope guidance, critical caveats, and access-tier notes. It is front-loaded with the core functionality and uses strategic capitalization to emphasize limitations. Length is justified given the tool's complexity.

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 output schema exists (so return values need not be described), the description covers all essential behavioral context: scopes, paid vs organic, 90-day window, video/static distinction, absence of board analytics, missing-data semantics, and trial-tier availability. This is a thoroughly complete description for an analytics 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?

With 90% schema coverage, the baseline is 3, but the description adds meaningful context for several parameters: it explains the purpose of scope:"top_pins" (ranking), the need for video:true, sorting by metric with sortBy, and the behavior of unknown/missing metrics in metricTypes. It does not cover every parameter (appTypes, splitField), but schema already documents those adequately.

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 explicitly identifies the tool's function: retrieving organic Pinterest analytics (impressions, saves, clicks, rates) across multiple scopes (account, top pins, top video pins, single pin). It clearly distinguishes itself from pinterest_ads_report by stating 'This is unpaid reach; pinterest_ads_report covers paid,' and the title 'Pinterest organic analytics' aligns perfectly with the content.

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?

The description provides concrete guidance on when to use this tool versus pinterest_ads_report, explains the intended use of scope:"top_pins" to answer 'what is actually working on our Pinterest,' and warns against board-level analytics since the API has no such endpoint. It also gives specific parameter advice (e.g., passing video:true for video Pins).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pinterest_audience_insightsPinterest audience insightsA
Read-only
Inspect

WHO the Pinterest audience IS, rather than what it did — interest categories each carrying an affinity INDEX, plus demographics (ages, countries, devices, genders, metros). Three audiences: YOUR_TOTAL_AUDIENCE, YOUR_ENGAGED_AUDIENCE, and PINTEREST_TOTAL_AUDIENCE as the baseline to compare the other two against. This is an input to a creative brief, not a performance report. SAY THIS WHEN REPORTING: an affinity index is how much MORE likely this audience is to engage with a category than Pinterest’s baseline — it is a comparison, never a count — and when Pinterest flags size_is_upper_bound the audience size is an upper bound, not a measurement. There is no date range: Pinterest returns its current snapshot and names the date it is for. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
adAccountIdNo
insightTypeNodefault YOUR_TOTAL_AUDIENCE

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
dataNo
noteNo
categoriesNo
insightTypeNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description adds rich interpretive context: the meaning of affinity index as a comparison not a count, the size_is_upper_bound caveat, and the absence of date range. This goes well beyond what annotations provide and helps avoid misinterpretation.

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 front-loaded with the core distinction ('WHO... rather than what it did') and every sentence adds a distinct, useful detail: audience types, interpretation, date range, and cost. No filler or repetition.

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 moderate complexity and the presence of an output schema, the description covers all necessary context: purpose, usage, data interpretation, and limitations. It is self-sufficient and would allow an agent to select and invoke the tool correctly without additional information.

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 50% with only insightType having a description. The description adds semantic value by explaining the three audience options and the baseline role of PINTEREST_TOTAL_AUDIENCE, clarifying the enum. adAccountId is not explained, but the description partially compensates for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reveals who the Pinterest audience is (interest categories with affinity index and demographics), explicitly contrasting it with performance reporting ('rather than what it did'). This differentiates it from sibling analytics tools and establishes a specific, non-tautological purpose.

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 provides explicit usage context: 'This is an input to a creative brief, not a performance report.' This tells when to use the tool and when not to, though it doesn't name alternative tools for performance reporting, leaving a slight gap in alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pinterest_targeting_analyticsPinterest ads by audience segmentA
Read-only
Inspect

WHICH AUDIENCE SEGMENT actually delivered on Pinterest — ad performance broken down by keyword, targeted interest, age bucket, gender, location, region, country, placement, app type, media type and more. targetingTypes is REQUIRED because it is what the report breaks down BY. scope:"account" covers the whole ad account; "campaign" / "adGroup" / "ad" each REQUIRE their own id list, because Pinterest publishes no all-of-them form at those levels — that is Pinterest’s shape, not a limitation here. 90 days back in windows of at most 90 days, refused locally with the reason. An unknown targeting type is refused BY NAME; note Pinterest’s four per-level enums differ slightly, so a value valid at one level can still be refused at another. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdsNo
scopeNodefault account
sinceNo
untilNo
columnsNo
adGroupIdsNo
adAccountIdNo
campaignIdsNo
granularityNo
targetingTypesYesREQUIRED — e.g. KEYWORD, AGE_BUCKET, GENDER, LOCATION, PLACEMENT, MEDIA_TYPE, TARGETED_INTEREST, PINNER_INTEREST, COUNTRY, REGION

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
rowsNo
countNo
scopeNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint and openWorldHint; the description adds substantial behavioral details: local refusal with reason for date windows, refusal by name for unknown targeting types, and note that per-level enums differ slightly. This goes well beyond the annotations and explains error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the key value proposition, then interleaves crucial usage constraints and behavioral notes. Every sentence adds useful information—no fluff. Despite being longer than average, it is dense and well-structured.

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 (10 parameters, conditional requirements, time windows, error behavior), the description covers all critical operational aspects. Since an output schema exists, return values need not be described. The guidance on scope-specific id lists and enum discrepancies is especially valuable for correct invocation.

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 description coverage is only 20%, so the description must compensate. It thoroughly explains targetingTypes and scope, including conditional id list requirements. However, it does not elaborate on since/until, columns, or granularity, though these are standard and partially inferable from the breakdown list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: breaking down Pinterest ad performance by audience segment (keyword, interest, age, gender, location, etc.). This differentiates it from sibling reporting tools like pinterest_ads_report or pinterest_analytics, which likely provide aggregate or different breakdowns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for usage: targetingTypes is REQUIRED, scope behavior varies by level (account vs campaign/adGroup/ad requiring id lists), and date range limited to 90 days in 90-day windows. No explicit alternatives are named to siblings, but the purpose is clear enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_adPlan an ad conceptAInspect

Creative director: turn a brand + product/brief into a finished ad CONCEPT — copy variants (headline/primary/cta) plus an image_concept.prompt OR a video_storyboard, with the resolved recipe + the model ids to render with. Renders nothing; chain its output into generate_image / generate_video. THE USER’S EXPLICIT LENGTH IS SOVEREIGN: when they name a duration ("a 30 second ad", "make it 45s"), pass it as durationSeconds — the board is then AUTHORED to that length (its scenes sum to it) and render_ad renders it as one clip or stitched acts accordingly. Leaving it out lets the planner pick its own default, which is how an explicit ask silently becomes a 15s spot. Spends LLM tokens, 0 ScrapeCreators credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
hookNoforce the VISUAL scroll-stop mechanic the opening beat is built on — a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "macro_asmr"). Omit to let the planner pick. A hook that cannot be delivered in this brief is DROPPED with the reason rather than rendered wrongly — an on-screen-text hook on an authentic/UGC ad is the one that bites, because that register carries zero on-screen text.
brandNobrand name, or a brand profile object {name,domain,category,palette,products,…}. OMIT to use the workspace’s SAVED brand + memory automatically (see get_brand); use draft_brand to onboard a new one
formatNo'image', 'video', or 'auto' when unspecified
recipeNoa recipe id from hermoso_capabilities to force an archetype
productYeswhat to advertise + any angle/offer the user specified
settingNoforce the WHERE — a setting id from list_hooks (e.g. "kitchen", "gym", or a surreal one like "volcano_rim" / "airplane_wing", which are played 100% straight and never acknowledged). Omit for a neutral setting.
languageNooutput language for the ad copy (e.g. Spanish) — default English
referenceNoa reference ad URL to remix the angle from — Facebook Ad Library, LinkedIn Ad Library or Google Ads Transparency links (the real ad’s copy/advertiser are fetched and fed into the concept)
durationSecondsNoVIDEO ONLY — the total spot length the user explicitly asked for, in seconds, copied verbatim (30 for "a 30 second ad"). The planner authors the storyboard TO it: the scenes’ seconds sum to it and the script is word-budgeted for it. Supported range 4–180; anything outside is CLAMPED to it (the reply says so). One model clip caps at 15s, so ≤15 renders as a single continuous pass and anything longer is STITCHED from acts filled to 15s with the remainder last (40 → 15+15+10, 17 → 13+4) — never time-compressed. Omit when the user named no length; do NOT pass a guess, an omitted value keeps the recipe-aware default.

Output Schema

ParametersJSON Schema
NameRequiredDescription
copyNocopy variants ({headline, primary, cta})
brandNothe brand grounding embedded in the creative (name, logo, palette, productImages)
formatNothe resolved creative format — 'image' or 'video'
imodelNothe image model id to render with
recipeNothe resolved recipe id
vmodelNothe video model id to render with
conceptNothe one-line creative concept
render_planNothe routing plan (structure/duration) render_ad honors
recipe_labelNothe resolved recipe display name
image_conceptNothe render-ready image concept (prompt etc.) when format is image
video_storyboardNothe timed storyboard (scenes, cta, music) when format is video
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false and provide no behavioral hints, so the description carries the full burden. It discloses token/credit costs, hook-dropping behavior, duration clamping/stitching, and the fact that no rendering happens. This is rich, candid behavioral 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?

The description is dense and verbose but well-structured, starting with the core purpose and then covering important edge cases. The all-caps warning and parentheticals add personality and emphasis, though some phrases could be trimmed 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?

The description covers the tool's output shape, downstream chain, cost profile, parameter behaviors, and key constraints. Since an output schema exists, detailed return-value documentation is unnecessary. It is complete for a complex 9-parameter creative planning 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 100% with detailed parameter descriptions, giving a baseline of 3. The description adds meaningful behavioral context for durationSeconds (stitching logic, 'do NOT pass a guess') and hook dropping, though much of this overlaps with schema text. It earns an extra point for reinforcing the most critical parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'turn a brand + product/brief into a finished ad CONCEPT' including copy variants, an image prompt or video storyboard, recipe, and model IDs. It also differentiates from sibling tools by explicitly saying 'Renders nothing' and directing output to generate_image/generate_video.

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 solid usage context: it explains the tool produces a concept only, should be chained into generation tools, and clarifies when to pass durationSeconds versus omit it. It doesn't explicitly mention alternatives like plan_variations, but the chain guidance effectively orients the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_variationsPlan ad variationsAInspect

Fan a brief into N DISTINCT ad angles (different hooks/mechanics/audiences), each with its own headline + visual brief — then render each with generate_image and rank with score_ad. LLM planning only; renders nothing itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandNobrand name or profile object; OMIT to use the workspace’s saved brand
countNohow many distinct variants (default 6)
productYeswhat to advertise
languageNooutput language for the variant copy (e.g. Spanish) — default English

Output Schema

ParametersJSON Schema
NameRequiredDescription
anglesNoalternate key the planner may return the variants under
variantsNothe distinct ad angles ({name, hook, headline, visual brief})
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (all false), the description discloses a key behavioral trait: 'renders nothing itself' and 'LLM planning only'—clarifying that the tool has no rendering side effects. This adds value over the annotations, though it doesn't mention other aspects like credit usage or determinism.

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 sentences with no filler. The first sentence packs the core functionality and output structure, while the second clarifies the non-rendering limitation. Front-loaded and highly efficient.

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 and annotations provided, the description covers the essentials: purpose, output format, downstream tools, and a key limitation. A minor ambiguity is that it mentions 'fan a brief' but there is no explicit 'brief' parameter, assuming the product/brand context constitutes the brief. Overall, it is complete enough for an agent to select and call 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 all parameters (brand, count, product, language) are already documented. The description adds minimal extra meaning beyond the schema, mainly connecting 'count' to 'N DISTINCT ad angles.' This is an acceptable baseline given high schema coverage.

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 uses a specific verb ('Fan') and resource ('a brief') to explain the tool's output: N distinct ad angles with headlines and visual briefs. It clearly distinguishes itself from siblings by stating 'LLM planning only; renders nothing itself' and referencing downstream tools (generate_image, score_ad).

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 provides clear context for when to use the tool (to plan multiple ad angles) and explicitly notes it does not render ('LLM planning only; renders nothing itself'), which sets an exclusion. It also references downstream tools, implying a workflow, but does not explicitly name alternatives like plan_ad or mine_angles for contrast.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_editPost-production editAInspect

MECHANICAL post-production on an EXISTING rendered video (its served mp4 URL) — an ordered plan of whitelisted primitives executed by ffmpeg (+ Chrome for typeset cards) in seconds for ~2 credits flat, NO AI model, the original untouched (returns a NEW video). The lane for: append a branded end card ('add an end card with our logo and website' — ADDS its seconds, never re-renders), trim, speed (0.5-2x), mute (whole or a window), audio_gain (-20..+6 dB), fade_out, corner logo watermark, anti-AI film grain. Up to 6 ops per plan, applied in order. Brand assets (name/domain/logo/accent) load from the workspace brand automatically; override per-call if needed. NEVER use generate_video/render_ad for these mechanical asks.

ParametersJSON Schema
NameRequiredDescriptionDefault
opsYesthe ordered edit plan (max 6 ops)
accentNooverride the brand accent hex
domainNooverride the brand website
videoUrlYesthe served URL of the video to edit
brandNameNooverride the workspace brand name

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations, disclosing concrete behavioral details: it's executed by ffmpeg (+ Chrome), costs ~2 credits flat, runs in seconds, uses no AI model, leaves the original untouched, returns a new video, and applies ops in order. It also explains that append_card adds seconds without re-rendering and that brand assets load automatically with overrides available. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries essential information. It front-loads the core purpose ('MECHANICAL post-production on an EXISTING rendered video'), then lists operations, constraints, cost, and alternatives without redundancy. It is long but appropriately so for a complex tool, with zero 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?

The description fully covers the tool's operational context: input requirements (served mp4 URL), operation list, ordering and max ops, brand asset behavior, cost, and exclusions. Since an output schema exists, return values are already documented. The edge case of card design via card_html and the brand color override are also addressed, making the description highly complete for agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds significant meaning beyond the schema. It explains the purpose of the videoUrl (served mp4 URL), clarifies the ops array structure (ordered plan, max 6), and details brand override behavior for brandName/domain/accent. Examples like 'add an end card with our logo and website' and the brand fallback logic enrich parameter understanding beyond raw descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the tool's function: performing mechanical post-production on an existing rendered video using an ordered plan of whitelisted primitives. It enumerates the supported operations (trim, speed, mute, audio_gain, fade_out, append_card, watermark, grain), distinguishes itself from generate_video/render_ad, and states it returns a NEW video while leaving the original untouched.

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 provides explicit guidance on when to use this tool: for mechanical edits like appending an end card, trimming, or watermarking. It explicitly says 'NEVER use generate_video/render_ad for these mechanical asks,' naming alternatives and excluding them. The 'lane for' phrasing and the 'up to 6 ops per plan' constraint further clarify usage boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_performanceWhich hooks and subjects are getting tractionA
Read-only
Inspect

Aggregate this brand's published posts to answer WHICH HOOKS AND SUBJECTS WORK. Groups by hook (default), subject, channel, media format or posting hour, and reports the engagement RATE within each channel. THREE THINGS IT DELIBERATELY WILL NOT DO, and you should repeat them rather than paper over them: (1) it never sums metrics across channels — a LinkedIn impression and a TikTok view are different units, so every comparison is within one channel; (2) it SUPPRESSES a verdict below 5 measured posts and says so, because a confident recommendation from 3 posts is worse than none; (3) a post with no recorded hook (published outside Hermoso, or backfilled without a creation match) counts toward channel and format totals but never votes on which hook works. Present the finding verbatim if there is one, and the reason if there is not. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
axisNowhat to group by — default hook
channelNorestrict to one channel

Output Schema

ParametersJSON Schema
NameRequiredDescription
axisNo
minNNo
groupsNo
findingNo
totalPostsNo
excludedUnattributedNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses critical behavioral constraints: never sums across channels, suppresses verdicts below 5 posts, excludes unclassified posts from hook analysis, and instructs to present the `finding` verbatim. It also notes 'Read-only, 0 credits' which adds measurable context.

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 well-structured and front-loaded with the main purpose, followed by clearly labeled limitations in a numbered list. Every sentence adds value, and the length is justified by the tool's complexity and need for precise caveats.

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?

The description covers all necessary context: what the tool does, its grouping behavior, limitations, output handling ('Present the `finding` verbatim'), and safety profile. With an output schema available and annotations provided, nothing else is needed for an agent to use the tool appropriately.

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%, providing parameter names and enum values. The description adds meaning by explaining the default axis ('default hook'), clarifying that grouping can be by subject, channel, media format, or posting hour, and that engagement rate is reported 'within each channel', which enriches the channel parameter's purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Aggregate this brand's published posts to answer WHICH HOOKS AND SUBJECTS WORK.' It specifies the grouping options (hook, subject, channel, media format, hour) and the metric (engagement rate), distinguishing it from sibling analytics tools.

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 strong contextual guidance for when to use the tool, especially the three explicit limitations ('will never sum metrics across channels', 'suppresses a verdict below 5 posts', and posts without hook don't vote). However, it does not name any alternative tools for scenarios like cross-channel reporting or small sample sizes, so it lacks explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_to_google_businessPost to Google Business ProfileAInspect

Publish a Post to the brand’s Google Business Profile — the panel that appears on Google Search and Maps for the business. Text, optionally ONE PHOTO, and a call-to-action button. Google’s Posts API accepts NO VIDEO, so pass a still image. This PUBLISHES immediately and publicly on the business listing — show the user the exact text, photo and button and get an explicit yes BEFORE calling. If the account manages several listings, call list_business_locations first and pass locationId. EVENT and OFFER posts both REQUIRE a title and a start date (Google’s rule). On an OFFER, Google IGNORES the button’s link — pass redeemOnlineUrl instead. A CALL button dials the number on the listing and takes no link. Needs Google Business Profile connected (Settings ▸ Connectors ▸ Google Business Profile).

ParametersJSON Schema
NameRequiredDescriptionDefault
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
linkNothe URL the button opens — not for CALL, and ignored on an OFFER
titleNoheadline — REQUIRED for EVENT and OFFER
endDateNoYYYY-MM-DD, defaults to startDate
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
summaryNothe body text of the Post
imageUrlNoa Hermoso render image URL (or an upload_file url) to show on the Post
startDateNoYYYY-MM-DD — REQUIRED for EVENT and OFFER
topicTypeNodefault STANDARD
actionTypeNothe button on the Post
couponCodeNoOFFER only
locationIdNowhich listing, e.g. 'locations/123' from list_business_locations — only needed when the account manages more than one
languageCodeNoBCP-47 language of the Post, default 'en'
redeemOnlineUrlNoOFFER only — this is the link Google actually uses on an offer
termsConditionsNoOFFER only

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
urlNo
stateNo
locationNo
topicTypeNo
locationIdNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a non-read-only, non-idempotent, non-destructive operation. The description adds critical behavioral context: publishes immediately and publicly, requires explicit user consent, and explains link/button behavior for OFFER and CALL. This goes beyond the annotation hints.

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 longer than typical but every sentence carries unique information. It is front-loaded with the core purpose, then follows with constraints and usage rules. While dense, it avoids fluff and remains focused on actionable details.

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 tool with 15 parameters, no required fields, and multiple Google-specific rules, the description covers all key aspects: prerequisites, multi-location handling, post-type constraints, button restrictions, and connector requirements. An output schema exists, so return values need no description. It is comprehensive without being redundant.

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% with detailed parameter descriptions for hook and subject. The tool description adds valuable cross-parameter rules: EVENT/OFFER require title and startDate, OFFER ignores the link parameter in favor of redeemOnlineUrl, CALL takes no link. This enriches the meaning of individual parameters 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?

The description opens with 'Publish a Post to the brand’s Google Business Profile' — a specific verb and resource. It clearly distinguishes this from siblings like post_to_meta and post_to_linkedin by naming Google Business Profile, the search/maps panel, and unique constraints (no video, one photo, CTA button).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage guidance: call list_business_locations first for multi-listing accounts, get user confirmation before immediate public publish, and specific rules for EVENT/OFFER/CALL posts. It doesn't explicitly name sibling alternatives but gives strong when-to-use and when-not characteristics (e.g., 'Google’s Posts API accepts NO VIDEO').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_to_linkedinPublish to LinkedInAInspect

Publish a post to the user’s connected LinkedIn profile — text, and optionally an image (pass its served URL as imageUrl). The image does NOT have to be something Hermoso generated: LinkedIn is served the bytes from us, so the URL must be Hermoso-hosted, and upload_file turns ANY file the user already has into exactly that. This PUBLISHES immediately and PUBLICLY — ALWAYS show the user the exact text and get an explicit yes BEFORE calling. Needs a connected LinkedIn account (Settings ▸ Connectors ▸ LinkedIn).

ParametersJSON Schema
NameRequiredDescriptionDefault
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
textYesthe post text
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
imageUrlNoa Hermoso-hosted image URL to attach (≤12MB) — a Hermoso render, or ANY file of the user’s own put through upload_file first. An arbitrary external host is refused (we fetch the bytes ourselves).
imageUrlsNoA CAROUSEL IS NOT AVAILABLE ON A PERSONAL PROFILE — LinkedIn's organic multi-image post publishes from a COMPANY PAGE. Passing several here is refused by name rather than posting slide 1; use post_to_linkedin_page instead.
visibilityNodefault PUBLIC
allowDuplicateNopost it even though an identical post was just made or attempted. Only pass this when the user genuinely wants the same thing posted twice, or when you have LOOKED at the account and confirmed a timed-out attempt did not land.
idempotencyKeyNoSAFE RETRIES. Publishing can take minutes (a video upload, a carousel of ten slides) and a transport can time out while the post SUCCEEDS — retrying blind is how the same thing gets posted twice. Pass any stable string here and a repeat of the SAME publish returns the ORIGINAL post id instead of posting again (24h). You do not have to: an identical publish is auto-recognised for 10 minutes anyway. If a call times out or errors ambiguously, CALL AGAIN WITH THE SAME KEY — that is the safe move, and it will either report the original post or publish it for the first time. It never posts twice.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
urlNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the post publishes immediately and publicly, and mandates showing the user the exact text and obtaining explicit consent. This goes beyond the annotations (readOnlyHint=false) by explaining the irreversible, public nature of the action, and also notes the account prerequisite. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, covering purpose, image requirement, user-approval mandate, and account prerequisite in just four sentences. Every sentence carries essential information, and the approval warning is effectively emphasized with capitalization.

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 description covers the essential behavioral contract (public, immediate, requires consent) and prerequisite, while the schema documents all parameters, enums, and idempotency behavior in depth. An output schema exists, so return values are covered elsewhere. The tool is complex, but the combination of description and rich schema is sufficient 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?

The schema has 100% parameter coverage with rich descriptions for all 8 parameters, including idempotency and duplicate handling. The main description adds a clarification that the image need not be Hermoso-generated and must be Hermoso-hosted, which is already covered in the schema's imageUrl description. This is a minor addition, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool publishes a post to the user's connected LinkedIn profile, optionally with an image. It is specific about the resource (LinkedIn profile) and action (publish), and distinguishes from the sibling tool post_to_linkedin_page by implying personal profile use.

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 provides a clear prerequisite (connected LinkedIn account) and a critical usage requirement (get explicit user approval before publishing). While it doesn't name alternatives in the main description, the schema's imageUrls parameter explicitly directs carousel posts to post_to_linkedin_page instead, giving clear when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_to_linkedin_pagePublish to a LinkedIn company PageAInspect

Publish a post to one of the user’s LinkedIn COMPANY PAGES — text, plus optionally an image, a video, or a 2–20 image CAROUSEL (LinkedIn calls it a MultiImage post; pass the slides in order as imageUrls[]). The media need not be a Hermoso render — it must be Hermoso-HOSTED because we upload the bytes to LinkedIn ourselves, and upload_file turns ANY file the user already has into such a URL. ORGANIC CAROUSELS ARE COMPANY-PAGE ONLY — a personal profile cannot publish one and is refused by name, so send a deck here rather than to post_to_linkedin. This is a DIFFERENT thing from post_to_linkedin, which publishes to the person’s own profile: pick the one the user actually asked for and never substitute. organizationId comes from list_linkedin_pages; omit it only when the account administers exactly one Page. This PUBLISHES immediately and PUBLICLY — ALWAYS show the user the exact text and get an explicit yes BEFORE calling. LinkedIn does NOT allow the image or video of a published post to be swapped afterwards, so get the visual right first (the copy can still be edited with manage_linkedin_post).

ParametersJSON Schema
NameRequiredDescriptionDefault
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
textYesthe post text
titleNovideo title
altTextNo
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
imageUrlNoa Hermoso-hosted image URL — a render (list_library), or ANY image of the user’s own passed through upload_file first. An arbitrary external host is refused.
videoUrlNoa Hermoso-hosted video URL — a render, or the user’s own footage via upload_file. LinkedIn processes it before publishing, which takes a minute.
imageUrlsNoCAROUSEL — an ORDERED list of image (and, where the channel allows, video) URLs published as ONE post the viewer swipes through. THIS IS NOT “post several” — it is a single post with several slides, which is what a multi-slide creative (a listicle, a “1/6 · SWIPE” deck) actually needs; publishing only its first slide tells the viewer to swipe at something that cannot. The ORDER is the product. Limits per channel: Instagram 2–10 (images, videos or a mix), Threads 2–20 (mix allowed), Facebook 2+ (Meta publishes no documented maximum; Hermoso caps the upload fan-out at 30 and says so), LinkedIn company Pages 2–20 (images only), Pinterest 2–5 (images only), TikTok up to 35. One url here is simply an ordinary single post. Anything a channel cannot do is REFUSED with the real reason — nothing is ever quietly downgraded to one slide.
visibilityNodefault PUBLIC
allowDuplicateNopost it even though an identical post was just made or attempted. Only pass this when the user genuinely wants the same thing posted twice, or when you have LOOKED at the account and confirmed a timed-out attempt did not land.
idempotencyKeyNoSAFE RETRIES. Publishing can take minutes (a video upload, a carousel of ten slides) and a transport can time out while the post SUCCEEDS — retrying blind is how the same thing gets posted twice. Pass any stable string here and a repeat of the SAME publish returns the ORIGINAL post id instead of posting again (24h). You do not have to: an identical publish is auto-recognised for 10 minutes anyway. If a call times out or errors ambiguously, CALL AGAIN WITH THE SAME KEY — that is the safe move, and it will either report the original post or publish it for the first time. It never posts twice.
organizationIdNonumeric Page id from list_linkedin_pages

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
urlNo
noteNo
organizationIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond annotations: it publishes immediately and publicly, requires explicit user confirmation, and notes that images/videos cannot be swapped after publishing. It also explains the Hermoso-hosted media requirement and the upload_file path. This goes well beyond the readOnlyHint/idempotentHint annotations and provides actionable transparency.

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 but efficient, covering the core purpose, media formats, key constraints, and a strong warning about user confirmation. Every sentence adds necessary context (e.g., media hosting, sibling distinction, irreversibility), and it is front-loaded with the primary action. Slightly long given the complexity, but each sentence earns its place.

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 tool with 12 parameters, an output schema, and complex media-related constraints, the description is remarkably complete. It addresses the key operational risks (immediate public publishing, irreversible media, confirmation requirement) and clarifying constraints (carousel limits, organizationId sourcing) without needing to explain return values thanks to the output schema. This is a fully specified tool description.

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 description coverage is 92%, so baseline is 3. The tool description adds value by clarifying that media must be Hermoso-hosted (with upload_file as a path), that organizationId comes from list_linkedin_pages, and when to omit it. It does not redundantly restate the schema's detailed field descriptions, but adds meaningful cross-parameter context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool publishes to LinkedIn company pages, not personal profiles, and explicitly differentiates it from post_to_linkedin. It enumerates supported media types (text, image, video, carousel) and scopes the action precisely. This is a specific verb+resource+scope with direct sibling differentiation.

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?

The description provides explicit when-to-use guidance: company pages vs personal profile, carousels being company-page-only, and the instruction to 'pick the one the user actually asked for and never substitute.' It also references list_linkedin_pages for organizationId and explains when to omit it. This is exemplary usage guidance with clear exclusions and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_to_metaPost to Facebook, Instagram or ThreadsAInspect

Publish to a connected Facebook Page, its linked Instagram, OR the brand’s Threads account — text/link/image/VIDEO/CAROUSEL. A MULTI-SLIDE creative is a CAROUSEL, not several posts: pass the slides in order as imageUrls[] and they publish as ONE swipeable post (Instagram album, Threads carousel, Facebook multi-photo post). Never publish slide 1 of a deck on its own — the creative tells the viewer to swipe. target:"facebook" (default) posts to the Page; target:"instagram" publishes a photo or Reel to the linked IG business account (needs an image or video); target:"threads" posts to the connected Threads account (text, image, or video). Works with ANY media — a finished Hermoso ad OR an arbitrary user file: imageUrl/videoUrl accept a public https URL, a data: URI, or a Hermoso /generated path; for a LOCAL file (e.g. on the user’s desktop) call upload_file first and pass the url it returns. This PUBLISHES immediately — confirm the copy + media with the user first. Needs a connected Meta account (Settings ▸ Connectors ▸ Meta) with posting permission; Threads needs its own connection.

ParametersJSON Schema
NameRequiredDescriptionDefault
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
linkNoa URL to attach (FB text post only)
asyncNopublish in the BACKGROUND and return a job id to poll with get_job, instead of waiting. USE THIS FOR VIDEO: a Facebook or Instagram video publish routinely outlives an agent transport, and a timeout on the synchronous path leaves you unable to tell whether the post is live. With async:true nothing can time out — the job reports the post id and url when it lands.
pageIdNotarget Page id (from list_meta_pages); omit = first Page
targetNodefault facebook; instagram → the Page’s linked IG; threads → the brand’s connected Threads account
messageNopost text / caption
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
imageUrlNopublic https URL, a data: URI, or a Hermoso /generated path (upload_file gives you one for a local file)
videoUrlNopublic https URL, data: URI, or /generated path — FB video post / IG Reel
imageUrlsNoCAROUSEL — an ORDERED list of image (and, where the channel allows, video) URLs published as ONE post the viewer swipes through. THIS IS NOT “post several” — it is a single post with several slides, which is what a multi-slide creative (a listicle, a “1/6 · SWIPE” deck) actually needs; publishing only its first slide tells the viewer to swipe at something that cannot. The ORDER is the product. Limits per channel: Instagram 2–10 (images, videos or a mix), Threads 2–20 (mix allowed), Facebook 2+ (Meta publishes no documented maximum; Hermoso caps the upload fan-out at 30 and says so), LinkedIn company Pages 2–20 (images only), Pinterest 2–5 (images only), TikTok up to 35. One url here is simply an ordinary single post. Anything a channel cannot do is REFUSED with the real reason — nothing is ever quietly downgraded to one slide.
locationIdNoThreads only — a place id from search_threads_locations, to geotag the post to a physical location (restaurant, storefront)
scheduleAtNoFACEBOOK ONLY — schedule instead of posting now. ISO timestamp (2026-08-01T09:00:00Z) or unix seconds; must be 10 minutes to 30 days ahead. Facebook holds the post and publishes it at that time, so nothing has to stay running on our side. Instagram and Threads have NO scheduling in Meta’s API — passing this for them is refused rather than silently posted immediately.
allowDuplicateNopost it even though an identical post was just made or attempted. Only pass this when the user genuinely wants the same thing posted twice, or when you have LOOKED at the account and confirmed a timed-out attempt did not land.
idempotencyKeyNoSAFE RETRIES. Publishing can take minutes (a video upload, a carousel of ten slides) and a transport can time out while the post SUCCEEDS — retrying blind is how the same thing gets posted twice. Pass any stable string here and a repeat of the SAME publish returns the ORIGINAL post id instead of posting again (24h). You do not have to: an identical publish is auto-recognised for 10 minutes anyway. If a call times out or errors ambiguously, CALL AGAIN WITH THE SAME KEY — that is the safe move, and it will either report the original post or publish it for the first time. It never posts twice.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
pageNo
postIdNo
targetNo
accountNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing immediate publishing side effects, Meta account and permission prerequisites, duplicate-post auto-recognition, idempotency-key safe retries, and the async recommendation for video. No contradictions with annotations were found.

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 unique operational value: the carousel rule, target defaults, media formats, confirmation requirement, and connector prerequisites. It is front-loaded with the core purpose and then builds to critical cautions.

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 high-complexity 14-parameter publish tool with an output schema, the description covers prerequisites, per-channel behavior, failure modes (timeouts, duplicates), and media handling. Nothing critical is missing for an agent to select and invoke the tool correctly.

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, but the description adds meaningful cross-parameter semantics: target defaults and behavior, accepted URL schemes for imageUrl/videoUrl, carousel ordering, scheduling restrictions, and the upload_file workflow. These additions raise it above 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?

The description uses a specific verb ('Publish') and clearly enumerates the resources: connected Facebook Page, linked Instagram, and Threads account. It also lists media types and distinguishes itself from platform-specific siblings like post_to_tiktok and post_to_x.

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?

The description explicitly states when to call upload_file for local files, warns against publishing only the first slide of a deck, and gives channel-specific exclusions (e.g., no scheduling for Instagram/Threads). It also instructs the agent to confirm with the user before the immediate publish action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_to_pinterestCreate a PinAInspect

Create a Pin on one of the user’s Pinterest boards from any finished visual they have — image, video, or a 2–5 slide CAROUSEL (pass the slides in order as imageUrls[] and Pinterest publishes one swipeable Pin). Title, description and destination link ride along. The link is what makes a Pin drive traffic, so ask for it rather than omitting it, and the description is the text Pinterest search actually reads. boardId is REQUIRED: call list_pinterest_boards first and let the user choose. This PUBLISHES to their public profile — confirm the board, title and link before calling. Video Pins take a minute or two while Pinterest ingests the file. Needs Pinterest connected (Settings ▸ Connectors ▸ Pinterest).

ParametersJSON Schema
NameRequiredDescriptionDefault
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
linkNodestination URL the Pin clicks through to
titleNoPin title, max 100 characters
altTextNoaccessibility alt text, max 500 characters
boardIdYesnumeric board id from list_pinterest_boards — the user picks it, never guess
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
imageUrlNoa Hermoso render image URL (or an upload_file url)
videoUrlNoa Hermoso render video URL — takes 1–2 minutes to ingest
imageUrlsNoCAROUSEL — an ORDERED list of image (and, where the channel allows, video) URLs published as ONE post the viewer swipes through. THIS IS NOT “post several” — it is a single post with several slides, which is what a multi-slide creative (a listicle, a “1/6 · SWIPE” deck) actually needs; publishing only its first slide tells the viewer to swipe at something that cannot. The ORDER is the product. Limits per channel: Instagram 2–10 (images, videos or a mix), Threads 2–20 (mix allowed), Facebook 2+ (Meta publishes no documented maximum; Hermoso caps the upload fan-out at 30 and says so), LinkedIn company Pages 2–20 (images only), Pinterest 2–5 (images only), TikTok up to 35. One url here is simply an ordinary single post. Anything a channel cannot do is REFUSED with the real reason — nothing is ever quietly downgraded to one slide.
descriptionNoPin description, max 800 characters — this is what Pinterest search reads
coverImageUrlNovideo Pins only — a render to use as the cover frame
allowDuplicateNopost it even though an identical post was just made or attempted. Only pass this when the user genuinely wants the same thing posted twice, or when you have LOOKED at the account and confirmed a timed-out attempt did not land.
boardSectionIdNooptional section within the board
idempotencyKeyNoSAFE RETRIES. Publishing can take minutes (a video upload, a carousel of ten slides) and a transport can time out while the post SUCCEEDS — retrying blind is how the same thing gets posted twice. Pass any stable string here and a repeat of the SAME publish returns the ORIGINAL post id instead of posting again (24h). You do not have to: an identical publish is auto-recognised for 10 minutes anyway. If a call times out or errors ambiguously, CALL AGAIN WITH THE SAME KEY — that is the safe move, and it will either report the original post or publish it for the first time. It never posts twice.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
urlNo
kindNo
titleNo
boardIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint=false), the description warns 'This PUBLISHES to their public profile — confirm the board, title and link before calling,' which is a significant behavioral disclosure. It also discloses video ingest latency ('Video Pins take a minute or two') and the connector prerequisite ('Needs Pinterest connected'). These go well beyond what annotations already convey.

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 a dense paragraph but every sentence adds operational value: media types, link importance, required boardId, publication warning, latency, and connector setup. It is long but not wasteful; it is front-loaded with the core action and remains readable.

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?

Given the tool's complexity (14 params, mutations, output schema), the description covers the essential context: accepted media, board selection prerequisite, public visibility, latency, and auth requirement. It does not need to explain return values because an output schema exists. The coverage is sufficient for an agent to decide and invoke correctly.

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?

All 14 parameters already have detailed schema descriptions, so the baseline is 3. The description adds cross-parameter meaning by explaining how media types map to parameters (e.g., carousel slides as imageUrls[]), emphasizing the link's importance, and mandating the boardId workflow. This supplements the schema usefully.

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 specific verb and resource: 'Create a Pin on one of the user’s Pinterest boards.' It clearly distinguishes this from sibling post_to_* tools by naming Pinterest, boards, and the accepted media types (image, video, carousel). No ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit operational guidance: 'boardId is REQUIRED: call list_pinterest_boards first and let the user choose,' ask for the link rather than omitting it, and confirm before publishing. It does not name alternative tools, but the Pinterest-specific steps are clear and actionable. No exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_to_redditPost to a subredditAInspect

Submit a post to ONE named subreddit as the user’s connected Reddit account — a text post, a link post, or a native image post (pass a Hermoso render URL as imageUrl). This PUBLISHES immediately and PUBLICLY under their username, so show the user the exact subreddit, title and body and get an explicit yes BEFORE calling. REDDIT IS NOT A BROADCAST CHANNEL: it punishes undisclosed self-promotion harder than any other platform, and posting the same or near-identical content to several subreddits breaks Reddit’s own developer policy and gets accounts banned. Post to ONE subreddit, written for that specific community — if the user asks to blast several, tell them this instead of doing it. Subreddits that require post flair are detected before anything is posted and the error lists the valid flairs to pass as flairId. Needs Reddit connected (Settings ▸ Connectors ▸ Reddit).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNothe destination url for a link post
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
kindNo"self" = text post (default), "link" = share a url, "image" = native image upload. Inferred from what you pass if omitted.
nsfwNo
textNobody markdown for a text post
titleYespost title, max 300 characters
flairIdNoflair template id — required by some subreddits; the error names the valid ones
spoilerNo
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
imageUrlNoa Hermoso render image URL for a native image post (or an upload_file url)
resubmitNopost a link Reddit says was already submitted — usually reads as spam, so confirm first
flairTextNoflair text, only where that flair is editable
subredditYesthe ONE subreddit to post to, e.g. "SideProject" (an r/ prefix is fine)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
urlNo
kindNo
pendingNo
fullnameNo
subredditNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond annotations: discloses that the post 'PUBLISHES immediately and PUBLICLY', warns about Reddit's enforcement against undisclosed self-promotion and duplicate content, and explains flair detection behavior. Annotations only indicate non-read-only, but the description adds crucial real-world consequences.

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 dense but every sentence earns its place: it starts with the core action, then covers key risks, usage rules, and error handling, all in a compact paragraph without redundancy.

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 tool with 13 parameters and a public-posting action, the description covers prerequisites, consent, policy risks, platform-specific nuances, and error behavior. Output schema exists, so return details are not needed. It is fully sufficient to guide correct invocation.

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 high (85%), but the description adds context beyond schema: clarifies that imageUrl should be a 'Hermoso render URL' for native image posts, and explains that flairId is used when subreddits require flair, based on detected errors. The emphasis on 'ONE' subreddit adds meaning to the subreddit parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Submit a post to ONE named subreddit as the user’s connected Reddit account' with explicit post types (text, link, image). It distinguishes from siblings by emphasizing the 'ONE' subreddit constraint and the public nature of publishing.

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 guidance on when to use and when not to: 'Post to ONE subreddit, written for that specific community — if the user asks to blast several, tell them this instead of doing it.' Also requires user consent before posting, and mentions the need for Reddit connection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_to_tiktokPost a video or photo post to TikTokAInspect

Publish to the user’s connected TikTok account — a finished VIDEO, or a PHOTO POST (TikTok’s photo/slideshow format). A photo post carries 1 to 35 images and ONE image is simply a one-slide photo post, so there is nothing special to do for a single picture: pass imageUrls, in the order the slides should appear, and optionally coverIndex. Pass videoUrl for a video. Never pass both — TikTok has no mixed post. TWO destinations either way: destination:"post" puts it LIVE on their profile now — that requires privacy, and you must call tiktok_creator_info first, show the creator’s real privacy options and get an explicit yes before calling. destination:"draft" (the default, and the safer one) sends it to TikTok for the user to finish and post themselves from the app. Pass Hermoso render URLs (or upload_file urls for local/external files). Needs TikTok connected (Settings ▸ Connectors ▸ TikTok).

ParametersJSON Schema
NameRequiredDescriptionDefault
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
titleNothe caption — hashtags go here (video ≤2200 chars, photo post ≤4000)
privacyNoREQUIRED for destination:"post", for photos and video alike. Must be one the creator actually allows — read them from tiktok_creator_info, never guess.
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
videoUrlNothe video to post — a Hermoso render URL or an upload_file url. Omit for a photo post.
imageUrlsNoa PHOTO POST: 1–35 image URLs in slide order. One url = a single-image photo post. Do not combine with videoUrl.
yourBrandNodiscloses that this promotes the creator’s own brand
coverIndexNophoto posts: which slide is the cover, 0-based. Default 0 (the first slide).
photoTitleNophoto posts only: a short title above the caption (≤90 chars). Defaults to the caption’s first line.
destinationNo"post" = live on the profile now (needs privacy + an explicit user yes); "draft" = to TikTok for the user to review and post themselves. Default "draft".
disableDuetNovideo only — TikTok has no duet on a photo post
autoAddMusicNophoto posts only: let TikTok add a recommended track (default true — a silent slideshow reads as broken)
disableStitchNovideo only — TikTok has no stitch on a photo post
brandedContentNodiscloses a paid partnership — cannot be combined with SELF_ONLY privacy
disableCommentNo
coverTimestampMsNovideo only: which frame to use as the cover, in ms

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
mediaNo
imagesNo
postIdNo
statusNo
accountNo
pendingNo
publishIdNo
coverIndexNo
destinationNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and openWorldHint=true, so the description builds on that by explaining the behavioral difference between live and draft, the user consent requirement, and the need for TikTok to be connected. It doesn't cover every edge case (e.g., rate limits) but gives substantial behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and continues with the most important constraints. It is somewhat long but each sentence provides necessary information for a tool with 16 parameters, making the length justified.

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 description covers the two posting modes, the two content types, and all preconditions (connection, user consent, privacy). It relies on the detailed input schema for individual parameter semantics, and the presence of an output schema covers return values. Overall, it is sufficiently complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (94%), so the baseline is 3. The description adds value by explaining the relationship between videoUrl and imageUrls, the single-image photo post case, and the necessity of reading privacy options from tiktok_creator_info for destination='post'. These additions help disambiguate parameter selection.

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?

Clearly states it publishes a video or photo post to TikTok, with specific details about the photo post format (1-35 images, single image as one-slide photo). This distinguishes it from sibling post_to_* tools by platform and content type.

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 guidance on when to use destination 'post' vs 'draft', including the requirement to call tiktok_creator_info and obtain explicit user consent for live posting. Also gives a clear rule never to pass both videoUrl and imageUrls, and mentions the prerequisite of a connected TikTok account.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_to_xPublish a post to X (Twitter)AInspect

Publish to the user’s connected X (Twitter) account — a single post, a post with an image or video render attached, a reply to an existing post, or a whole THREAD (pass thread as an array and each part is posted as a reply to the one before). This PUBLISHES immediately and PUBLICLY — ALWAYS show the user the exact text and get an explicit yes BEFORE calling. Can also run a POLL (2-4 options) instead of media, and restrict who may reply. Each post must be 280 characters or fewer; longer text is REFUSED, never truncated — split it into a thread instead. Write altText whenever you attach a render. COSTS CREDITS: X charges per API request, so every post in a thread is billed, and a post containing a LINK costs roughly 13× one without — mention the cost before publishing a long thread. X ADS are a separate product Hermoso cannot reach: this tool posts ORGANICALLY, it does not create an ad campaign. Needs X connected (Settings ▸ Connectors ▸ X).

ParametersJSON Schema
NameRequiredDescriptionDefault
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
pollNorun a poll on the post. X does not allow a poll and media on the same post, and a poll cannot ride on a thread.
textNothe post text, ≤280 characters. Use this OR thread, not both.
threadNoa thread: each string is one post (≤280 chars each), published in order, each replying to the previous. Max 25.
altTextNoaccessibility description of the attached media, max 1000 characters — write one whenever you attach a render. Costs a small extra amount: X bills the metadata write separately.
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
mediaUrlNoa Hermoso render (image or video) to attach to the first post — pass its served URL, or an upload_file url for external media
replyToIdNonumeric id of an existing X post to reply to
replySettingsNorestrict who can reply — omit for everyone, which is the right default for a brand post

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
urlNo
pollNo
mediaNo
postsNo
threadNo
altTextNo
costCreditsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations (which only indicate side effects) by disclosing that posts publish immediately and publicly, requiring explicit user consent. It also reveals cost implications (per-post API charges, 13x for links, extra for altText), character limit refusal (never truncated), and organic-only behavior. These are critical behavioral traits not captured elsewhere.

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 informative, covering many behaviors in a single paragraph. It is front-loaded with the primary action and key caution, then details constraints and costs. While every sentence adds value, the long single-paragraph format could be slightly better structured with bullets or short paragraphs for easier scanning, but it remains appropriately concise for the complexity.

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 (9 parameters, nested objects, multiple modes, costs, and constraints), the description is remarkably complete. It covers the main publish action, thread behavior, poll usage, media/altText, reply settings, character limits, refusal behavior, costs, organic-only scope, and the connector prerequisite. The output schema exists, and the description does not need to duplicate return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the schema fully describes each parameter, the description adds significant extra meaning: the `hook` parameter's grouping behavior for performance analysis, `altText` incurring extra charges, thread posts being billed individually, poll limitations (no media, no threads), and the character limit refusal. This enriches the schema's bare descriptions substantially.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool publishes to the user's connected X account and enumerates the supported content types: single post, media, reply, thread, poll, and reply settings. It also explicitly distinguishes itself from X ads by noting it posts organically, which separates it from ad-related sibling tools.

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?

The description provides explicit when-to-use context: publishing to X, with conditions like requiring X connected. It also gives a key exclusion: X ads are a separate product this tool cannot reach, so it should not be used for ad campaigns. The immediate public nature and consent requirement also inform appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_to_youtubePost a video to YouTubeAInspect

Publish a finished video to the brand’s connected YouTube channel. Pass a Hermoso render URL (or an upload_file url for a local/external file). DEFAULTS TO UNLISTED (link-only — not on the channel, not searchable, but shareable by link AND usable as a YouTube/Google ad). Pass privacy:"public" to put it ON the channel (a public publish — confirm with the user first) or privacy:"private" for eyes-only. Do NOT use "private" for anything meant to run as an ad — private videos CANNOT be used as ads; unlisted is the ad-ready setting. Needs a connected YouTube channel (Settings ▸ Connectors ▸ YouTube).

ParametersJSON Schema
NameRequiredDescriptionDefault
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
tagsNoup to 30 tags
titleNovideo title (≤100 chars)
privacyNodefault unlisted (anyone-with-link, ad-ready); public = live + searchable on the channel (confirm first); private = eyes-only (cannot run as an ad)
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
videoUrlYesthe video to post — a Hermoso render URL or an upload_file url
descriptionNovideo description (≤5000 chars)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
titleNo
privacyNo
videoIdNo
warningNo
requestedPrivacyNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral context beyond the annotations: the default unlisted visibility with ad-ready implications, the confirmation requirement for public, and the hard limitation that private videos cannot be used as ads. These are non-obvious side-effecting behaviors not inferable from readOnlyHint=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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but not bloated. The first sentence is a clear action statement, followed by privacy guidance and a prerequisite. Every sentence serves a purpose, though some redundancy exists with the schema descriptions (e.g., privacy values repeated). Overall well-structured and 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?

The description is comprehensive for a publish tool: it covers the accepted URL types, default visibility, public/private nuances, ad-use constraints, and the connector prerequisite. An output schema is present (though not shown), which reduces the need to describe return values. It handles the complexity of the 7-parameter tool well.

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 baseline is 3. The tool description re-emphasizes the videoUrl format and privacy enum semantics, but most parameter meaning lives in the schema already. The description adds no truly new parameter-level details beyond what schema properties already state, so no uplift.

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 'Publish a finished video to the brand’s connected YouTube channel' — a specific verb (publish), resource (YouTube channel), and scope (finished video). It clearly distinguishes from sibling post_to_* tools by naming YouTube and from update_youtube_video by focusing on new publishes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: the default unlisted state, when to use public (confirm with user first), and an explicit exclusion 'Do NOT use private for anything meant to run as an ad'. It also states the prerequisite of a connected YouTube channel. Does not name alternative tools for other platforms or update/delete operations, but the exclusions and prerequisites give solid guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_meta_adPreview a Meta ad exactly as it will appearA
Read-only
Inspect

Render a REAL preview of a Meta ad, per placement — Meta returns a link that shows exactly what a person scrolling Facebook or Instagram would see. Pass adAccountId + adId (from list_meta_ads), or creativeId. Optional placements (comma-separated): facebook_feed, facebook_feed_desktop, facebook_story, facebook_reels, facebook_profile_feed, facebook_marketplace, facebook_right_column, facebook_video_feed, instagram_feed, instagram_story, instagram_reels, instagram_explore, instagram_profile_feed, messenger_inbox, messenger_story, audience_network — default facebook_feed + instagram_feed + instagram_story + instagram_reels. Free, read-only, spends nothing. THE LINKS EXPIRE AFTER 24 HOURS — always say so when handing them to a user. Use it straight after create_meta_ad, and whenever someone wants to approve an ad before it runs.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNothe ad to preview (from list_meta_ads)
creativeIdNopreview a creative directly instead of an ad
placementsNocomma-separated placements (see the list above)
adAccountIdYesad account id (act_… or digits)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
objectIdNo
previewsNo
expiresHoursNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description significantly enhances the annotations by disclosing that the tool returns a link, that links expire after 24 hours (emphasized with caps), and that it is 'Free, read-only, spends nothing.' This goes beyond the readOnlyHint and openWorldHint by explaining the external side effect (link expiration) and the no-cost behavior. No contradiction with annotations exists.

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 longer than strictly necessary but every sentence carries unique information. It is well-structured: purpose, parameters, usage timing, and expiration are presented in logical order with the critical expiration warning highlighted in caps. It earns a high score for clarity, though a slight trim could improve conciseness.

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 has an output schema, the description does not need to explain return values. It covers purpose, parameter relationships, usage timing, and important behavioral details (link expiration). For a read-only preview tool, this description is fully complete and leaves no obvious gaps for an agent to misuse.

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?

With 100% schema description coverage, the baseline is 3, but the description adds meaningful context: it clarifies the either/or relationship between adId and creativeId, provides the full list of placements, and states the default placements. This goes beyond the schema's simple property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Render a REAL preview of a Meta ad, per placement — Meta returns a link that shows exactly what a person scrolling Facebook or Instagram would see.' It specifies the resource (Meta ad) and the action (preview), and distinguishes it from sibling tools by mentioning the exact placements and the 24-hour link expiration.

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 provides explicit when-to-use guidance: 'Use it straight after create_meta_ad, and whenever someone wants to approve an ad before it runs.' It also explains how to invoke it ('Pass adAccountId + adId (from list_meta_ads), or creativeId') and notes it is free/read-only. However, it does not explicitly mention alternatives or when not to use this tool, so a minor gap remains.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

product_sizzleProduct sizzle (music-led)AInspect

Render an 18-30s music-led PRODUCT SIZZLE: ONE 15s Seedance 2.0 hero clip of the product, diced into fast cuts and intercut with typeset spec/CTA cards on a brand-coloured grain background, mixed to a music bed. Faceless by design — no people, no voiceover, no spoken lines; the cards carry every word, so nothing is left to a video model's spelling. Pass a real packshot as refImage or the label will not be yours. EXPENSIVE — the hero clip is the only paid leg and it is a full 15s Seedance render: ≈1,040 credits at the DEFAULT 1080p, ≈470 at 720p, ≈220 at 480p, ≈4,130 at 4k (call hermoso_capabilities for the live seedance-2 per-duration numbers; the dicing and the cards are free, and the music bed is already included in the quoted figure). Confirm the spend with the user before calling. For a talking/UGC ad use render_ad or generate_avatar; for a cheap deterministic format use make_template_ad.

ParametersJSON Schema
NameRequiredDescriptionDefault
ctaNoclosing CTA line, ≤30 chars
specsNoup to 4 spec lines for the typeset cards, ≤26 chars each
promptYeswhat the sizzle should show — the product, the setting, the look
secondsNofinished length, clamped to 18-30s (default 25). The PAID hero render is always 15s regardless — this only changes how the cuts and cards are packed
refImageNoproduct packshot URL that anchors the real label — strongly recommended
brandNameNobrand name on the cards — defaults to the workspace brand
musicMoodNomusic-bed mood, e.g. driving / cinematic / upbeat
resolutionNohero-clip resolution and therefore the whole cost — DEFAULT '1080p' (≈1,040 credits); '720p' ≈470, '480p' ≈220, '4k' ≈4,130
aspectRatioNo'9:16' default; anything the seedance-2 catalog entry does not list falls back to 9:16

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no safety/cost hints (all false), so the description carries the full burden. It thoroughly discloses the credit costs per resolution (≈1,040 at 1080p, etc.), the 15s paid render, the faceless design constraint, and the refImage requirement ('the label will not be yours'). This goes far beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: format, faceless design, cost, and alternatives. It is front-loaded with the core purpose and ends with alternatives. No filler, though it could be tightened slightly.

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, expensive generation tool with an output schema, the description covers all decision-critical factors: what it renders, how much it costs, what input is required (refImage), when to use alternatives, and the need for user confirmation. The output schema handles return-value details.

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 adds meaningful emphasis on refImage ('Pass a real packshot... or the label will not be yours') and clarifies a subtle semantic: 'the PAID hero render is always 15s regardless' of the seconds parameter. This supplements the schema without redundancy.

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 specific verb+resource: 'Render an 18-30s music-led PRODUCT SIZZLE' and details the exact format (Seedance hero clip, diced cuts, typeset cards). It clearly differentiates from siblings by naming render_ad, generate_avatar, and make_template_ad as alternatives for other use 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?

The description gives explicit when-to-use/not-use guidance: 'For a talking/UGC ad use render_ad or generate_avatar; for a cheap deterministic format use make_template_ad.' It also mandates a critical workflow step: 'Confirm the spend with the user before calling.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pull_competitor_adsPull competitor adsA
Read-only
Inspect

Pull a brand's real running ads across Meta / Google / LinkedIn ad libraries (deduped, sorted, right page resolved). Spends ScrapeCreators credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNo'longest_running' (default) etc.
limitNomax ads per platform (default 30)
domainNothe advertiser domain
countryNo2-letter, default 'US'
platformsNodefault ['facebook']; add 'google','linkedin'
companyNameNothe advertiser name

Output Schema

ParametersJSON Schema
NameRequiredDescription
googleNoGoogle results ({ads[], cursor} or {error}; null when not requested)
facebookNoMeta results ({ads[], matched} or {error}; null when not requested)
linkedinNoLinkedIn results ({ads[], cursor} or {error}; null when not requested)
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While the readOnlyHint annotation already covers safety, the description adds a non-obvious side effect: 'Spends ScrapeCreators credits.' It also discloses processing behaviors (deduped, sorted, right page resolved) that go beyond the annotation, giving valuable insight into the output.

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 concise sentences: the first states the action and processing traits, the second warns about cost. Every word earns its place, with no filler or redundancy.

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 read-only tool with six optional parameters and an output schema, the description sufficiently covers the core function, processing details, and cost. It does not explain every edge case, but defaults are in the schema and the output schema handles return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds a small amount of meaning by mapping 'Meta / Google / LinkedIn' to the platforms parameter, but it does not provide additional syntax or dependency details 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?

The description uses a specific verb 'Pull' and clearly identifies the resource: a brand's real running ads from Meta, Google, and LinkedIn ad libraries. It also distinguishes itself from sibling tools by emphasizing competitor ads and post-processing (deduped, sorted, right page resolved).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives context that this tool fetches competitor ads and warns about credit spending, but it does not explicitly state when to use this tool vs alternatives like search_meta_ads or research_ads. There are no exclusions or alternative names mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_docRead a Google DocA
Read-only
Inspect

Read the text of a Google Doc Hermoso can reach — one it created, or one the user handed over with the Google file picker in the app (that is how an EXISTING doc becomes readable; find its id with list_drive_files). Pass documentId (from create_doc) OR paste a Google Docs URL as docUrl. Under the drive.file scope it reaches nothing else in the user’s Drive; if Google answers that the file was not found, the user has not picked it yet — ask them to pick it in the app rather than retrying. Returns the plain text. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
docUrlNoa Google Docs URL to read — the document id is extracted from it
documentIdNothe document id (from create_doc)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
textNo
titleNo
documentIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnlyHint and openWorldHint annotations by explaining the drive.file scope limitation, the requirement that the user must hand over the doc via the picker, and the specific 'file not found' behavior (ask user to pick rather than retry). It also notes the tool is read-only and 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?

The description is appropriately sized for the tool's complexity. It is front-loaded with the core purpose and each sentence adds essential context—reachability, parameter usage, scope limits, error handling, and return value—without redundancy.

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 output schema and annotations, the description fully covers what an agent needs: how to get a doc id, how to pass it, what errors mean, and what to do about them. The behavioral and environmental constraints are well documented.

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 schema covers both parameters, and the description adds meaning by explaining that documentId comes from create_doc, docUrl is a full Google Docs URL from which the id is extracted, and that you use one or the other. This clarifies the relationship between the two paramters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads the text of a Google Doc, with a specific verb and resource. It distinguishes itself from siblings like read_sheet and get_drive_file by specifying the reachable scope (created or user-picked docs) and the output (plain text).

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 explains when to use the tool: to read any Google Doc Hermoso can reach, including how existing docs become reachable via the file picker and how to find ids with list_drive_files. It does not explicitly name alternatives to avoid, but the context is clear and practical.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_sheetRead a Google Sheet rangeA
Read-only
Inspect

Read cells from a Google Sheet Hermoso can reach — one it created, or one the user handed over with the Google file picker in the app (that is how an EXISTING spreadsheet becomes readable; find its id with list_drive_files). Pass the spreadsheetId (from create_sheet) OR paste a Google Sheets URL as sheetUrl. If Google answers that the file was not found, the user has not picked it yet — ask them to pick it in the app rather than retrying. Returns a 2-D array of values.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoA1 range, e.g. "A1:D50" (default A1:Z1000)
sheetUrlNoa Google Sheets URL to read — the spreadsheet id is extracted from it
spreadsheetIdNothe spreadsheet id (from create_sheet)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
rangeNo
valuesNo
spreadsheetIdNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is known. The description adds meaningful behavioral context beyond annotations: how a spreadsheet becomes readable (user handover), the error semantics when a file isn't found (user hasn't picked it), and the return format (2-D array). This exceeds the baseline, though it doesn't discuss edge cases like empty results or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is approximately 80 words across four sentences, each earning its place: purpose, reachability, parameter usage, error handling, and return type. It is front-loaded with the core action and contains no fluff or redundancy. Well-structured for quick agent parsing.

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, the return values are already documented. Annotations cover read-only and open-world behavior. The description fills the remaining gaps: authorization prerequisites (user file picker), how to specify the target (id or URL), and error resolution. It doesn't explicitly mention the default range, but the schema covers that, so overall completeness is high.

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 schema descriptions cover all three parameters (100% coverage), so baseline is 3. The description enhances this by explicitly explaining the OR relationship between spreadsheetId and sheetUrl, and by telling users how to obtain the spreadsheetId (from create_sheet or list_drive_files). This adds practical meaning beyond the raw 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?

The description clearly states the tool's function: 'Read cells from a Google Sheet Hermoso can reach' — a specific verb + resource, further clarified by the title 'Read a Google Sheet range'. It distinguishes itself from siblings like append_to_sheet (writing) and read_doc (Docs), and adds scope by explaining which sheets are reachable (created or user-picked).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: how to pass the spreadsheet (spreadsheetId or sheetUrl), how to obtain the id (from create_sheet or list_drive_files), and how to handle the 'file not found' error (ask user to pick, don't retry). However, it does not explicitly contrast with write tools like append_to_sheet, so it lacks a clear 'when not to use' statement, stopping short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recast_motionRecast motionAInspect

Motion transfer: re-perform a reference video's motion with a different person/character (supply their image). The reference clip drives the movement; the image supplies the identity. Paid render.

ParametersJSON Schema
NameRequiredDescriptionDefault
imageYesthe actor/character image URL (who should appear)
videoYesthe reference video whose motion to re-perform
promptNooptional scene/style guidance
orientationNowhich aspect to keep: the video's (default) or the image's

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false/default, so the description carries the transparency burden. It adds meaningful behavioral context by explaining that the reference clip drives movement while the image supplies identity, and notes the operation is a 'Paid render,' implying cost and processing. This goes beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each purposeful. The description is front-loaded with the core concept, then explains input roles, and ends with the cost note. No filler or redundant repetition of schema 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?

Given the tool's moderate complexity, an output schema exists, and the description covers the core mechanism and cost, it is largely complete. It could optionally mention whether rendering is asynchronous or if any prerequisites exist, but those are not essential for basic selection and invocation.

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 adds semantic value by clarifying that the image supplies identity and the video supplies motion, which enriches the understanding of the two required parameters. It does not mention prompt or orientation, but the schema handles those.

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 'Motion transfer' and clearly states the tool re-performs a reference video's motion with a different person/character using their image. This specific verb+resource combination distinguishes it from sibling video tools like generate_video or edit_video.

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 provides clear context on when to use this tool (motion transfer with a supplied identity) and explains the roles of the reference video and image. It does not explicitly name alternatives or state exclusions, but the guidance is sufficient for selection among the many sibling video tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_ads_bid_suggestionAsk Reddit what to bidA
Read-only
Inspect

Reddit’s own suggested bid for a given objective, bid type and targeting — a median, a sensible range, and the hard floor below which Reddit will not accept a bid. Amounts come back in the ad account’s currency. Free, creates nothing. Use it to pick bidAmount for create_reddit_ads_ad_group instead of guessing a number that either never wins an auction or overpays.

ParametersJSON Schema
NameRequiredDescriptionDefault
budgetYesbudget in the ad account’s currency
bidTypeNodefault CPC — must fit the campaign objective
endTimeNo
currencyNo
goalTypeNo
objectiveNodefault CLICKS
startTimeNo
targetingNo
adAccountIdNo
bidStrategyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
minBidNo
suggestedBidNo
suggestedRangeNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, and the description adds valuable context: 'Free, creates nothing' and the currency behavior. It also discloses the 'hard floor' constraint. This goes beyond what annotations alone provide.

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 the core concept, and no redundant text. Every sentence contributes meaning, from the output definition to the use case.

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?

Given the tool's 10 parameters and nested targeting object, the description covers the essential context: what it returns, in what currency, and how to use it. Since an output schema exists, further detail isn't required. Minor gap: it doesn't hint at the purpose of budget, which is the only required parameter.

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?

Schema coverage is only 30%, and the description only elaborates on objective, bidType, and targeting. It leaves budget, bidStrategy, startTime, endTime, currency, goalType, and adAccountId unexplained, so the description does not compensate for the low schema coverage.

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 the exact resource (Reddit's suggested bid) and the concrete outputs (median, sensible range, hard floor). It clearly states the tool's purpose and distinguishes it from guessing, while implicitly differentiating from other Reddit ad tools by focusing on bid suggestion.

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 explicitly tells the agent when to use this tool: 'Use it to pick bidAmount for create_reddit_ads_ad_group instead of guessing.' This is strong guidance, though it doesn't mention alternatives like reddit_ads_forecast or explicit when-not-to-use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_ads_forecastForecast Reddit audience size and deliveryA
Read-only
Inspect

Ask Reddit how big a targeting set is and roughly what a budget would buy — total reachable audience, the targeted slice, and estimated impressions, clicks and reach. Free, creates nothing, spends nothing, so run it BEFORE building an ad group to sanity-check targeting that may be far too narrow or far too broad. Budget is an ordinary amount in the ad account’s currency. These are Reddit’s estimates, not a guarantee — say so when reporting them.

ParametersJSON Schema
NameRequiredDescriptionDefault
budgetYesbudget in the ad account’s currency (not micro-currency — the conversion is handled)
bidTypeNo
endTimeNo
goalTypeNo
bidAmountNo
objectiveNodefault CLICKS
startTimeNoISO 8601
targetingNosame shape as create_reddit_ads_ad_group targeting
adAccountIdNo
bidStrategyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
deliveryEstimatesNo
totalAudienceSizeNo
targetAudienceRangeNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description significantly expands on the readOnlyHint annotation by stating 'Free, creates nothing, spends nothing' and explaining the estimated nature of results: 'These are Reddit’s estimates, not a guarantee — say so when reporting them.' It also clarifies currency handling ('Budget is an ordinary amount in the ad account’s currency'), providing valuable behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (3 sentences) and front-loaded with the core purpose. Each sentence adds important information: what it does, when to use it, and a crucial caveat about estimates. There is no wasted text.

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?

Given the tool's complexity (10 parameters, nested targeting) and the presence of an output schema, the description covers the key aspects: purpose, timing, cost implications, and result reliability. It does not explain optional parameters like bidStrategy or objective, but the schema and output schema help fill those gaps. The description is almost complete, but a brief note about how optional parameters affect the forecast would have made it fully 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 only 40%, so the description must compensate for undocumented parameters. It clarifies the budget parameter (ordinary amount, not micro-currency) and mentions targeting indirectly ('targeting set', 'targeted slice'), but it does not explain the other 6 undocumented parameters (bidType, endTime, goalType, bidAmount, adAccountId, bidStrategy). The description adds some value but does not fully compensate for the schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Ask Reddit how big a targeting set is and roughly what a budget would buy' and lists specific outputs (reachable audience, targeted slice, impressions, clicks, reach). It is specific to Reddit and distinguishes itself from sibling tools like reddit_ads_bid_suggestion by focusing on forecasting delivery rather than suggesting bids.

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 explicit timing guidance: 'run it BEFORE building an ad group to sanity-check targeting that may be far too narrow or far too broad.' This provides clear context for when to use the tool, though it does not explicitly name alternative tools or state when not to use it, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_ads_historyReddit ad account changelogA
Read-only
Inspect

Read the CHANGELOG for a Reddit ad account — what was changed, from what to what, by which member, and when. This is the tool for "performance fell off a cliff on Tuesday, what changed?" and for auditing what an agent or a teammate actually did. Call it with nothing but the ad account to get every change; narrow it with a date window, change types (BUDGET, BID, STATUS, TARGETING…) or specific campaign / ad group / ad ids. An empty result genuinely means nothing was changed in that window — say that, do not read it as missing data. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNodefault 50, max 200
sinceNoYYYY-MM-DD or full ISO timestamp
untilNoYYYY-MM-DD or full ISO timestamp
entityIdsNorestrict to these objects
memberIdsNorestrict to changes made by these Reddit members
entityTypeNorequired when you pass entityIds
adAccountIdNo
changeTypesNo
includeChildEntitiesNoalso return changes to what lives under those objects

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
countNo
changesNo
adAccountIdNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces this with 'Read-only, free.' It adds valuable behavioral context beyond annotations: an empty result genuinely means nothing changed and should not be read as missing data. This is a useful interpretive note. No contradiction with annotations, though it doesn't address pagination or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, front-loaded with the core purpose, followed by use case, filtering instructions, and a critical empty-result behavior. Every sentence earns its place; there is no redundancy or fluff. The em-dash structure and inclusion of a concrete user scenario make it both compact and informative.

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 9-parameter tool with an output schema, the description covers the essential context: what it does, when to use it, how to narrow results, and how to interpret empty results. It does not detail return structure, but the output schema handles that. It could mention pagination or limits (e.g., the limit parameter), but the description is already quite complete for an audit 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 78%, so most parameters already have descriptions. The description adds meaning by explaining the conceptual filtering categories: date window (since/until), change types (BUDGET, BID, STATUS, TARGETING…), and entity scoping (campaign/ad group/ad ids). It also clarifies that 'nothing but the ad account' is sufficient, which is not obvious from the schema where adAccountId is not marked required. This adds value beyond the structured fields.

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?

Description opens with a specific verb+resource: 'Read the CHANGELOG for a Reddit ad account,' and clearly states what is returned: 'what was changed, from what to what, by which member, and when.' It also distinguishes itself from sibling tools by framing its use case ('performance fell off a cliff...') and explicitly marking itself read-only, which sets it apart from update/mutation tools like update_reddit_ads_campaign.

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 when-to-use guidance: it is 'the tool for' performance drop investigation and auditing agent/teammate actions. It explains how to narrow the query (date window, change types, entity IDs) and notes that calling with just the ad account returns everything. However, it does not explicitly name alternative tools or say when not to use this one, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_ads_reportReddit ads performance reportA
Read-only
Inspect

Performance for a Reddit ad account — impressions, clicks, spend, CTR, CPC, eCPM, reach and any of Reddit’s ~450 metric fields, optionally broken down by campaign, ad group, ad, date, hour, community, country, gender, interest, keyword, placement and more. Money comes back in WHOLE UNITS of the ad account’s currency (Reddit reports micro-currency; the conversion is done for you) — and that currency is not necessarily dollars, so check the account. Reddit only accepts HOURLY window boundaries; plain YYYY-MM-DD dates are accepted here and snapped for you. A report with ZERO rows genuinely means nothing delivered in that window — say exactly that and never present zeros as measured performance. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoYYYY-MM-DD or full ISO timestamp, default 30 days ago
untilNoYYYY-MM-DD or full ISO timestamp, default today
fieldsNoReddit metric names, UPPER_SNAKE (IMPRESSIONS, CLICKS, SPEND, CTR, CPC, ECPM, REACH, FREQUENCY, CONVERSION_ROAS, VIDEO_WATCHED_100_PERCENT, CONVERSION_PURCHASE_TOTAL_VALUE…). Omit for a sensible default set; if you name one Reddit does not know, its error lists every valid value.
filterNoReddit filter expression to restrict rows to particular ids/values
breakdownsNoup to 3 (4 if both COUNTRY and REGION). Omit for one aggregate row.
timeZoneIdNoIANA zone, e.g. America/New_York
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
rowsNo
countNo
sinceNo
untilNo
adAccountIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses critical behavior: currency is returned in whole units with micro-currency conversion, dates are snapped to hourly boundaries, and zero rows meaningfully indicate no delivery. It also warns against misinterpreting zeros as measured performance. This goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet information-dense, front-loading the core purpose before addressing key nuances. Every sentence adds meaningful context, and the structure flows logically from metrics to breakdowns to currency to date handling to zero rows.

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 reporting tool with 7 optional parameters and an existing output schema, the description covers essential operational pitfalls: currency units, hourly boundary snapping, and the meaning of zero rows. It equips the agent to handle the tool correctly without needing to discover these nuances at runtime.

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 high at 86%, but the description adds value by explaining the fields parameter's error behavior (unknown metric names trigger a useful error listing valid values) and clarifying that breakdowns include the listed options. It also notes the date snapping behavior. This enhances the schema without redundancy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides performance data for a Reddit ad account, listing specific metrics and breakdown options. It is unmistakably distinct from sibling tools like google_ads_report or linkedin_ads_report by naming Reddit and its metric vocabulary.

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 tool's purpose is clear from name and description, and it includes practical usage notes like 'read-only, free' and 'if you name one Reddit does not know, its error lists every valid value.' However, it does not explicitly mention alternatives or when not to use it, leaving some implicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_post_statsHow a Reddit post didA
Read-only
Inspect

Read one of the connected account’s Reddit posts back — score (net upvotes), comment count, upvote ratio, flair, and whether the subreddit removed it. Use it for "how did that post do" or to judge which framing a community actually rewarded before writing the next one. Read-only, 0 credits. Needs Reddit connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
postIdYesthe id returned by post_to_reddit, its t3_… fullname, or the full reddit.com permalink

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNo
flairNo
scoreNo
titleNo
removedNo
commentsNo
fullnameNo
postedAtNo
subredditNo
upvoteRatioNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description is consistent, adding 'Read-only, 0 credits' and 'Needs Reddit connected'. It goes beyond annotations by disclosing the return fields (score, comment count, upvote ratio, flair, removal) and the read-only nature of the operation. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences: the first states the action and results, the second gives use cases, and the third covers cost and requirements. Every sentence earns its place, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with an output schema, the description covers what it does, what it returns, when to use it, prerequisites, and cost. Nothing important is missing for an agent to decide whether to invoke 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 description coverage is 100% for the single postId parameter, which already explains accepted formats (id, t3_ fullname, or permalink). The description does not add any additional meaning about parameters, 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?

The description opens with a specific verb and resource: 'Read one of the connected account’s Reddit posts back' and enumerates the exact fields returned (score, comment count, upvote ratio, flair, removal status). It also explicitly ties to the use case 'how did that post do', distinguishing it from posting (post_to_reddit) or search (search_reddit) siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear usage context: 'Use it for "how did that post do" or to judge which framing a community actually rewarded before writing the next one.' It also states prerequisites ('Needs Reddit connected') and cost (0 credits). It doesn't explicitly name alternatives or when not to use, but the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reframe_videoReframe videoAInspect

Reframe a video to a different aspect ratio (e.g. 16:9 master → 9:16 vertical) with smart subject tracking. Paid render; returns the served URL of the reframed video.

ParametersJSON Schema
NameRequiredDescriptionDefault
videoYesthe source video URL
aspectRatioYesthe target aspect ratio

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate a non-read-only, non-idempotent operation, but the description adds the critical 'Paid render' warning and states that it returns the served URL. It also mentions 'smart subject tracking' as a behavioral feature. No contradiction with annotations; the description enriches the safety profile by warning about cost.

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 essential information (what, how, cost, output) is packed efficiently.

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 with an output schema, the description covers the core purpose, output behavior, and cost. It doesn't mention processing time or limitations, but given the output schema exists and the annotations are present, the description is sufficiently complete for an agent to select and invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes both parameters with 100% coverage, including the aspectRatio enum. The description adds a concrete example of the transformation (16:9 → 9:16) which helps the agent map parameters to intent, but it doesn't add new parameter-level constraints or formats 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?

The description clearly states the tool reframes a video to a different aspect ratio with smart subject tracking, distinguishing it from sibling video tools like clip_video or edit_video. The concrete example (16:9 → 9:16) makes the function unambiguous.

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 implies when to use: when a video needs aspect ratio conversion, especially with subject tracking. However, it does not explicitly discuss alternatives or when not to use, though no sibling directly competes with this function. The paid-render note adds a cost consideration, but the guideline is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rememberRemember a factAInspect

Save a durable fact or PREFERENCE about the brand, audience, or the user’s creative TASTE (e.g. “audience is first-time homebuyers”, “prefers bold lime accents”, “always captions off”) into the workspace Memory so it shapes FUTURE ads. For lasting things, not one-off requests. Merges into the existing Memory (never overwrites); de-dupes on identical text.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesthe fact/preference, concise
categoryNoshort bucket: Brand, Audience, Taste, Do, Don’t, or Preference (default General)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since all annotations are false, the description carries the full burden of behavioral disclosure. It reveals merge semantics ('never overwrites'), de-duplication, and the long-term effect on future ads, which is valuable context. Despite idempotentHint being false, the description suggests idempotent-like behavior without directly claiming 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?

Three sentences that front-load the action and examples, followed by necessary caveats about durability and merge behavior. No filler, every sentence earns its place.

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 simple save-to-memory tool, the description covers purpose, usage scope, examples, and behavioral guarantees. The presence of an output schema and sibling tools (list_memory, forget) handles retrieval and deletion, so no major gaps remain.

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 parameter basics are already documented. The description adds meaning by providing concrete examples of valid text (e.g., 'audience is first-time homebuyers') and clarifying that category aligns with named buckets (Brand, Audience, Taste), which reinforces the schema definitions.

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 uses a specific verb ('Save') and resource ('workspace Memory'), clearly defining the tool's function. It distinguishes this from siblings by focusing on durable facts/preferences about brand, audience, and taste, with concrete examples that illustrate scope.

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 provides when-not guidance ('For lasting things, not one-off requests'), which helps prevent misuse. However, it does not explicitly name alternative tools (e.g., list_memory for retrieval, forget for deletion), so it stops short of full alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remix_staticRemix a static adAInspect

One-click STATIC-AD REMIX: rebuild a competitor/reference STATIC (image) ad as an on-brand version — SAME layout, composition and energy, but YOUR product, brand colours, logo and voice, with every trace of the source brand removed. Pass imageUrl = the static ad image to remix. Uses your saved brand (pass brandId to target a specific brand — that switches this key's active brand like use_brand). IMAGES ONLY — for video ads use render_ad. Bills as one image generation.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandIdNoa brand id/name from list_brands to remix for; omit to use the active brand
imageUrlYesthe URL of the static ad image to remix

Output Schema

ParametersJSON Schema
NameRequiredDescription
imageNothe served absolute URL of the remixed ad image
modelNothe model label that rendered it
slotsNothe filled slot map (layout elements swapped to your brand)
residualNosource-branding sweep result ({clean, note})
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (which are all false), the description discloses that it bills as one image generation, removes every trace of the source brand, and switches the active brand when brandId is provided. These are meaningful behavioral traits not captured in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but efficient; front-loaded with the core purpose and followed by parameters, usage, restrictions, and billing. Every sentence contributes value with no fluff, using clear formatting (IMAGES ONLY, brandId side-effect).

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 two-parameter tool with an output schema, the description covers the core action, appropriate inputs, distinction from video ad tool, cost implications, and brand-handling behavior. It is sufficiently complete for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% but description adds context: imageUrl is the static ad image to remix, brandId targets a brand and switches the active brand. This goes beyond simple schema descriptions and clarifies the remix behavior and side-effects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('rebuild') and resource ('static ad image') with the outcome ('on-brand version, SAME layout, composition and energy'). It distinguishes from sibling tools by explicitly limiting to IMAGES ONLY and referencing render_ad for video.

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 'IMAGES ONLY — for video ads use render_ad', providing a clear alternative. It also explains when to pass brandId (to target a specific brand) and the side-effect of switching the active brand like use_brand, setting expectations for usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_memberRemove a teammateA
DestructiveIdempotent
Inspect

Remove a member from this brand workspace by email — they lose access (you can re-invite them later). Confirm the exact person with the user, then call with confirm:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesthe member’s email
confirmNoREQUIRED true

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
emailNo
membersNo
removedNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint and idempotentHint, but the description adds key behavioral context: the member loses access, can be re-invited later, and confirm:true is required to execute the action. This goes beyond annotations by explaining the confirmation workflow and the recoverability of the removal.

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 consequence, then the required confirmation step. Every word earns its place with no redundancy.

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 simple removal tool with annotations and an output schema, the description covers the action, effect, and required confirmation. It is sufficiently complete for an agent to understand the purpose, prerequisites, and implications without further documentation.

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 covers both parameters with descriptions (100% coverage), so baseline is 3. The description adds meaningful semantics by clarifying that confirm must be true and tying it to the 'confirm the exact person' step, going beyond the schema's cryptic 'REQUIRED true'. This adds practical guidance, so 4.

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 explicitly states 'Remove a member from this brand workspace by email' — a specific verb, resource, and method. It also explains the consequence ('they lose access') and differentiates from sibling tools like invite_member by focusing on removal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear procedural guidance: confirm the exact person with the user before calling, and set confirm:true. It does not mention alternative tools or when-not-to-use, but the precondition is well defined and the intended use case is obvious. Lacks exclusions, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_adRender ad videoAInspect

RECOMMENDED for finished video ADS: render a plan_ad concept through the SAME quality pipeline as the Hermoso web Studio — timed shot list, exact/clean speech (no garbled words), text composited in post (never model-painted), brand end card, licensed music bed, real product references. Pass plan_ad’s full structured output as creative. Honors the plan’s render_plan structure/duration: a ≤15s storyboard renders as ONE single-pass clip; a longer plan automatically renders as STITCHED ACTS (fewest balanced ≤15s clips) — never time-compressed into one clip. CAST A SAVED CREATOR with creator so the SAME person stars in this ad as in the last one (list_creators is the roster) — otherwise every render invents a new face. Renders take 1–3 min; keep polling get_job if it returns still-rendering. Spends credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNovideo model id from hermoso_capabilities (default: the plan’s pick). Naming one is a DELIBERATE pick — the server asks before ever swapping it (no silent fallback)
musicNolicensed music bed on/off (default on)
dryRunNoreturn the routing decision (single pass vs stitched acts, resolved model + act lengths) WITHOUT submitting a render — free, nothing charged
lockupNopersistent brand-logo lockup overlay on/off
creatorNoCAST A SAVED CREATOR in this ad — their id from list_creators, or the name you know them by (“Sarah”). Their saved portrait becomes the on-camera identity for the whole spot, so the same face carries across every act and across every ad you render for this brand — and because we already have their picture, the character portrait this pipeline would otherwise generate is skipped, so casting somebody costs LESS than not casting them. Omit to let the ad cast a fresh person. Refused for free, with nothing rendered, if the name matches nobody or more than one creator, if the plan has nobody on camera, or if they are a REAL person with no likeness consent on file.
endCardNobranded end card on/off (default: on, except organic recipes)
captionsNocomposited caption pills on/off (default: the recipe decides)
creativeYesthe FULL structured output of plan_ad (must contain video_storyboard)
ttsVoiceNovoiceover voice name (e.g. Rachel / George) when the plan voices over
resolutionNo'720p' default; '480p' = cheap fast draft pass, '1080p'/'4k' = premium final delivery (more credits)
aspectRatioNooutput aspect ratio, e.g. 9:16 (default) / 1:1 / 16:9
durationSecondsNototal ad length in seconds (supported range 4–180; outside that it is clamped). Omit to honor the plan’s own duration — that is almost always right. This only RE-TIMES an already-authored board (its scenes are scaled to fit), it does NOT re-write it, so to change the length of the ad the user asked for, re-run plan_ad with durationSeconds instead. ≤15s renders as one clip; longer is stitched from acts filled to 15s with the remainder last — use dryRun:true to see the exact act split for free before spending.
allowGenericProductNoproceed even though this brand has NO product photo on file and the ad features a product — the packaging will be INVENTED. Only pass true after telling the user that and hearing they are fine with a generic stand-in

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
inputNothe assembled render input (dry run only — resolved model, duration, scenes)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
dryRunNotrue when this was a dry run (no job submitted, nothing charged)
creatorNothe saved creator this render RESOLVED to — {id, name, source, consented}. The read-back, not what you typed
jobTypeNothe routing decision — 'video' (single pass) or 'stitch' (acts)
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
needsProductPhotoNotrue when nothing was rendered because the ad features a product this brand has no photo of
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With all annotations false, the description carries full burden and does so richly: it discloses async rendering (1–3 min, poll get_job), credit cost, never time-compressing longer plans, creator identity handling, and no silent model fallback. These behaviors go beyond what annotations or schema could convey.

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 recommendation, and every sentence earns its place without redundancy. It is somewhat long, but given the complexity of the tool, it is appropriately sized. Minor room for improvement via bullet formatting.

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 workflow dependencies, async behavior, cost, stitching rules, creator casting, dryRun, and model fallback policy. An output schema exists, so return values need not be documented. For a 13-parameter tool with nested objects, the description plus schema form a complete and actionable picture.

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 adds critical semantics for `creative` (must be plan_ad's full structured output containing video_storyboard) and `creator` (casting costs less, refusal conditions), which significantly enhance meaning beyond the schema. Other parameters are already well-described in 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?

The description clearly states the tool renders a plan_ad concept through the Hermoso web Studio quality pipeline, using the structured output of plan_ad as `creative`. This distinguishes it from generic video generation tools by requiring a plan and specifying the single-pass vs stitched-acts behavior.

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?

Opens with 'RECOMMENDED for finished video ADS', signaling the intended use case after plan_ad. Provides concrete guidance: pass plan_ad's full structured output, cast a saved creator via list_creators, and poll get_job while rendering. Lacks an explicit 'when not to use' naming an alternative, but the context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_google_business_reviewReply to (or remove a reply from) a Google reviewA
DestructiveIdempotent
Inspect

Answer a customer review publicly, as the business, on the brand’s Google Business Profile listing — or delete a reply that is already there. THIS IS AN UPSERT: a listing has exactly one reply per review, so replying to a review that already has an answer REPLACES it rather than adding a second. Google only accepts replies on a VERIFIED listing. Deleting is public and immediate, so it is confirm-gated. Write the reply in the brand’s voice and answer the specific complaint — a generic reply under a one-star review is worse than none. Needs Google Business Profile connected and the project approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
deleteNotrue removes the existing reply instead of writing one
commentNothe public reply text — required unless you are deleting
confirmNorequired for delete:true
reviewIdYesfrom list_google_business_reviews
locationIdNowhich listing — omit when only one is shared

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
deletedNo
reviewIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate write/destructive behavior, and the description enriches this with crucial specifics: the upsert semantics (exactly one reply per review, replacement behavior), deletion being public and immediate, and confirm-gating. These details go well beyond the boolean hints and align with idempotentHint. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, each adding unique information: purpose, upsert caveat, prerequisites, and writing guidance. No filler; the most critical behavioral warnings are front-loaded. Excellent structure for an AI agent.

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 moderate complexity (5 params, output schema present), the description covers prerequisites, behavioral nuances (upsert, deletion), and even style guidance. It trusts the schema for param details and output schema for return data, making it complete without redundancy.

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 adds value by explaining the upsert behavior (ties to comment replacement) and why confirm is required (deletion is public/immediate). This gives semantic context to the confirm and comment parameters beyond their schema descriptions, earning a 4.

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 uses a specific verb ('Answer'/'delete') with a clear resource ('a customer review on the brand's Google Business Profile listing'). It distinguishes itself from sibling tools like answer_google_business_question (which targets questions, not reviews) and list_google_business_reviews (which lists reviews). The distinction between replying and deleting is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: prerequisites (verified listing, connected profile, approved project), the upsert behavior, and guidance on writing quality. It does not explicitly name alternative tools for fetching reviewIds, but the schema's reviewId description references list_google_business_reviews. No explicit 'when not to use' stated, but context is strong enough for a 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_meta_commentReply to a Facebook/Instagram commentAInspect

Post a public reply to a comment on the brand’s Facebook or Instagram post. This is PUBLIC and posted as the brand — show the user the exact wording and get their go-ahead first.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdNoPage id — omit when only one Page is connected
messageYesreply text
commentIdYescomment id from list_meta_comments

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, openWorldHint=true), the description adds critical behavioral traits: the reply is 'PUBLIC' and 'posted as the brand,' plus the need for user approval. This goes beyond what annotations convey and helps the agent understand the visibility and identity implications.

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 sentences, front-loaded with the purpose and then a critical warning. Every word contributes value; no fluff or redundancy.

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 simple reply tool, the description fully covers what the agent needs: the action, the platform, the visibility, and the approval requirement. With an output schema present, return values need not be explained.

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?

The schema already provides 100% coverage for all three parameters (pageId, message, commentId) with descriptions. The tool description does not add extra meaning to these parameters, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Post a public reply to a comment on the brand’s Facebook or Instagram post.' It includes the specific platform (Facebook/Instagram) and distinguishes from sibling tools like reply_to_youtube_comment or reply_to_thread.

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 provides a key usage guideline: 'show the user the exact wording and get their go-ahead first,' which instructs the agent to obtain approval before sending. It does not explicitly mention alternative tools or when not to use it, but the approval requirement is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_reddit_commentReply on RedditAInspect

Reply on Reddit as the connected account — either a top-level comment on a post, or a reply to somebody’s comment. This publishes PUBLICLY under their username immediately, so show the user the exact wording and get an explicit yes BEFORE calling. Reddit judges brands harder on how they behave in comments than on what they post: answer the actual question, in plain language, and do not paste marketing copy — an account that does gets buried and can get the whole domain banned from the subreddit. parentId is a FULLNAME, not a bare id: t3_… replies to a POST (a new top-level comment), t1_… replies to a COMMENT. list_reddit_comments returns the right one on every row. 0 credits. Needs Reddit connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesthe reply markdown
parentIdYest3_… fullname of a post (top-level comment) or t1_… fullname of a comment (a reply to it)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
urlNo
textNo
fullnameNo
parentIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that content is published PUBLICLY and immediately, warns about Reddit's punitive treatment of brands and potential domain bans, and notes zero credits and connection requirements. These behavioral details go far beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but front-loaded with purpose and public-visibility warning. Every sentence adds relevant operational or behavioral detail, though the brand-behavior advice is somewhat expansive.

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 two-parameter mutation tool with an output schema, the description covers prerequisites, usage, safety, and parameter source thoroughly. It includes all information a model needs to invoke it correctly and safely.

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?

Although schema already covers both parameters (100%), the description adds crucial semantics for parentId: it explains fullname format (t3_ vs t1_), what each maps to, and that list_reddit_comments returns the correct value. Text param gets no added value but threshold is high due to schema coverage.

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 uses a specific verb ('Reply') and resource ('on Reddit'), and precisely distinguishes top-level post comments from replies to comments. This clearly differentiates it from sibling reply tools for other platforms.

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 explicitly instructs the agent to show exact wording and obtain explicit yes before calling, and provides a prerequisite ('Needs Reddit connected'). It also points to list_reddit_comments for obtaining the correct parentId, but does not explicitly name alternatives or when-not-to-use, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_threadReply on ThreadsAInspect

Post a reply to a Threads post — the brand’s own or someone else’s. This PUBLISHES publicly under the brand’s account, so show the user the exact wording and get their go-ahead first.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesreply text (max 500 characters)
replyToIdYesthe post id being replied to

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses significant behavioral traits beyond the annotations: it PUBLISHES publicly under the brand's account, implying visibility and irreversibility, and it mandates an approval workflow. This is critical context that the annotations (readOnlyHint=false, idempotentHint=false) do not explicitly convey.

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 sentences, front-loaded with the core purpose and immediately followed by the high-impact behavioral warning. Every word earns its place; there is no redundancy or 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 simple two-parameter publishing tool, the description is complete: it covers the action, scope, public visibility, approval requirement, and is complemented by adequate schema documentation and annotations. No critical gaps remain for the agent to invoke 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?

The input schema already provides 100% coverage with clear descriptions for both parameters ('reply text (max 500 characters)' and 'the post id being replied to'). The tool description adds no additional parameter-level detail, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Post a reply to a Threads post', specifies the scope ('the brand's own or someone else's'), and distinguishes this from related sibling tools like hide_thread_reply and list_threads_replies by emphasizing it is a publishing action.

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 context for use and an important precondition: because it publishes publicly, the agent must show the user the exact wording and get approval first. It does not explicitly mention alternatives or when not to use it, but the approval requirement serves as a strong usage signal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_youtube_commentReply to a YouTube commentAInspect

Post a public reply to a comment on the connected channel, as the channel. This is PUBLIC and immediate — show the user the exact reply text and get an explicit yes before calling. Get commentId from list_youtube_comments. Needs a connected YouTube channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesthe reply, shown publicly under the video
commentIdYesid of the comment to reply to (from list_youtube_comments)

Output Schema

ParametersJSON Schema
NameRequiredDescription
atNo
idNo
textNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description emphasizes that the reply is PUBLIC and immediate, and it requires explicit user confirmation. This goes beyond the annotations (readOnlyHint=false) by disclosing the visibility and the need for a consent step. It also mentions the prerequisite of a connected channel, which is useful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences deliver all essential information: the purpose, the public/immediate nature with a confirmation requirement, the source of commentId, and the prerequisite. No filler or repetition of schema details; every sentence 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?

For a simple two-parameter write operation, the description covers purpose, input source, user confirmation, and channel prerequisite. Since an output schema exists, missing return value details are acceptable. Slight room remains for explicitly stating alternative tools or edge cases, but overall it is complete.

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 schema already provides 100% coverage for both parameters. The description adds value by pointing out that commentId should come from list_youtube_comments, which is not in the schema. It also reinforces that text is the reply text shown publicly, matching the schema description.

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 specifies the exact action: posting a public reply to a YouTube comment on the connected channel as the channel. It clearly distinguishes this from sibling reply tools for other platforms (e.g., reply_to_meta_comment, reply_to_thread) by naming YouTube and the comment resource.

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 provides clear context: the commentId should be retrieved from list_youtube_comments, a connected YouTube channel is required, and the user must approve the exact reply text before calling. It does not explicitly state when not to use this tool, but the platform-specific naming and prerequisites make the intended use obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

report_bugReport a bugAInspect

Report a bug in Hermoso to the team. Use this when something in Hermoso genuinely misbehaves — a tool errors unexpectedly, returns a wrong or malformed result, a render comes back broken, or documented behaviour doesn't match what happened. Include what you were trying to do, the exact tool call and arguments, and what came back. Do NOT use it for out-of-credits, a policy refusal, or a missing capability (use request_feature for that). Free, no credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailsYeswhat you were doing, the tool + arguments you called, what you expected, and what actually happened (paste the exact error)
summaryYesone-line summary of the bug
severityNohigh = blocks the task or loses paid work; medium = wrong output but workable; low = cosmetic

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
messageNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate a non-read-only, non-destructive write action. The description adds that the tool is free ('no credits') and instructs what to include in the report, providing behavioral context beyond the annotations. It doesn't describe the response, but an output schema exists.

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 four sentences: purpose, usage triggers, content instructions, and exclusions/cost. Each sentence earns its place, and it is front-loaded with the primary action.

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 straightforward reporting tool, the description covers when to use, what to include, exclusions, and cost. The output schema documents return values, so no critical information 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 baseline is 3. The description's guidance about including what you were doing, the call, and what came back mirrors the details parameter description, adding no new semantic meaning. Severity is not mentioned in the description but is fully documented in 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?

The description uses the verb 'Report' and specifies the resource 'a bug in Hermoso', making the action and target clear. It explicitly distinguishes from sibling tools by forbidding use for missing capabilities (request_feature exists).

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 precisely when to use (tool errors, wrong/malformed results, broken renders, behavior mismatch) and when not to use (out-of-credits, policy refusal, missing capability). It also names the alternative tool (request_feature) for missing capability.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

repost_threadRepost a Threads postAInspect

Repost an existing Threads post to the brand’s own Threads profile — the Threads equivalent of a retweet. It is how a brand amplifies a customer’s post, a mention, or one of its own older threads without copying the text, and there was previously no way to do it. Works on any Threads post id: list_threads_posts, list_threads_mentions and search_threads_keyword all return them. This creates a NEW post on the profile, so show the user what is being reposted and get a yes first. Threads publishes NO un-repost endpoint — because a repost returns its own media id, deleting THAT id with delete_thread is the likely undo, but Meta does not document it, so check the profile afterwards rather than promising it worked. 0 credits. Needs Threads connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
postIdYesthe Threads post id to repost

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
verifiedNo
mediaTypeNo
permalinkNo
repostedPostIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate a non-read-only, non-idempotent operation, but the description adds crucial specifics: 'This creates a NEW post on the profile,' requiring confirmation; 'Threads publishes NO un-repost endpoint' and the undo via delete_thread is uncertain ('Meta does not document it, so check the profile afterwards rather than promising it worked'). These details go far beyond the boolean hints and are transparent about side effects and uncertainty.

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 relatively long but front-loads the core purpose and packs every sentence with useful information—use case, input sourcing, side effects, undo uncertainty, credits, and connection requirement. The only marginal sentence is 'there was previously no way to do it,' but overall it remains well-structured and free of fluff.

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 and the presence of an output schema, the description covers all essential non-schema aspects: prerequisites ('Needs Threads connected'), input sources, side effects (new post created), undo limitations, and post-operation verification advice. It even includes cost ('0 credits') and a UX directive ('get a yes first'). This is highly complete.

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% with description 'the Threads post id to repost,' but the tool description adds meaningful context by specifying which sibling tools return valid IDs ('Works on any Threads post id: list_threads_posts, list_threads_mentions and search_threads_keyword all return them'). This helps the agent source the parameter, enhancing the basic schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: 'Repost an existing Threads post to the brand’s own Threads profile.' It further distinguishes from siblings by noting it is 'the Threads equivalent of a retweet' and done 'without copying the text,' and that 'there was previously no way to do it.' This uniquely positions the tool relative to reply_to_thread and post_to_meta.

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 provides explicit context on when to use the tool ('how a brand amplifies a customer’s post, a mention, or one of its own older threads') and names sibling tools that supply valid postIds. It also warns about the irreversible nature and advises getting user confirmation. However, it does not explicitly state when NOT to use it (e.g., when a reply is more appropriate), so it falls short of a full when/when-not/alternatives list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

request_featureRequest a featureAInspect

Ask the Hermoso team for a capability that doesn't exist yet. Use this when you need something Hermoso genuinely can't do — an unsupported platform or channel, a missing model, an export format, a tool that would have completed the user's task but isn't available. Say what the user was trying to achieve, not just the feature name — the use case is what gets built. Free, no credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailsYeswhat the user was actually trying to achieve, why the current tools couldn't do it, and what you'd expect the capability to do
summaryYesone line: the capability you need

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
messageNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a non-read-only, non-destructive, open-world request. The description adds valuable behavioral context by noting 'Free, no credits' and that 'the use case is what gets built,' clarifying the outcome and cost. It doesn't detail response times or side effects, but with annotations this is sufficient.

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?

Every sentence earns its place: opening states purpose, middle gives usage scenarios and exclusions, and closing adds cost and parameter guidance. It is compact yet information-dense, with no redundancy.

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 simple two-parameter tool with an output schema and annotations, the description is fully sufficient. It includes purpose, when to use, what to put in the parameters, and cost implications, so an agent can invoke it correctly without additional context.

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 schema already covers both parameters 100%. The description enriches parameter meaning by instructing the agent to 'Say what the user was trying to achieve, not just the feature name', directly guiding the `details` field, and highlighting the use-case-driven nature of the request.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the verb ('Ask') and the resource ('the Hermoso team for a capability that doesn't exist yet'), with concrete examples (unsupported platform, missing model, export format). It distinguishes this from the many operational tools and from report_bug by focusing on missing features rather than bugs.

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 explicit when-to-use guidance: 'Use this when you need something Hermoso genuinely can't do' and lists several scenarios. It does not name alternatives or explicitly say when not to use it (e.g., versus report_bug), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reschedule_postChange a scheduled postA
Idempotent
Inspect

Change a post that is still QUEUED — move it to a different time, rewrite the caption, swap the media, add or drop a channel, or change which board / Page / company Page / listing it goes to. PASS ONLY WHAT CHANGES: an omitted field is left exactly as it was, and an explicit empty string CLEARS one (linkedinOrganizationId:"" moves a company-Page post back to the person’s own profile). The edited item is re-checked against the identical rules its create passed — visibility the channel can honour, per-channel length, media the channel can carry — so an edit can never slip past a refusal that a create would have caught. Get the id from list_scheduled. Something that already went out cannot be changed: a published post is edited or removed with manage_meta_post / manage_linkedin_post / delete_x_post, not rescheduled.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNothe new time — ISO timestamp (2026-08-05T09:00:00Z) or epoch milliseconds. Must be in the future, at most 365 days out.
idYesthe scheduled post id from list_scheduled
linkNo
pollNoX — replaces the poll; an empty options list removes it.
tagsNoYOUTUBE — replaces the WHOLE tag list; an empty array [] clears the tags.
eventNoGOOGLE BUSINESS — replaces the whole event record {title, startDate, startTime, endDate, endTime}.
offerNoGOOGLE BUSINESS — replaces the whole offer record {couponCode, redeemOnlineUrl, termsConditions}.
titleNoPINTEREST / YOUTUBE — replace the headline; "" clears it and goes back to deriving one from the caption
pageIdNoFACEBOOK / INSTAGRAM / THREADS — publish from a different connected Page (list_meta_pages)
threadNoX — replaces the WHOLE thread; an explicit [] drops back to a single post using the caption.
altTextNoACCESSIBILITY — replace the image’s screen-reader description (used by X, Pinterest and LinkedIn company Pages); "" clears it.
boardIdNoPINTEREST — move the Pin to a different board (list_pinterest_boards)
messageNoreplace the caption used for every channel that has no override
captionsNoreplaces the WHOLE per-channel caption map — send every override you want to keep, not just the new one
channelsNoreplaces the channel list
imageUrlNoswap the image; "" removes it
videoUrlNoswap the video; "" removes it
imageUrlsNoreplace the CAROUSEL slides, in order; an empty array [] drops the carousel and goes back to a single image. Omit to leave the slides exactly as they are. The edited item is re-checked against the same carousel rules the create passed, so adding a channel that cannot swipe is refused now rather than posting slide 1 later.
topicTypeNoGOOGLE BUSINESS — the kind of Post; EVENT and OFFER both require `event`.
yourBrandNoTIKTOK — the own-brand disclosure; false turns it off.
actionTypeNoGOOGLE BUSINESS — the call-to-action button; "" clears it.
locationIdNoGOOGLE BUSINESS — a different listing (list_business_locations)
madeWithAiNoX — the AI-media label; false turns it off.
visibilityNoNOTE: changing this without also naming visibilityByChannel clears any per-channel overrides, so "make it all draft" is not a no-op
descriptionNoYOUTUBE — replace the video description; "" clears it. Remember the caption is the TITLE, not the description.
disableDuetNoTIKTOK VIDEO ONLY — block Duets.
disableStitchNoTIKTOK VIDEO ONLY — block Stitches.
replySettingsNoX — who may reply; "" goes back to everyone.
brandedContentNoTIKTOK — the paid-partnership disclosure; false turns it off.
disableCommentNoTIKTOK — comments off on this post.
coverTimestampMsNoTIKTOK VIDEO ONLY — cover frame in milliseconds.
visibilityByChannelNo
linkedinOrganizationIdNoLINKEDIN — target a different company Page, or "" to post as the connected person instead

Output Schema

ParametersJSON Schema
NameRequiredDescription
atNo
idNo
channelsNo
visibilityNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal write (readOnlyHint=false) and idempotence, but the description adds a wealth of behavioral nuance: omitted fields are preserved, empty strings clear values, edits are re-validated against create rules, and visibility changes can clear per-channel overrides. It also clarifies the tool's non-destructive nature while still allowing explicit clearing. This far exceeds the annotation baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but perfectly structured: a one-sentence purpose, a capitalized guiding rule, a re-validation guarantee, a source for the id, and an exclusion boundary with sibling tools. Every sentence adds functional information; no filler or repetition of schema content. The length is justified by the tool's complexity.

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 33-parameter tool with nested objects and an output schema, the description covers all essential operational aspects: partial update semantics, clearing values, re-validation, id sourcing, published-post alternatives, and a subtle pitfall about visibility. The output schema relieves it of explaining return values. Nothing critical 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 94%, so the baseline is 3. The description adds a critical global semantic that the schema cannot express: the partial-update model ('omitted field is left exactly as it was, explicit empty string CLEARS one'). It also disambiguates whole-map replacements (captions, thread, imageUrls) and the visibility/visibilityByChannel interaction. While the schema documents each parameter, this cross-cutting rule is invaluable and pushes the score above 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?

The description opens with a specific verb and resource: 'Change a post that is still QUEUED', and enumerates concrete editable elements (time, caption, media, channels, board/Page/company Page/listing). It explicitly contrasts with sibling tools by stating published posts go through manage_meta_post / manage_linkedin_post / delete_x_post instead. This is a textbook example of purpose clarity.

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: only for QUEUED posts, with the id sourced from list_scheduled. It has a clear when-not-to-use: published posts cannot be changed here, naming the alternative tools. The 'PASS ONLY WHAT CHANGES' directive also tells the agent the exact editing model. No ambiguity about selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

research_adsResearch adsA
Read-only
Inspect

Natural-language ad research: a Claude tool-use loop over Meta/Google/LinkedIn ad libraries + organic TikTok. Returns a summary + the found ads (with their served URLs). Spends LLM tokens + ScrapeCreators credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandNobrand name or profile object to tailor the research to; omit to use the workspace’s saved brand
queryYeswhat to research, e.g. "the longest-running protein-pancake ads on Meta"

Output Schema

ParametersJSON Schema
NameRequiredDescription
replyNothe research summary
actionsNofollow-up actions the research loop suggested
resultsNothe found ads/videos (normalized card objects with served URLs)
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint. The description adds valuable behavioral disclosure: 'a Claude tool-use loop' indicates an iterative/agentic process, and 'Spends LLM tokens + ScrapeCreators credits' surfaces costs beyond the annotation-provided safety profile.

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 three sentences, front-loaded with the core purpose, and every sentence earns its place: what it does, what it returns, and what it costs. No redundancy or 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?

Given the tool's complexity (multi-platform loop, output with URLs, cost implications), the description covers the key contextual elements: scope, return value, and resource consumption. It lacks explicit usage alternatives, but the output schema and annotations fill in structural details.

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 clear explanations for both 'query' (including an example) and 'brand' (including the omit-to-use-default behavior). The description adds no additional parameter semantics, so the baseline of 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 clearly states it is 'Natural-language ad research' over specific platforms ('Meta/Google/LinkedIn ad libraries + organic TikTok') and defines the output ('a summary + the found ads (with their served URLs)'). This distinguishes it from sibling single-platform search tools like search_meta_ads or search_google_ads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for broad, natural-language, cross-platform ad research, but it does not explicitly say when to use this tool versus alternatives or when not to use it. No sibling tools are named, so the guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

retry_scheduledRetry a failed scheduled postAInspect

Send a post that FAILED again. A scheduled post fans out across its channels INDEPENDENTLY, so a failure is usually PARTIAL — LinkedIn 401s while Instagram published fine — and this re-fires ONLY the channels that did not succeed by default (list_scheduled reports them as retryable). It re-queues the same content as a NEW post a few seconds out, and the original keeps its failure record so the history still shows what went wrong. Naming a channel that already published is REFUSED rather than quietly posting a second time. Two independent belts stop a double-post: a channel that genuinely published can only REPLAY (nothing is posted), and a channel whose outcome is UNRESOLVED — the platform timed out and may be holding the post — refuses with that reason instead of guessing. Retry after fixing the cause: reconnecting the account, picking a board, shortening the caption. To send the same thing again ON PURPOSE, use duplicate_scheduled.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNowhen to retry — ISO timestamp or epoch milliseconds (default: a few seconds from now)
idYesthe scheduled post id from list_scheduled
channelsNoretry only these channels (default: every channel that did not publish)
allowDuplicateNoONLY for a channel you have checked by hand and confirmed the post is genuinely NOT there. It bypasses the double-post protection and can publish a second public copy, so never set it to work around a refusal you have not investigated.

Output Schema

ParametersJSON Schema
NameRequiredDescription
atNo
idNo
noteNo
retryOfNo
channelsNo
retryingNo
alreadyPublishedNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond annotations by explaining that failures are usually partial, the retry creates a NEW post while keeping the original failure record, and that naming a published channel is refused. It details the two-belt double-post protection and how unresolved outcomes (timeouts) are handled. This provides critical behavioral nuance absent from the bare hints.

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?

While the description is long, it's densely packed with essential information and front-loaded with the primary action. Each sentence addresses a distinct behavioral aspect: partial failures, re-queueing, refusals, double-post protection, retry guidance, and alternative tools. No filler or redundant 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?

For a tool with this complexity—partial failures, safety belts, and ambiguous outcomes—the description covers every important scenario and explains how to proceed. The existence of an output schema covers return values. It also references sibling tools and the retryable flag, making the operational context 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?

All four parameters already have thorough descriptions in the schema, covering defaults and safety warnings for `allowDuplicate`. The tool-level description largely restates the channels default and does not add additional parameter-specific guidance. Since schema coverage is 100%, the baseline applies, and the description doesn't materially enhance parameter understanding.

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 'Send a post that FAILED again' which clearly states the action and resource. It distinguishes from siblings by explaining that it re-fires only failed channels while `duplicate_scheduled` is for intentional reposts. The partial-failure concept and refusal of already-published channels make the tool's specific role unambiguous.

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 explicitly says 'Retry after fixing the cause' with concrete examples (reconnecting the account, picking a board, shortening the caption). It names `duplicate_scheduled` as the alternative for intentional duplicates and references `list_scheduled` as the source for retryable status. This tells the agent when to use this tool versus alternatives clearly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_post_refillRun the posting refillAInspect

Run the refill NOW instead of waiting for its daily turn. DRY BY DEFAULT: it returns the exact posts it WOULD queue — the caption, the creative, the channels and the per-channel visibility — without queueing anything or spending anything on creative. Pass dryRun:false to actually queue them. SHOW THE PREVIEW TO THE USER BEFORE EVER PASSING dryRun:false; these go onto real public accounts. Every caption is screened against the brand’s own voice rules and a failing one is dropped, so a plan can legitimately come back shorter than the cadence — the reason is in the notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoplan even while the refill is switched off — useful for showing someone what it would do before they turn it on. Combined with dryRun:false it still respects a stored dryRun.
dryRunNodefault TRUE (preview only). false actually queues the posts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesNo
postsNo
spendNo
dryRunNo
queuedNo
enabledNo
summaryNo
perChannelNo
skippedSlotsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond what annotations provide, the description discloses several critical behavioral traits: dry-run is the default, the preview returns exact post details (caption, creative, channels, per-channel visibility), no creative spend occurs, passing dryRun:false publicly queues posts, and voice-rule screening can drop captions with the reason in notes. This is rich, non-obvious behavior.

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 longer than two sentences but every sentence earns its place: purpose, default behavior, how to actually execute, safety warning, and screening side-effect. It is front-loaded with the action ('Run the refill NOW') and uses all-caps for the most critical safety instruction without wasting words.

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 presence of an output schema and 100% parameter schema coverage, the description fully covers the remaining contextual needs: when to trigger the refill, the dry-run vs. live distinction, the public-account warning, and the voice-screening behavior. No major gaps remain for an agent to select and invoke the tool correctly.

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 elevates this by explaining what dryRun:true returns and that dryRun:false costs creative spend and goes to real accounts, which is more concrete than the schema's 'preview only' and 'actually queues the posts.' The force parameter is not mentioned in the description, but the schema already documents it thoroughly.

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 specific verb and object: 'Run the refill NOW instead of waiting for its daily turn.' It clearly distinguishes the tool's action (performing a refill now) from just viewing the refill, and explains both the dry-run preview and the actual queueing behavior.

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 when-to-use guidance ('Run the refill NOW instead of waiting for its daily turn') and an explicit safety condition ('SHOW THE PREVIEW TO THE USER BEFORE EVER PASSING dryRun:false'). It does not name sibling alternatives like get_post_refill, so it falls short of a 5, but the context is unmistakable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_creatorSave a creatorAInspect

Add a portrait to this workspace’s reusable CAST so the SAME person can star in future ads — the headless twin of the app’s + ▸ Pick a creator ▸ save. Pass the portrait’s public url (a generate_image render of a person, a headshot, any public photo) plus a name to call them by; from then on list_creators returns them and their url can be re-passed to generate_avatar / generate_video / recast_motion. Saving is FREE and renders nothing. LIKENESS — source says what the portrait IS: leave it "generated" for an AI-made person, and use "upload"/"social" ONLY for a REAL person. Pass consented:true only when the user has told you that person agreed to their likeness being used; never assert that on their behalf.

ParametersJSON Schema
NameRequiredDescriptionDefault
lookNotheir canonical wardrobe/appearance in words — reused to hold the look steady across ads
nameYeswhat to call this creator (e.g. “Sarah”) — list_creators and the app’s picker match on it
imageYespublic https url of the portrait (an existing render’s url, or any public photo). Not a local file path — upload it with upload_file first and save the url that returns
posesNoup to 4 extra full-body / angle plates of the SAME person (public urls) — they make a wider shot hold the identity
voiceNoa default voice name for this persona (engines + voices are in hermoso_capabilities)
sourceNo"generated" (default) = an AI-made person; "upload" / "social" = a REAL person
consentedNoREAL people only: the user has confirmed that person consented to their likeness being used in ads

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
creatorNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no behavioral hints (all false), so the description carries the full burden. It discloses 'Saving is FREE and renders nothing,' and provides critical ethical guidance on likeness: 'leave it "generated" for an AI-made person... use "upload"/"social" ONLY for a REAL person' and 'Pass consented:true only when the user has told you... never assert that on their behalf.' This goes beyond the schema and 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 moderately long but well-structured: main purpose, usage pattern, behavioral note ('FREE and renders nothing'), and a distinct LIKENESS section for consent. Each sentence contributes meaning, though the density could be slightly reduced without losing substance. It is clear and front-loaded with the most important 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 tool's complexity (7 params, consent requirements, interactions with other tools), the description covers all essential context: what it does, how to use it, what happens afterward, and ethical constraints. The output schema exists, so return values are not needed. The description is sufficiently complete for an agent to decide when and how to invoke it.

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 adds value by explaining the image parameter accepts 'a generate_image render of a person, a headshot, any public photo' and clarifies the semantics of source and consented with examples and constraints. This enriches beyond the schema's per-property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Add a portrait to this workspace’s reusable CAST so the SAME person can star in future ads.' It uses a specific verb ('Add') and resource ('reusable CAST'), distinguishes from siblings by noting 'list_creators returns them' and the URL can be reused in generate_avatar/generate_video/recast_motion, and references the app UI feature 'Pick a creator ▸ save' for clarity.

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 explains the workflow: pass a public URL plus a name, and thereafter list_creators returns them. It implies when to use (when you need a reusable cast member) and contrasts with one-off generation by emphasizing reusability. However, it does not explicitly state when NOT to use or compare against specific sibling tools like generate_avatar, though the reuse benefit is implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_employeeSave an AI employeeAInspect

Create a custom AI Employee persona for this workspace — a named specialist with a role + a DIRECTIVE that frames how the studio behaves while it’s hired. Merges into the workspace Employees. Use set_active_employee to hire it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesthe persona’s name (e.g. “Nadia”)
emojiNoan emoji badge (default ✦)
pitchNoone-line pitch
titleNojob title (e.g. “Short-Form Ad Strategist”)
directiveYeshow it should shape ads (2–5 sentences, imperative)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide safety flags (readOnly=false), but the description adds meaningful behavior: merging into workspace Employees and the fact that saving does not automatically hire the employee. This clarifies side effects beyond the generic write implication of 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences: purpose, side effect, and follow-up action. Every sentence carries distinct value with no redundancy, and the most critical information appears first.

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 description explains the tool's role in the broader workflow (save then hire), which is essential for correct selection. With an output schema present and full parameter schema coverage, missing details like overwrite behavior are acceptable gaps.

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 well-documented. The description re-emphasizes 'role' and 'DIRECTIVE' but does not add new semantic detail about parameters like emoji, pitch, or title 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 clearly states the tool creates a custom AI Employee persona for the workspace, with a name, role, and directive. It distinguishes itself from siblings like set_active_employee (hire) and list_employees by explicitly framing the save/persist action and its workspace scoping.

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 'Use set_active_employee to hire it,' giving a direct alternative for the next step. The description also clarifies when this tool is appropriate (creating/merging a persona) versus hiring (set_active_employee).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_pinterest_pinSave a Pin to another boardAInspect

Save an existing Pin onto another of the account’s boards. This is the GENERALLY AVAILABLE way to get a Pin onto the right board — unlike update_pinterest_pin, which Pinterest keeps in a limited beta — so reach for it first when a Pin is on the wrong board. It COPIES rather than moves: Pinterest’s save endpoint creates a new Pin and the original stays where it is, so delete that one with delete_pinterest_pin if it should not be in two places. Let the USER pick the destination board (list_pinterest_boards) — a Pin on the wrong board is a public mistake. 0 credits. Needs Pinterest connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
pinIdYesnumeric Pin id
boardIdYesthe board to save it to, from list_pinterest_boards — the user picks, never guess
boardSectionIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
urlNo
noteNo
pinIdNo
boardIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses critical behaviors beyond annotations: it COPIES rather than moves, the original stays, and cleanup may require delete_pinterest_pin. It also notes the prerequisite of Pinterest being connected and the 0 credit cost, adding meaningful context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet information-dense, with each sentence earning its place. It front-loads the purpose, then systematically covers alternative tools, copy behavior, user guidance, and operational prerequisites, all without redundancy.

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?

The description covers all essential behavioral and operational aspects: when to use, what it does, how it differs from siblings, prerequisites, cost, and user-in-the-loop requirements. An output schema exists, so return values need no explanation. The tool is fully contextualized for correct selection and invocation.

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 schema already has decent coverage (67%) with descriptions for pinId and boardId. The description reinforces the boardId semantics by emphasizing user choice and warns against guessing, adding rationale. However, it does not address the undocumented boardSectionId parameter, leaving a gap in compensating for the incomplete 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?

The description clearly states the verb and resource: 'Save an existing Pin onto another of the account’s boards.' It distinguishes itself from update_pinterest_pin by noting the save endpoint is generally available while update_pinterest_pin is in limited beta, and explicitly contrasts copying versus moving.

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: 'reach for it first when a Pin is on the wrong board.' It also names alternatives (update_pinterest_pin, delete_pinterest_pin) and instructs the user to pick the destination board via list_pinterest_boards, providing clear context and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_playbookSave a playbookAInspect

Save a reusable PLAYBOOK — the strategy takeaways worth re-running: the hooks that work, the angles, the formats, and the concrete plays. Use it to keep what a competitor_teardown or mine_angles just found, or to bank a creative you want to repeat. Lands in the same Playbooks library the web app lists, runs and manages. Distinct from save_skill (a directive applied to every ad) and from the swipefile (raw saved creative). Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesthe playbook headline — what it is, in a few words
brandNowhich brand this is for (defaults to the workspace brand)
hooksNothe opening hooks worth reusing, verbatim
playsNothe concrete plays to run ({title, detail}) — the actionable half
anglesNothe persuasion angles ({title, detail})
sourceNowhere it came from, e.g. “teardown · Ridge”
formatsNothe formats/recipes this plays best in (e.g. ugc_selfie, cinematic, static)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context beyond the annotations: it states the data lands in the Playbooks library, and notes the tool is free. Annotations are all false (not read-only, not idempotent, not destructive), so no contradiction; the cost and persistence details are valuable extras.

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 tight and well-structured: it leads with the core purpose, then when to use it, then where it lands and alternatives. Every sentence adds value; no filler. Length is appropriate for the tool's complexity.

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 description provides a holistic picture: purpose, usage context, persistence location, cost, and alternatives. It doesn't detail all 7 parameters, but the schema already describes them fully. With an output schema present and the helpful semantic distinctions, the description is complete enough for accurate tool selection and invocation.

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 reinforces the parameter meanings by naming the core fields ('hooks that work, the angles, the formats, and the concrete plays') and clarifies the semantic difference between a playbook and a skill/swipefile, which helps users populate the fields correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Save'), the resource ('a reusable PLAYBOOK'), and the specific content (hooks, angles, formats, plays). It explicitly distinguishes from siblings like save_skill and the swipefile, which makes the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

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: 'Use it to keep what a competitor_teardown or mine_angles just found, or to bank a creative you want to repeat.' It also names alternatives (save_skill, swipefile) and explains why they are distinct, giving clear exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_skillSave a skillAInspect

Save a reusable custom SKILL — a named creative directive/playbook applied to future ads (a hook formula, a UGC recipe, a compliance rule, “our founder-story style”). Distill an imperative, self-contained directive. Merges into the workspace Skills library (list_skills shows built-ins + your custom skills).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesshort skill name, e.g. “Founder-story hook”
directiveYesthe full instruction the skill applies when used (1–6 sentences, imperative)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate non-read-only and non-destructive. The description adds behavioral context by specifying that skills are imperative, self-contained directives that merge into the workspace library, and that list_skills shows both built-ins and custom skills. It does not disclose duplicate-name behavior, but the added context goes beyond the minimal 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?

The description is three sentences, front-loaded with the core purpose, and every sentence adds value: definition, guidance, and library integration. No filler or redundancy.

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 2-parameter save tool with an output schema, the description fully explains what the tool does and how it fits into the skills ecosystem. It doesn't discuss duplicate handling or return values, but the output schema covers return structure, and the tool is not complex enough to require more.

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 covers both parameters with descriptions. The description adds semantic value by providing examples of skills (hook formula, UGC recipe, compliance rule) and by instructing the agent to distill a self-contained directive, helping the agent construct appropriate values for name and directive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool saves a reusable custom SKILL, defining what a skill is (a named creative directive/playbook applied to future ads). It provides concrete examples and explicitly mentions the Skills library and list_skills, distinguishing it from other save tools.

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 implies when to use the tool (for saving reusable directives for future ads) and provides context about the library via list_skills. However, it does not explicitly mention alternatives or exclusions like save_playbook, so it lacks explicit guidance on when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_to_driveSave file(s) to Google DriveAInspect

Save a Hermoso render — or ANY file — into the user’s connected Google Drive. Pass a Hermoso render URL as url (or urls[] for several); for a local/external file, call upload_file first and pass the url it returns. Optional folder (created if new) + name. Returns the Drive file(s) with a webViewLink. Needs Google Drive connected (Settings ▸ Connectors ▸ Google Drive — one connection covers Drive, Sheets and Docs). NOTE: Hermoso uses the drive.file scope, so it reaches ONLY the files it created plus any the user explicitly handed over with the Google file picker in the app — never their whole Drive.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoa single Hermoso render URL to save
nameNofile name (single save)
urlsNoseveral render URLs (up to 20) to save in one call
folderNoDrive folder name to save into (created if new)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
filesNo
failedNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the boolean annotations by disclosing the drive.file scope limitation (only files created by Hermoso or explicitly handed over by the user), the need for a connected Drive account, folder auto-creation, and the return of webViewLink. This prevents significant user surprise and clarifies side effects.

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?

Six dense sentences cover what the tool does, how to invoke it, parameter usage, return value, prerequisites, and a critical scope caveat. Every sentence earns its place; there is no filler or repetition of schema/annotation content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the annotations, output schema, and sibling tools, the description is complete. It addresses input methods for both render and arbitrary files, connection requirements, return format, and the non-obvious drive.file access limitation. An agent has everything needed to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already describes all 4 parameters with 100% coverage, the description adds crucial semantic context: the distinction between url and urls[], the upload_file prerequisite for local files, and the fact that folder is auto-created if new. This meaningfully enriches 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?

The description opens with a specific verb and resource: 'Save a Hermoso render — or ANY file — into the user’s connected Google Drive.' It clearly distinguishes the tool from siblings like save_to_onedrive and save_to_swipefile by covering both render URLs and arbitrary files via upload_file.

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 explicit operational guidance: pass a Hermoso render URL as url or urls[], and for local/external files call upload_file first and pass its returned URL. It also notes the Google Drive connection prerequisite and warns about drive.file scope. It does not explicitly contrast with save_to_onedrive or save_to_swipefile, slightly limiting alternative-tool guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_to_onedriveSave file(s) to OneDriveAInspect

Save a Hermoso render — or ANY file — into the user’s connected Microsoft OneDrive. Pass a Hermoso render URL as url (or urls[] for several); for a local/external file, call upload_file first and pass the url it returns. Optional folder (created if new) + name. Returns the OneDrive file(s) with a webViewLink. Needs OneDrive connected (Settings ▸ Connectors ▸ OneDrive).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoa single Hermoso render URL to save
nameNofile name (single save)
urlsNoseveral render URLs (up to 20) to save in one call
folderNoOneDrive folder name to save into (created if new)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
filesNo
failedNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a write operation (readOnly=false), non-idempotent, open-world side effects. The description adds concrete behavior: folder creation when new, return format webViewLink, and the OneDrive connection requirement. This goes beyond the annotations and clarifies side effects and prerequisites.

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 three sentences, front-loaded with the core purpose, then usage specifics, then connection requirement. No wasted words; every sentence adds a distinct piece of 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?

For a tool with four optional parameters and an output schema, the description covers the essential context: input types, multi-file support, folder creation, return value, and authentication prerequisite. It also distinguishes from sibling tools like save_to_drive and upload_file. The schema already documents the 'up to 20' limit for urls, so no gap there.

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 descriptions cover all four parameters (100%), so the baseline is 3. The description adds meaning by clarifying the relationship between url and urls ('Pass a Hermoso render URL as url (or urls[] for several)') and by explaining that url can also be the output of upload_file for local/external files, extending beyond the schema's 'Hermoso render URL' wording. It also mentions optional name/folder with folder creation semantics.

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 'Save a Hermoso render — or ANY file — into the user's connected Microsoft OneDrive,' which is a specific verb+resource. It distinguishes from siblings like save_to_drive (Google Drive) and upload_file by specifying OneDrive and explaining the upload_file flow for local files.

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?

The description explicitly tells when to use upload_file first for local/external files, and when to use url vs urls for one or several renders. It also gives a prerequisite: 'Needs OneDrive connected (Settings ▸ Connectors ▸ OneDrive)', which helps the agent verify readiness. This provides clear context and an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_to_swipefileSave ads to the swipefileA
Idempotent
Inspect

Save one or more ads/creatives to a named SWIPEFILE collection, creating the collection if it does not exist — the headless twin of the ♥ on every ad card in the web app. Use it whenever research turns up something worth keeping: a competitor ad from search_meta_ads / pull_competitor_ads, an organic post, or one of your own renders. Saved ads persist to the workspace board the web Swipefile tab shows, and feed the taste signal every future ad is planned against. De-dupes: re-saving the same ad (same key/link/media) MOVES it into the named collection instead of duplicating it. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesthe ads to save
collectionYesthe collection name — an existing one, or a new one to create

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
movedNo
savedNo
totalNo
collectionNo
collectionIdNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral traits beyond the annotations: auto-creating collections, persisting to the workspace board, feeding the taste signal, and de-duplication with a move (not duplicate) behavior. The idempotentHint is already in annotations, but the explanation of how the same key/link/media gets moved adds meaningful context. 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?

The description is well-structured and front-loaded with the core purpose. It is somewhat longer than necessary due to the 'headless twin' metaphor and 'Free' note, but each sentence contributes useful context (usage, persistence, de-dupe, cost). It remains readable and focused.

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 rich schema, output schema, and annotations, the description is complete enough for an agent to select and invoke the tool correctly. It covers what it does, when to use it, where data persists, de-duplication behavior, and cost. No critical operational details appear missing for the tool's complexity.

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 description coverage is 100%, so the baseline is 3. The description adds value by explaining how the key/link/media relate to de-duplication ('same key/link/media') and by providing real-world input sources (search_meta_ads, pull_competitor_ads) that clarify what the items should contain. This goes slightly beyond the schema's per-field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action and resource: 'Save one or more ads/creatives to a named SWIPEFILE collection, creating the collection if it does not exist.' It distinguishes itself from siblings like save_to_drive and save_to_onedrive by focusing on ads and the swipefile concept, and even ties to a UI metaphor ('headless twin of the ♥').

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 provides explicit when-to-use guidance: 'Use it whenever research turns up something worth keeping: a competitor ad from search_meta_ads / pull_competitor_ads, an organic post, or one of your own renders.' It does not explicitly mention when not to use it or name alternatives, but the context is clear enough that no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schedule_postSchedule a post for laterAInspect

Queue a post to go out at a future time, to one or more connected channels at once (facebook, instagram, threads, tiktok, youtube, linkedin, x, pinterest, google_business). A MULTI-SLIDE creative goes in imageUrls[] as a CAROUSEL, in order — never schedule just its first slide. This is how you run a content calendar: schedule now, and Hermoso publishes at the time you set — you do not need to be around. Either name the exact time in at, or pass useQueue:true to take the brand’s next free POSTING SLOT (its saved posting times, skipping any already occupied) — that is what “just queue it” means and it saves the user picking a minute. Pass a Hermoso render URL as imageUrl/videoUrl (or an upload_file URL for external media). PINTEREST AND YOUTUBE ALSO SHOW A TITLE: pass title (max 100 chars) — omit it and Hermoso derives one from the caption’s first sentence rather than truncating the caption mid-word, which is what a Pin headline used to be. A YOUTUBE ITEM’S CAPTION IS ITS TITLE, NOT ITS DESCRIPTION: pass description (≤5000 chars) for the box under the video — the links, the CTA and everything YouTube search reads — plus tags (up to 30). Omit them and the upload lands with an empty description, which is not recoverable by the time anyone notices. Use captions to give each channel its own wording; anything not listed falls back to message. PER-CHANNEL SETTINGS, all carried straight through to the real publisher: TIKTOK takes the paid-partnership disclosure (brandedContent) and the own-brand one (yourBrand) — set them whenever the post is commercial, they are compliance declarations — plus disableComment and, on a video, disableDuet / disableStitch / coverTimestampMs. GOOGLE BUSINESS takes topicType (STANDARD / EVENT / OFFER / ALERT) with event and offer, and a real actionType button instead of the hard-coded Learn more. X takes a whole thread, a poll, replySettings and madeWithAi. Channels are attempted INDEPENDENTLY, so one failing channel never blocks the others. SOME CHANNELS MUST BE TOLD WHICH ACCOUNT, and Hermoso never guesses one: a Pinterest pin needs boardId (list_pinterest_boards) or it is refused outright; a LinkedIn COMPANY PAGE post needs linkedinOrganizationId (list_linkedin_pages) and without it the post goes to the connected person’s own profile; a brand with more than one connected Facebook Page needs pageId (list_meta_pages) and an account managing more than one Google Business listing needs locationId (list_business_locations) — resolve those FIRST and let the user pick, because with several to choose from and no id the post is refused when it fires, hours later. A scheduled post GOES LIVE PUBLICLY by default on every channel — that is what scheduling means, and nothing is ever quietly downgraded to a draft or an unlisted upload. If the user genuinely wants something staged instead, set visibility (or visibilityByChannel for just one channel): ‘public’ (default, live) · ‘unlisted’ (YouTube only — link-only) · ‘private’ (YouTube private, or TikTok posted SELF_ONLY) · ‘draft’ (TikTok drafts, or an unpublished Facebook Page post for a human to publish). Ask for a weaker visibility only if the user asked for one. If a channel cannot do the visibility requested, the call is REFUSED right now with the reason, rather than posting something weaker later. Most channels publish publicly and nothing else: only YouTube has unlisted/private, only TikTok has private/draft, and only Facebook has draft.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNowhen to post — ISO timestamp (2026-08-01T09:00:00Z) or epoch milliseconds. Must be in the future, at most 365 days out. Give this OR useQueue, never both.
hookNoWHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works.
linkNoa link to attach (Facebook)
pollNoX — attach a poll: {options:["…","…"], durationMinutes}. 2–4 options of at most 25 characters each; voting runs 5–10080 minutes (7 days), default 1440. X makes a poll MUTUALLY EXCLUSIVE with media, so an item carrying an image or video is refused — schedule the poll as its own X-only post.
tagsNoYOUTUBE — up to 30 search tags for the video (plain words, no #).
eventNoGOOGLE BUSINESS — required for an EVENT or OFFER post: {title, startDate:"YYYY-MM-DD", endDate, startTime:"HH:MM", endTime}. `title` is the EVENT’s headline, a different thing from the post `title` (which is the Pinterest/YouTube one). Google documents its TimeInterval as needing all four date/time parts to be valid, so send the times whenever you know them.
offerNoGOOGLE BUSINESS — OFFER posts only: {couponCode, redeemOnlineUrl, termsConditions}. redeemOnlineUrl is where an offer actually sends people, since the button link is ignored on an Offer.
titleNoPINTEREST / YOUTUBE — the headline, max 100 characters. Pinterest shows it in search and under the pin; YouTube requires one. Leave it out and Hermoso derives one from that channel’s caption (first sentence, cut on a word boundary, trailing hashtags dropped) — set a real one whenever the caption does not open with a usable headline.
pageIdNoFACEBOOK / INSTAGRAM / THREADS — which connected Facebook Page (and its linked Instagram) publishes, from list_meta_pages. Needed when the brand has more than one Page connected; with several and no id the post is refused at fire time rather than sent from the wrong brand.
threadNoX — publish a THREAD, one entry per post, each replying to the one before (at most 25, each ≤280 characters). It REPLACES the X caption: with a thread set, `message`/`captions.x` is not sent to X at all. A thread cannot carry a poll.
altTextNoACCESSIBILITY — the screen-reader description of the attached image. X (max 1000 characters), Pinterest (max 500) and LinkedIn COMPANY PAGE posts each attach it to the picture; the schedule is REFUSED if it is longer than the tightest of the channels on it, rather than truncated on the way out. Write one whenever the post carries an image: describe what is IN the picture, never a repeat of the caption, which a screen reader already reads. A LinkedIn post to a PERSONAL profile carries none — LinkedIn’s member posting API has no alt-text field at all.
boardIdNoPINTEREST — REQUIRED whenever pinterest is a channel: the board the Pin goes on, from list_pinterest_boards. The user picks it; a Pin on the wrong board is a public mistake. Scheduling pinterest without one is refused immediately.
messageNothe caption/text used for every channel unless overridden in captions
subjectNoWHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group.
captionsNoper-channel caption overrides, e.g. { "instagram": "…", "threads": "…" } — platforms want different lengths and hashtag conventions
channelsYesone or more channels to post to at that time
imageUrlNoa Hermoso render URL (a /generated path, or what upload_file returned), a data: URI, or a public https URL. NOTE: only Facebook/Instagram/Threads accept an arbitrary public URL — X, TikTok, YouTube, LinkedIn, Pinterest and Google Business re-host the bytes and REFUSE anything that is not a Hermoso render, so run an external file through upload_file first and schedule that url.
timezoneNoIANA zone for the queue, e.g. "America/New_York" — only meaningful with useQueue, and it overrides the brand’s saved zone for this one post. A saved slot of "09:00" is a WALL-CLOCK time, so the zone is what turns it into an instant; without either the brand’s saved zone or this, the queue resolves in UTC.
useQueueNoinstead of naming a minute, drop this into the brand’s POSTING QUEUE: Hermoso takes the earliest of its saved posting times that is still free (skipping any slot another queued post already holds). This is the natural answer to “just queue it” / “post it at my next opening”. Mutually exclusive with `at` — passing both is refused rather than one being silently preferred. If the brand has no posting times set, or every slot for the next 90 days is taken, it is refused by name and nothing is scheduled.
videoUrlNoa Hermoso render URL (a /generated path, or what upload_file returned), a data: URI, or a public https URL — required for youtube, and for tiktok unless you pass an imageUrl (TikTok takes a photo post too). Same origin rule as imageUrl: everything except Facebook/Instagram/Threads REFUSES a non-Hermoso URL, so pass external video through upload_file first.
imageUrlsNoCAROUSEL — an ORDERED list of image URLs to publish as ONE swipeable post on every channel that supports it (Instagram 2–10, Threads 2–20, Facebook, LinkedIn company Pages 2–20, Pinterest 2–5, TikTok up to 35 as a photo post). Use this whenever the creative is a multi-slide deck: a scheduled post carrying only slide 1 of a “1/6 · SWIPE” set is a broken ad that nobody is watching when it fires. THE ORDER IS THE PRODUCT. A channel on this schedule that cannot do carousels — X, YouTube, Google Business Profile — is REFUSED NOW, with the reason, so you can drop it or give it its own single image; it is never quietly downgraded hours later.
topicTypeNoGOOGLE BUSINESS — the KIND of Post. STANDARD is the default; EVENT and OFFER both REQUIRE `event` (title + start date), and OFFER also takes `offer`.
yourBrandNoTIKTOK — the OWN-BRAND disclosure (brand_organic_toggle): true when the post promotes the creator’s own business. TikTok asks for at least one of this and brandedContent once a post is commercial.
actionTypeNoGOOGLE BUSINESS — the call-to-action button. Every button except CALL needs `link` (CALL dials the number on the listing and takes none). Google IGNORES the button link on an OFFER post — put the destination in offer.redeemOnlineUrl. Omit and a post carrying a link gets LEARN_MORE.
locationIdNoGOOGLE BUSINESS PROFILE — which listing, e.g. 'locations/123' from list_business_locations. Needed when the account manages more than one storefront; it is never chosen for the user.
madeWithAiNoX — X’s AI-media label on this post. Opt-in: X treats it as the poster’s own claim about their media, so it is never set on the user’s behalf.
visibilityNohow it should be published — DEFAULT 'public' (live). Only pass something else if the user explicitly asked to stage/hide it. Not every channel supports every value; an impossible combination is refused when you schedule it, with the reason.
descriptionNoYOUTUBE — the video DESCRIPTION, max 5000 characters: the box under the video carrying the links, the CTA and everything YouTube search reads. It is NOT the caption — a scheduled YouTube item’s text becomes its TITLE — so omitting this publishes the video with an empty description.
disableDuetNoTIKTOK VIDEO ONLY — block Duets. TikTok’s photo-post API has no Duets, so this is refused on a photo/slideshow item rather than silently dropped.
disableStitchNoTIKTOK VIDEO ONLY — block Stitches. Same photo-post rule as disableDuet.
replySettingsNoX — who may reply. Omit for everyone, which is the right default for a brand post.
brandedContentNoTIKTOK — the PAID-PARTNERSHIP disclosure (TikTok’s brand_content_toggle): true when this post promotes a THIRD-PARTY business. It is a compliance declaration, not a preference — set it whenever the post is sponsored. TikTok only accepts branded content on a public or friends-only post, so it cannot ride a private/SELF_ONLY or draft TikTok item and the schedule is refused with the reason.
disableCommentNoTIKTOK — turn comments off on this post.
coverTimestampMsNoTIKTOK VIDEO ONLY — which frame TikTok uses as the cover, in milliseconds from the start. Omit and TikTok uses the first frame.
visibilityByChannelNooverride visibility for one channel, e.g. { "tiktok": "draft" } to go live everywhere but stage TikTok for review
linkedinOrganizationIdNoLINKEDIN — publish as a COMPANY PAGE instead of the connected personal profile. The organization id from list_linkedin_pages. Omit and it posts as the person: an unset id means the profile, never “probably the company”. A Page can also carry VIDEO, which a personal profile cannot.

Output Schema

ParametersJSON Schema
NameRequiredDescription
atNo
idNo
labelNo
channelsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses extensive behavioral traits far beyond the minimal annotations: channels are attempted independently, impossible combinations are refused at schedule time rather than silently downgraded, posts go live publicly by default, and account IDs must be resolved first. It clearly states compliance declarations (brandedContent, yourBrand) and the irreversible nature of an empty YouTube description. 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?

The description is very long but well-structured with uppercase topical section markers and logical flow. Some redundancy with the schema descriptions exists, and trimming would improve succinctness, but the complexity of 36 parameters and 9 channels justifies the length. It is front-loaded with the core purpose.

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 tool this complex, the description is exceptionally complete. It covers per-channel capabilities, visibility restrictions, required account IDs, refusal scenarios, fallback logic, and output expectations. With an output schema present, it does not need to describe return values, and it goes far beyond the annotations in preparing the agent for edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema coverage, the description adds substantial cross-parameter semantics: mutual exclusivity of `at`/`useQueue`, `thread` replacing the X caption, `imageUrls` as a carousel with refusal on non-carousel channels, and per-channel required IDs (boardId, linkedinOrganizationId, pageId, locationId). It explains fallback behavior (title derivation) and consequences of omission (empty YouTube description), providing meaning beyond individual schema descriptions.

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 clear verb and resource: "Queue a post to go out at a future time, to one or more connected channels at once". It explicitly lists nine supported channels, distinguishing itself from immediate-posting siblings like post_to_x through the scheduling framing and "This is how you run a content calendar". No ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: schedule now, use `useQueue` for the next free posting slot, and named alternatives within the tool (at vs useQueue, visibility vs visibilityByChannel). It implicitly separates this from immediate posting by emphasizing future publication and that the user doesn't need to be around, but it does not explicitly name sibling post_to_* tools or state 'do not use for immediate posting', so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

score_adScore adA
Read-only
Inspect

Virality/performance prediction for a finished ad (image or video URL): overall score, per-dimension breakdown (scroll-stop, hook, clarity, brand/product, CTA, retention, goal fit), strengths, and the single biggest fix. Use BEFORE spending on distribution, or to rank variants.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesthe ad asset URL (a /generated/ path or public URL)
kindNo'image' (default) or 'video'
intentNowhat the ad is trying to achieve, for goal-fit scoring

Output Schema

ParametersJSON Schema
NameRequiredDescription
tierNothe qualitative tier
overallNothe overall score out of 100
top_fixNothe single biggest improvement lever
strengthsNowhat the ad already does well
dimensionsNoper-dimension breakdown ({name, score})
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, establishing safety. The description adds valuable behavioral context: it operates on a 'finished ad', returns a structured breakdown, and identifies the 'single biggest fix'. This goes beyond the annotations by describing the tool's output behavior and pre-launch use case.

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 sentences, front-loaded with the core purpose and output details. Each sentence earns its place: the first explains what and what output, the second explains when to use. No filler or redundancy.

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 read-only tool with a small parameter set and an output schema (per context signals), the description covers purpose, usage timing, input format, and output components. It is sufficiently complete for an agent to select and invoke the tool without ambiguity.

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 the baseline is 3. The description reinforces that input is an image/video URL and ties 'intent' to 'goal-fit scoring', but it does not significantly elaborate on parameters beyond the schema definitions.

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: 'Virality/performance prediction for a finished ad (image or video URL)'. It enumerates concrete outputs (overall score, per-dimension breakdown, strengths, biggest fix), making it unmistakable what the tool does and clearly distinguishing it from ad creation, planning, or general video analysis siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: 'Use BEFORE spending on distribution, or to rank variants.' This clearly tells the agent when to invoke the tool. It does not name alternative tools or explicitly state when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scrapecreators_fetchFetch ScrapeCreators endpointA
Read-only
Inspect

Generic ScrapeCreators escape hatch for any ALLOWLISTED long-tail endpoint the dedicated search_* tools don't cover — e.g. {path:'/v1/instagram/profile', params:{handle:'nike'}}. Allowlisted platform families: TikTok (+ TikTok Shop), Instagram, YouTube, Facebook (organic profiles/posts/events/marketplace), LinkedIn (organic posts/companies), Twitter/X, Reddit, Threads, Snapchat, Pinterest, Twitch, Bluesky, Truth Social, Rumble, Spotify, SoundCloud, GitHub, Google search, link-in-bio pages (Linktree etc.). Param names vary per endpoint (profiles use handle, keyword searches use query, Reddit uses subreddit). WARNING: returns RAW provider JSON — large and messy; prefer the dedicated search_* tools. Spends ScrapeCreators credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesexact SC endpoint path, e.g. '/v1/tiktok/profile' — non-allowlisted paths are rejected
paramsNoendpoint query params, e.g. {handle:'nike'}

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, but the description adds valuable context: returns raw provider JSON that is large and messy, spends ScrapeCreators credits, and non-allowlisted paths are rejected. It does not cover rate limits or pagination, but the added details are significant.

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 dense; every sentence provides useful information. It is front-loaded with purpose and alternatives, followed by platform list, param naming, warning, and cost. Slightly verbose but justified for a generic endpoint tool.

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 is generic with an output schema and readOnly/openWorld annotations, the description covers purpose, alternatives, platform allowlist, param naming, return format, cost, and restrictions. It is sufficiently complete for an agent to select and invoke it correctly.

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% with descriptions for path and params, but the description enriches this by explaining that param names vary per endpoint (handle, query, subreddit) and gives examples. This is critical for a generic tool with dynamic params.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool is a generic escape hatch for any ALLOWLISTED long-tail endpoint not covered by dedicated search_* tools, with a concrete example. This distinguishes it from the many search_* siblings and defines its exact role.

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 when to use (for endpoints not covered by search_* tools) and when not to (prefer dedicated search_* tools), and provides a platform allowlist. This gives the agent clear decision criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_google_adsSearch Google adsA
Read-only
Inspect

Structured Google Ads Transparency pull for ONE advertiser (by domain or advertiserId) — use when you know the brand; use research_ads for open-ended research. Deliberately fetches the cheap BASIC listing (get_ad_details=false, ~1 credit — the detailed variant with per-ad headlines costs 25 credits/call and is not exposed here). Returns compact JSON {advertiser, format, adUrl, image, firstShown, lastShown} per ad.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax ads returned (1–25, default 8)
domainNothe advertiser's domain, e.g. nike.com
regionNo2-letter region, default US
advertiserIdNoGoogle advertiser id (AR…) when the domain is ambiguous

Output Schema

ParametersJSON Schema
NameRequiredDescription
adsNothe compact ad objects ({advertiser, format, adUrl, image, firstShown, lastShown})
foundNototal ads found upstream
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, but the description adds valuable behavioral context: it fetches the cheap BASIC listing (get_ad_details=false, ~1 credit), mentions the 25-credit detailed variant is not exposed, and outlines the compact return shape. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences deliver purpose, usage guidance, cost behavior, and return format without waste. The most important information is front-loaded, making it easy for an agent to quickly determine suitability.

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?

The description covers purpose, usage alternatives, cost, return shape, and parameter selection. With an output schema present and read-only annotations, the description is sufficiently complete for an agent to select and 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 description coverage is 100%, with each parameter (limit, domain, region, advertiserId) having its own description. The description reinforces that the tool works by domain or advertiserId but adds no new syntax or format details beyond the schema, meeting the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a structured Google Ads Transparency pull for one advertiser, with a specific verb ('pull') and resource ('Google Ads Transparency'). It also distinguishes itself from research_ads by scope ('ONE advertiser') and usage context ('when you know the brand').

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 provides when-to-use guidance: 'use when you know the brand; use research_ads for open-ended research.' Additionally notes the detailed variant is not exposed, setting expectations and preventing misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_instagramSearch InstagramA
Read-only
Inspect

Organic Instagram REELS keyword search (/v2/instagram/reels/search — ScrapeCreators' only IG keyword surface; profile/hashtag pulls go through scrapecreators_fetch with a handle). Returns compact JSON {desc, author, handle, plays, likes, link, cover} per reel, ranked by plays. Spends ScrapeCreators credits (~1).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax reels returned (1–25, default 8)
queryYeskeyword to search reels for

Output Schema

ParametersJSON Schema
NameRequiredDescription
foundNototal reels found
reelsNothe compact reel objects ({desc, author, handle, plays, likes, link, cover}), ranked by plays
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is known. The description adds useful context: it spends ScrapeCreators credits, returns a compact JSON with specific fields, and ranks results by plays. This goes beyond annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and information-dense, front-loaded with the core purpose, followed by alternates, return shape, and cost. Every sentence earns its place with zero fluff.

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 only 2 well-documented params and an output schema, the description still covers return format, ranking, cost, and sibling differentiation. For a search tool with credit implications and a clear alternative for other IG pulls, this is fully 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%—both query and limit have clear descriptions. The tool description adds context about the search being keyword-based and ranking by plays, but does not add new parameter-specific syntax or format details 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it performs organic Instagram REELS keyword search, with a specific endpoint. It distinguishes itself from sibling tools by explicitly naming itself as ScrapeCreators' only IG keyword surface and directing profile/hashtag pulls to scrapecreators_fetch.

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?

The description provides explicit usage guidance: use this for reel keyword searches, but for profile/hashtag pulls, use scrapecreators_fetch with a handle. This directly addresses when to use the tool vs an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_linkedin_adsSearch LinkedIn adsA
Read-only
Inspect

Structured LinkedIn Ad Library search by company name, keyword, or companyId — use for a targeted B2B pull; use research_ads for open-ended research. Returns compact JSON {advertiser, headline, description, cta, link, media, dates, impressions} per ad — LinkedIn is the one library exposing real impression counts. Spends ScrapeCreators credits (~1).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax ads returned (1–25, default 8)
companyNoadvertiser company name
keywordNokeyword across all advertisers
companyIdNoLinkedIn company id (numeric) when the name is ambiguous
countriesNoCSV of 2-letter codes like 'US,CA'; omit or 'ALL' = worldwide

Output Schema

ParametersJSON Schema
NameRequiredDescription
adsNothe compact ad objects ({advertiser, headline, description, cta, link, media, dates, impressions})
foundNototal ads found upstream
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it spends ScrapeCreators credits (~1), a behavioral cost not covered by annotations, and includes a unique data-quality note ('LinkedIn is the one library exposing real impression counts'). Moreover, it outlines the return format (compact JSON with fields), adding context beyond the readOnly/openWorld hints. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences each serve a distinct purpose: purpose/scope, comparison with alternative, and return format/cost. Information is front-loaded with the primary action verb, and all statements add value with no redundancy.

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 100% schema parameter coverage, presence of an output schema, and readOnly/openWorld annotations, the description adds essential extras: credit cost, usage context, and unique platform differentiator. It is sufficiently complete for an agent to decide correctly and understand trade-offs without any critical gaps.

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 descriptive parameter entries (e.g., limit range, countries CSV format). The description renames the primary search keys (company, keyword, companyId) but adds no additional syntax or format details beyond the schema, so the baseline score of 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?

Description clearly specifies a structured search of the LinkedIn Ad Library by company name, keyword, or companyId, with a concrete resource and action. It also distinguishes from sibling 'research_ads' by contrasting targeted vs. open-ended, and from other platform searches by naming LinkedIn.

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 states when to use: 'for a targeted B2B pull' and when to use an alternative: 'use research_ads for open-ended research'. This names a sibling tool and gives clear decision guidance, exceeding basic context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_linkedin_ads_targetingFind LinkedIn targeting URNsA
Read-only
Inspect

Look up LinkedIn TARGETING entities by name and get their URNs — locations, job titles, industries, seniorities, company sizes, skills, job functions, interests, employers, degrees, fields of study, member behaviours. LinkedIn’s targeting values are opaque URNs (urn:li:geo:103644278 is the United States) with no guessable form, so ALWAYS resolve an audience here before passing it to create_linkedin_ads_campaign, and NEVER invent a URN — a made-up one either 400s or, worse, targets somebody else. If nothing matches, say so plainly. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
facetNofacet name, default "locations" — e.g. locations, titles, industries, seniorities, staffCountRanges, skills, jobFunctions, interests, employers, degrees, fieldsOfStudy, memberBehaviors
queryYesthe name to search for, e.g. "United States", "Software Engineer", "Marketing"
countryNodefault US
languageNodefault en
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
countNo
facetNo
entitiesNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, but the description adds critical domain behavior: LinkedIn targeting URNs are opaque, and a made-up URN either 400s or targets somebody else. It also directs the agent to state plainly when nothing matches, going beyond annotations to set expectations for failure handling.

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 cover purpose, usage, and critical warnings without redundancy. The core action is front-loaded, and the warnings about URN safety are concise but impactful.

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 domain with opaque URNs, the description covers the workflow, entity categories, and failure handling. Since the output schema exists, return format is unnecessary; the description adequately contextualizes the tool for LinkedIn ad targeting.

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 80%, so the schema already documents query and facet. The description adds meaning by listing facet values in human-readable form (e.g., 'company sizes' for staffCountRanges, 'member behaviours' for memberBehaviors) and by providing an example query ('United States'). However, it does not explain adAccountId, country, or language beyond schema defaults, so the addition is modest.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Look up LinkedIn TARGETING entities by name and get their URNs' and enumerates specific entity types (locations, job titles, industries, etc.). It distinguishes from siblings by framing this as the pre-step to create_linkedin_ads_campaign and by focusing on targeting URN resolution, which no sibling tool name covers.

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?

The description gives explicit when-to-use guidance: 'ALWAYS resolve an audience here before passing it to create_linkedin_ads_campaign' and warns against inventing URNs. It also instructs the agent to report no matches plainly ('If nothing matches, say so plainly'), clearly positioning the tool's role among the sibling ads tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_meta_adsSearch Meta adsA
Read-only
Inspect

Structured Meta (Facebook/Instagram) Ad Library pull — use when you know exactly WHAT to fetch: a keyword (query) OR one advertiser (companyName / pageId). Returns compact JSON {page_name, body, cta, link, dates, media} per ad. For open-ended research that needs judgment across platforms, use research_ads instead. Spends ScrapeCreators credits (~1–2).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax ads returned (1–25, default 8)
queryNokeyword search across ALL advertisers (use INSTEAD of companyName/pageId)
pageIdNoone advertiser’s ads by Facebook page id (most precise)
statusNoACTIVE = currently running; default ALL (includes proven past winners)
countryNo2-letter code or 'ALL' (default ALL)
mediaTypeNofilter by creative type (default ALL)
companyNameNoone advertiser’s ads by brand name

Output Schema

ParametersJSON Schema
NameRequiredDescription
adsNothe compact ad objects ({page_name, body, cta, link, dates, media})
foundNototal ads found upstream
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe/read-only nature is covered. The description adds behavioral value by disclosing the return payload shape ('compact JSON {page_name, body, cta, link, dates, media} per ad'), the mutual exclusivity of query vs. advertiser parameters, and the credit cost. These details go beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences. The first sentence states the purpose and core usage; the second explains the return format; the third gives an explicit alternative and cost. Every sentence earns its place with no fluff or repetition of schema/annotations. The structure is front-loaded and scannable.

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 tool with 7 parameters, 2 enums, full schema coverage, and an output schema, the description provides the missing context: the exact use cases, the return shape, cost implications, and an alternative for open-ended research. It covers the key behavioral and decision-making aspects an agent needs, making it effectively complete for this complexity level.

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 description coverage is 100%, so the baseline is 3. The description adds meaningful extra semantics by explicitly framing the parameter relationship: 'a keyword (query) OR one advertiser (companyName / pageId).' This clarifies that these params are alternatives, which is not enforced in the schema itself. The description also implies that 'limit', 'status', 'country', 'mediaType' serve as filters, complementing the schema's per-field descriptions.

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 specific verb+resource: 'Structured Meta (Facebook/Instagram) Ad Library pull'. It clearly defines the tool's scope (keyword or advertiser search) and explicitly differentiates it from research_ads, which is for open-ended cross-platform research. The title 'Search Meta ads' is reinforced, but the description adds essential precision about what exactly is fetched.

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?

The description explicitly states when to use: 'use when you know exactly WHAT to fetch' with a keyword or a specific advertiser. It also names the alternative (research_ads) and clarifies when that alternative is more appropriate. It further gives a cost hint ('Spends ScrapeCreators credits (~1–2)') to guide decision-making, which is useful contextual guidance beyond annotations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_redditSearch RedditA
Read-only
Inspect

Reddit keyword search (/v1/reddit/search, top-ranked) — a goldmine for the customer's OWN words (pain points, objections, language) to mine into ad hooks and copy. Returns compact JSON {desc (title+selftext), subreddit, upvotes, comments, link} per post. Spends ScrapeCreators credits (~1).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax posts returned (1–25, default 8)
queryYeswhat to search Reddit for

Output Schema

ParametersJSON Schema
NameRequiredDescription
foundNototal posts found
postsNothe compact post objects ({desc, subreddit, upvotes, comments, link})
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, and the description adds valuable behavioral context: it spends ScrapeCreators credits (~1) and returns a specific JSON structure with fields like desc, subreddit, upvotes, comments, and link. This goes beyond what annotations provide.

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 three sentences, each earning its place: it front-loads the core function, then details the return format and cost. No fluff, highly informative for its length.

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 well-described schema, annotations, and an output schema present, the description covers the use case, return format, and cost. It doesn't discuss rate limits or error handling, but for a straightforward search tool, this is adequately 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% for both parameters (query and limit), with clear descriptions in the schema. The tool description adds minimal extra parameter detail beyond noting it's a 'keyword search,' so the schema carries the semantic load, warranting the baseline score of 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?

The description clearly states 'Reddit keyword search' with the specific endpoint, identifying the platform and action. It distinguishes itself from sibling search tools by naming Reddit and emphasizing the use case (mining customer language for ad copy).

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 a clear use case: 'goldmine for the customer's OWN words... to mine into ad hooks and copy.' It implies when to use this tool (for organic Reddit research) though it doesn't explicitly exclude alternatives or name them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_reddit_ads_targetingResolve Reddit communities / geolocations / interests for targetingA
Read-only
Inspect

Look up the exact values Reddit ad-group targeting expects, so none of them has to be guessed. kind:"communities" searches subreddits by keyword and returns each one’s NAME plus its subscriber count — targeting wants the bare name ("running"), NOT the t5_ id and NOT "r/running". kind:"geolocations" lists targetable places (pass country like US, or a city search) — targeting accepts a country code or one of the returned ids. kind:"interests" lists Reddit’s interest taxonomy — targeting wants the id ("pets_v3"). Read-only, free. Use this before create_reddit_ads_ad_group rather than inventing a community name.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNodefault communities
limitNomax results, default 15
queryNokeyword — required for communities, filters interests, searches cities for geolocations
countryNo2-letter country code, geolocations only
postalCodeNo
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindNo
noteNo
countNo
resultsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, and the description adds substantial behavioral context beyond annotations. It explains key output distinctions (bare name vs. ID, country code vs. returned IDs, interest taxonomy IDs) and mentions 'Read-only, free', reinforcing the annotation without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and well-structured, with every sentence adding value. It opens with purpose, then systematically covers each kind with examples and formatting guidance, closing with a usage recommendation. No unnecessary words or repetition.

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 moderate complexity and the presence of an output schema, the description is remarkably complete. It covers all three types of lookups, expected input formats, output semantics, and when to use the tool. Even without describing postalCode/adAccountId, the description provides sufficient context for correct usage in the primary workflows.

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 input schema covers 67% of parameters, so the baseline is 3. The description significantly enhances this by explaining the semantics of 'kind' with examples and clarifying 'query' requirements for each kind. However, it does not discuss 'postalCode' or 'adAccountId', so it doesn't fully compensate for all 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 clearly states the tool's function with a specific verb ('Look up') and resource ('Reddit ad-group targeting values'). It distinguishes itself from sibling tools by focusing on Reddit and enumerating three distinct kinds of lookups (communities, geolocations, interests), making its purpose 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 usage guidance is provided: 'Use this before create_reddit_ads_ad_group rather than inventing a community name.' It also states what to pass for each kind and what targeting expects, including exclusions like 'NOT the t5_ id' and 'NOT r/running', which clarifies when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_threadsSearch ThreadsA
Read-only
Inspect

Organic Threads keyword search (/v1/threads/search) — short-form text/social posts for trend + voice research. Returns compact JSON {desc, author, handle, likes, link, cover} per post. Spends ScrapeCreators credits (~1).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax posts returned (1–25, default 8)
queryYeskeyword to search Threads for

Output Schema

ParametersJSON Schema
NameRequiredDescription
foundNototal posts found
postsNothe compact post objects ({desc, author, handle, likes, link, cover})
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a read-only, open-world operation. The description adds value by disclosing the credit cost (~1 credit) and the endpoint path, which are not derivable from annotations. It also specifies the output format as compact JSON with particular fields, giving the agent a clearer expectation of the result.

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 sentences, front-loaded with the core action and endpoint, followed by the return format and cost. Every word contributes useful information with no redundancy or fluff.

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 simple two-parameter tool with a full output schema and clear annotations, the description is complete. It covers the endpoint, use case, return structure, and credit cost. No additional context is necessary for an agent to select and 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?

The input schema descriptions cover 100% of parameters ('keyword to search Threads for' and 'max posts returned (1–25, default 8)'). The description does not add additional parameter-level meaning beyond what the schema already provides, so the baseline score of 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 clearly states it performs a keyword search of Threads posts, identifies the endpoint, and specifies the purpose (trend and voice research). It also lists the return fields, making the tool's function unambiguous. However, it does not differentiate itself from the sibling tool 'search_threads_keyword', which appears to have an identical purpose.

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 provides clear context by stating the tool is for 'trend + voice research' and operates on short-form social posts. It does not explicitly state when not to use it or mention alternative sibling tools like list_threads_posts or search_threads_keyword, so it stops short of full exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_threads_keywordSearch Threads by keywordA
Read-only
Inspect

Search PUBLIC Threads posts for a keyword or topic — competitor listening, finding what people say about a product, or sourcing real customer language for ad copy. Distinct from search_threads, which reads a specific profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYeskeyword or phrase
searchTypeNoTOP (default) or RECENT

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
postsNo
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is known. The description adds the constraint that only PUBLIC posts are searched and that search_threads handles specific profiles, which is useful but does not disclose details like rate limits, pagination, or result ordering. This is comparable to the get_calls example where annotations cover the baseline safety context.

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 focused sentences front-load the action and scope, list concrete use cases, and name the sibling tool for disambiguation. Every word contributes value with no redundancy.

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?

The tool is simple (2 parameters, 1 required), has full schema coverage, annotations, and an output schema. The description covers purpose, scope, use cases, and sibling distinction, making it complete for an agent to select and invoke 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?

The input schema fully documents both parameters: q ('keyword or phrase') and searchType (TOP/RECENT), so the schema carries the semantic load. The description adds no parameter-specific detail beyond reiterating 'keyword or topic', so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches public Threads posts by keyword or topic, with concrete use cases. It explicitly distinguishes itself from search_threads, which reads a specific profile, making its unique purpose unambiguous.

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?

The description provides explicit use cases (competitor listening, product sentiment, ad copy sourcing) and names the alternative tool search_threads for profile-specific reads. This gives the agent clear guidance on when to choose this tool over its sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_threads_locationsFind a place to tag on ThreadsA
Read-only
Inspect

Search Threads’ public place index by name (or by latitude+longitude) and get location ids. Use this when the brand has a PHYSICAL location — a restaurant, salon, gym, store — so the post can be geotagged to it. Pass the chosen id as post_to_meta(locationId) with target:"threads".

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoplace name to search, e.g. "Osteria Francescana"
latitudeNolatitude (use with longitude to search near a point)
longitudeNolongitude

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
locationsNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=true, and the description adds context by clarifying that it only searches the public place index and returns ids for geotagging. It also notes the search can be by name or by latitude/longitude, which is behavior not fully implied by annotations. However, it doesn't disclose details about result ordering, pagination, or what happens if no match is found, leaving a small gap.

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 sentences, front-loaded with the core function and then a concise usage guideline. Every word earns its place, with no fluff or redundancy. It efficiently packs purpose, when-to-use, and downstream integration into a compact format.

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 has an output schema, the description needn't enumerate return values. It provides the essential context: what the tool searches, how to search (by name or coordinates), when to use it, and how to use the result. The tool is simple and the description covers all necessary aspects without over-specifying.

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 description coverage is 100%, so parameters are fully documented ('place name to search', 'latitude', 'longitude'). The description adds the key clarification that latitude/longitude are used together to search near a point, and that the 'q' parameter is optional in that case. This enriches the schema semantics meaningfully.

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 the tool searches Threads' public place index by name or coordinates to get location ids, clearly distinguishing it from sibling search tools like search_threads and search_threads_keyword. It names the specific resource (Threads' place index) and the output (location ids), making its purpose unambiguous.

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?

The description explicitly states when to use this tool: 'when the brand has a PHYSICAL location — a restaurant, salon, gym, store — so the post can be geotagged to it.' It also describes how to integrate with another tool: 'Pass the chosen id as post_to_meta(locationId) with target:"threads".' This gives clear usage context and direction for alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_tiktokSearch TikTokA
Read-only
Inspect

Organic TikTok keyword search (there is NO TikTok ad library) — top-performing videos to mine for hooks/trends/remixable creative. Returns compact JSON {desc, author, handle, plays, likes, link, cover} per video, ranked by plays. Use research_ads for open-ended research. Spends ScrapeCreators credits (~1).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax videos returned (1–25, default 8)
queryYeskeyword or hashtag (no # needed)

Output Schema

ParametersJSON Schema
NameRequiredDescription
foundNototal videos found
videosNothe compact video objects ({desc, author, handle, plays, likes, link, cover}), ranked by plays
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true and openWorldHint=true, indicating a safe read operation. The description adds important behavioral context beyond these: it discloses the credit cost ('Spends ScrapeCreators credits (~1)') and the ranking behavior ('ranked by plays'), as well as the explicit absence of a TikTok ad library. This provides operational transparency not present in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: it front-loads the core purpose, then adds the critical caveat about no ad library, followed by output format and sorting, an alternative tool reference, and cost. Each clause earns its place with no redundant 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 presence of a comprehensive output schema, the description still provides necessary context: return format (compact JSON fields), ranking by plays, credit cost, and the alternative research_ads tool. This is more than sufficient for a straightforward search tool, making it complete without over-explaining.

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 query and limit with adequate descriptions (e.g., 'keyword or hashtag (no # needed)' and 'max videos returned (1–25, default 8)'). The tool description adds context about output ranking and cost but does not significantly enhance the meaning of the parameters 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies 'Organic TikTok keyword search' with a clear verb and resource, and distinguishes itself from ad library searches by stating 'there is NO TikTok ad library.' It also describes the output ('top-performing videos to mine for hooks/trends/remixable creative') and contrasts with research_ads, making it distinct from sibling tools.

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 states when to use this tool vs an alternative: 'Use research_ads for open-ended research.' This directly clarifies the primary use case (organic TikTok keyword search) and distinguishes it from the ad research tool, providing clear selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_youtubeSearch YouTubeA
Read-only
Inspect

Organic YouTube keyword search (/v1/youtube/search) — videos to mine for hooks/angles/long-form structure. Returns compact JSON {desc (title), author, handle, plays, link, cover} per video, ranked by views. Spends ScrapeCreators credits (~1).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax videos returned (1–25, default 8)
queryYeskeyword to search videos for

Output Schema

ParametersJSON Schema
NameRequiredDescription
foundNototal videos found
videosNothe compact video objects ({desc, author, handle, plays, link, cover}), ranked by views
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses several behavioral traits beyond the annotations: it costs 'ScrapeCreators credits (~1)', returns 'compact JSON' with specific fields, and results are 'ranked by views'. It also notes it is an 'organic' search, which clarifies the nature of results. These details add value beyond the readOnly/openWorld hints.

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 sentences, with the first stating the endpoint and purpose and the second covering return format and cost. Every sentence provides essential information without waste.

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?

Given the tool's simplicity (2 params, output schema, read-only annotations), the description covers purpose, cost, return structure, and ranking. It lacks explicit alternative guidance or edge-case warnings, but the core information for selection and invocation is present.

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?

Both query and limit are already well-documented in the schema with descriptions including default and range. The description adds no additional parameter-level information, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it performs an 'Organic YouTube keyword search' for videos to mine for hooks/angles/long-form structure, distinguishing it from sibling search tools for other platforms. The specific verb 'search' and resource 'YouTube' make the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies the intended use case ('videos to mine for hooks/angles/long-form structure') and identifies it as a keyword search, providing clear context for when to invoke it. However, it does not explicitly mention alternatives or exclusions, such as when to use list_youtube_videos instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_reddit_ads_conversionsSend conversions to Reddit (Conversions API)AInspect

Report conversions to Reddit server-side — purchases, leads, sign-ups, or your own custom events — so Reddit can attribute them to the ads that caused them and optimise delivery toward them. This is what makes a CONVERSIONS campaign work; without it Reddit optimises blind. Send events as close to real time as you can: Reddit REFUSES anything older than seven days, and deduplication against the browser pixel only works inside two days. Pass ordinary email addresses and phone numbers — they are canonicalised and SHA-256 hashed on our server before they reach Reddit, and a value you already hashed is passed through untouched. The more match keys per event (email, phone, clickId, uuid, externalId, IP + user agent) the better the attribution. Set conversionId on every event if you ALSO run the browser pixel, or the same purchase is counted twice. Costs no credits and spends no ad money — this is measurement. Needs the "adsconversions" permission: if Reddit answers 403, the connection predates it and the user must reconnect Reddit Ads.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventsYesup to 1,000 events per call
testIdNoa test id from Events Manager ▸ Testing — events sent with it are visible there and NEVER counted in reporting
pixelIdNofrom list_reddit_ads_pixels — only needed when the account has more than one
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
sentNo
pixelIdNo
withMatchKeysNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the sparse annotations (readOnlyHint=false, openWorldHint=true). It discloses critical behavioral traits: 7-day hard rejection, 2-day dedup window, server-side hashing, handling of pre-hashed values, the need for the 'adsconversions' permission, and the 403 failure mode requiring reconnection. This is exactly the kind of context an agent needs to anticipate edge cases and avoid misusing the tool.

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?

Although the description is long, every sentence carries essential information. It is front-loaded with the core purpose and then systematically covers freshness, hashing, deduplication, permission, and costs. No filler or redundancy exists; the density is justified by the complexity of the API.

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?

The description is remarkably complete for a tool of this complexity. It covers when to use it, operational limits (1,000 events per call in schema), permission requirements, deduplication strategy, real-time guidance, and consequences of incorrect usage (double counting, 7-day refusal). It even explains the 403 error scenario. Given the output schema exists, the description doesn't need to detail return values; it provides all necessary context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema coverage at 75%, the description compensates with rich parameter-level details. It explains how email/phone are canonicalized and hashed, distinguishes pre-hashed values, emphasizes conversionId as the deduplication key, notes that customEventName is case-sensitive with a 20-event dashboard cap, and explains testId semantics (visible in testing, never counted). This adds significant meaning beyond the raw 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?

The description clearly states the tool's function: 'Report conversions to Reddit server-side — purchases, leads, sign-ups, or your own custom events.' It uses a specific verb ('report/send') with a distinct resource (Reddit Ads Conversions API) and distinguishes itself from sibling tools like create_reddit_ads_campaign or reddit_ads_report by focusing on the conversion event reporting pipeline.

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?

The description explicitly explains when this tool is necessary: 'This is what makes a CONVERSIONS campaign work; without it Reddit optimises blind.' It also provides contextual guidance on event freshness ('send as close to real time as you can'), deduplication with the browser pixel, and when to set conversionId. It clarifies that the tool is for measurement ('Costs no credits and spends no ad money'), helping the agent understand its operational role.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_active_employeeHire (activate) an AI employeeA
Idempotent
Inspect

Set which AI Employee persona is HIRED for this workspace (by id, from list_employees) — or pass none/empty to unhire. Records the selection for the workspace so list_employees reflects it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNothe employee id to hire (from list_employees) — omit or "" to unhire

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
activeIdNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that calling this tool records the selection for the workspace so list_employees reflects the change, and that an empty value un-hires. This adds meaningful behavioral context beyond the annotations, which already note idempotence and non-destructiveness, without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys the core action, the source for the id, and the unhire behavior. Every clause earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with a full input schema, annotations, and an output schema, the description fully covers purpose, parameter source, unhire semantics, and side effects. No critical information 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?

The schema already documents the id parameter and its omit/empty behavior with 100% coverage. The description reinforces the parameter semantics by referencing list_employees and 'none/empty to unhire,' but does not add new detail beyond what the schema provides, 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?

The description clearly identifies the action as setting which AI Employee persona is hired for the workspace, with a specific verb ('Set') and resource ('AI Employee persona'). It also distinguishes itself from other tools by referencing list_employees and explicitly covering the unhired state with 'pass none/empty to unhire.'

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 provides clear usage context: hire by id from list_employees, and unhire by omitting/empty. It implies the appropriate workflow (list employees first) and covers the two main usage modes, but does not explicitly mention when not to use this tool or compare it to sibling alternatives like save_employee.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_auto_reloadSet auto-reloadA
Idempotent
Inspect

Turn automatic credit reloads on or off (admin only): when the balance drops below a threshold, the card on file is charged for a top-up pack — SERVER-SIDE, even with no app open. Requires a saved card, added once in the app at first checkout/top-up; if there's none the tool tells you exactly where to add it. After that one-time card setup, agents can manage auto-reload, top-ups and plan links fully. Members (read-only billing) get an 'ask an admin' message.

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledYestrue to turn auto-reload on, false to turn it off
reloadCreditsNohow many credits to add each reload — must match a credit pack size (see buy_credits)
thresholdCreditsNoreload when the balance drops below this many credits

Output Schema

ParametersJSON Schema
NameRequiredDescription
capUsdNomonthly auto-reload spend cap in USD, if set
statusNoauto-reload status detail
appliedNowhether the auto-reload config was applied
enabledNothe resulting auto-reload state
guidanceNoinstructions when the change must be made in the app
needsCardNotrue when there is no saved card yet (add one in the app first)
reloadPackNothe pack charged on each reload
reloadCreditsNocredits added per reload
thresholdCreditsNoreload triggers below this balance
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: admin-only, server-side execution even without app open, saved-card prerequisite, guidance if no card exists, and role-specific behavior for members. Annotations only indicate non-read, idempotent, and non-destructive; the description reveals permission and execution details that annotations do not cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences packed with relevant information: the core action, underlying behavior, and role-based permissions. No filler, though slightly longer than strictly necessary; every sentence 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 description covers purpose, prerequisites, permissions, and error handling for members. With an output schema present and 100% schema param coverage, the description is sufficiently complete for an agent to select and invoke the tool correctly. Could be improved by explicitly contrasting with manual credit purchase tools.

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 descriptions already explain all three parameters (enabled, reloadCredits, thresholdCredits) with specifics like credit pack size matching. The description adds narrative context but does not introduce new parameter-level details beyond what the schema already 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 clearly states the tool's function: turning automatic credit reloads on or off, with admin-only scope. It explains the reload mechanism (threshold drop, card charge) and distinguishes it from siblings like buy_credits by focusing on auto-reload settings rather than manual top-ups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit context: admin-only, requires a saved card, and describes the prerequisite setup. It doesn't directly name alternative tools (e.g., buy_credits) but implies this is for managing auto-reload while manual top-ups are handled elsewhere. The member 'ask an admin' message clarifies who should use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_connector_accountsChoose which accounts a brand may useA
Idempotent
Inspect

Set WHICH of a connector's accounts this brand is allowed to post to and spend from — Facebook Pages / Instagram / Meta ad accounts, Google Ads customers, LinkedIn company Pages (and the personal profile), Pinterest or Microsoft Advertising ad accounts. Pass ids from list_connector_accounts. This REPLACES the current selection: anything you leave out is un-shared, and an EMPTY list shares nothing (publishing then refuses — it fails closed by design, and the server re-verifies every id against the live connection, so an id the account cannot actually reach is rejected rather than saved). Ask the user which accounts they mean; posting as the wrong Page is a public mistake. Providers: meta, google_ads, linkedin, pinterest, linkedin_ads, reddit_ads, microsoft_ads, google_business. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYeswhich connector to scope
accountIdsYesthe ids (from list_connector_accounts) this brand may use — an empty array shares nothing

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
providerNo
selectedIdsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description reveals critical behavioral traits: it REPLACES the current selection, an empty list shares nothing (fails closed), the server re-verifies each id against the live connection, and unreachable ids are rejected. This is far more than annotations provide and accurately prepares the agent for the tool's side effects.

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 each sentence adds value, but it is somewhat long and includes minor noise like "Free" at the end (which seems irrelevant). The provider list duplicates the schema enum but is useful for quick scanning. Overall, well-structured with the core purpose front-loaded, but slightly over-length.

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 mutating tool with output schema present, the description covers purpose, usage, parameter provenance, behavioral side effects, validation, and user interaction. It adequately addresses the complexity of multi-provider account sharing and leaves no critical gaps.

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% with adequate parameter descriptions. The textual description enriches this by explaining the account types, the source of ids (list_connector_accounts), and the significance of an empty array. It doesn't fully restate the provider enum (already in schema), but adds practical meaning 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?

The description opens with a specific verb+resource+scope: "Set WHICH of a connector's accounts this brand is allowed to post to and spend from." It clearly distinguishes from sibling set_* tools (which handle budgets/statuses) by focusing on account access authorization, and enumerates the account types for all supported providers.

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?

The description explicitly instructs to "Pass ids from list_connector_accounts," which is the exact prerequisite and source. It also advises "Ask the user which accounts they mean; posting as the wrong Page is a public mistake," adding real-world guidance. The replacement semantics and empty-list behavior further clarify when and how this tool should be invoked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_google_ads_biddingSet a Google Ads bidding strategyAInspect

Change how an existing Google Ads campaign bids: MANUAL_CPC (optionally enhanced), MAXIMIZE_CLICKS (needs maxCpcUsd on an existing campaign — Google requires the CPC ceiling on that change), MAXIMIZE_CONVERSIONS, MAXIMIZE_CONVERSION_VALUE, TARGET_CPA (needs targetCpaUsd) or TARGET_ROAS (needs targetRoas, e.g. 4 = $4 revenue per $1 spent). TARGET_CPA and TARGET_ROAS are applied as Google's own v25 equivalents — maximize-conversions with a target CPA, and maximize-conversion-value with a target ROAS — so the read-back reports them as MAXIMIZE_CONVERSIONS / MAXIMIZE_CONVERSION_VALUE; report what the read-back says. The conversion-based strategies only deliver once conversion tracking is configured on the account. Changing a LIVE campaign's bidding changes what it pays immediately, so that needs confirm:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNo
confirmNoREQUIRED true to change a LIVE (ENABLED) campaign
strategyYesthe bidding strategy
maxCpcUsdNoMAXIMIZE_CLICKS — the max CPC ceiling; REQUIRED when switching an existing campaign to it
campaignIdYesthe campaign to change
customerIdNoomit to use the brand’s selected default account
targetRoasNoREQUIRED for TARGET_ROAS — e.g. 4 = $4 revenue per $1 spent
enhancedCpcNoDO NOT SET true — Google retired Enhanced CPC for new campaigns and answers OPERATION_NOT_PERMITTED_FOR_CONTEXT (measured live 2026-08-05); Hermoso refuses it up front with the reason. Use MAXIMIZE_CONVERSIONS / TARGET_CPA instead.
targetCpaUsdNoREQUIRED for TARGET_CPA
loginCustomerIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
campaignIdNo
biddingStrategyTypeNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, etc.), the description discloses critical behavioral traits: Google's requirement for a CPC ceiling when switching to MAXIMIZE_CLICKS, the fact that TARGET_CPA/TARGET_ROAS are mapped to Google's v25 equivalents and will read back as MAXIMIZE_CONVERSIONS/MAXIMIZE_CONVERSION_VALUE, the dependency on conversion tracking, and the immediate financial impact on live campaigns. It also warns that enhancedCpc is retired and will be refused, adding significant transparency.

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 but every sentence carries essential operational detail—strategy-specific requirements, read-back behavior, conversion tracking prerequisite, and the confirm flag necessity. It is front-loaded with the core purpose and avoids filler. It could be slightly streamlined, but the length is justified by the tool's complexity.

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 (10 parameters, 6 strategies with interlocking dependencies), the description covers all essential operational contexts: strategy-specific parameter requirements, edge cases like enhancedCpc refusal, the v25 mapping behavior, and the live-campaign financial impact. An output schema exists, so return-value details are not needed. The description is complete enough to guide correct usage.

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?

With 80% schema coverage, the baseline is 3. The description adds value by explaining the strategy-dependent semantics of maxCpcUsd, targetCpaUsd, and targetRoas (e.g., '4 = $4 revenue per $1 spent') and explicitly warns against setting enhancedCpc=true. These richer explanations complement the schema's field descriptions rather than just repeating them.

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 specific verb+resource: 'Change how an existing Google Ads campaign bids' and enumerates the six supported strategies. This clearly distinguishes it from sibling tools like set_google_ads_budget, set_google_ads_status, and set_google_ads_targeting, which address other campaign settings.

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 provides clear contextual guidance: it states which parameters are required for each strategy, notes that conversion-based strategies only work with conversion tracking configured, and warns that changing a live campaign affects payments immediately and requires confirm:true. While it doesn't explicitly contrast with alternatives like set_google_ads_budget, the strategy-specific requirements and the mention of the live-change caveat give practical when-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_google_ads_budgetSet a Google Ads campaign budgetAInspect

Create a new daily budget, or change an existing budget’s daily amount (pass budgetResourceName). Raising the budget on a LIVE (ENABLED) campaign increases real spend immediately — you MUST show the user the new daily amount, get an explicit yes, then call with confirm:true. Creating a budget or lowering one on a paused campaign is safe.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoname for a newly created budget
confirmNoREQUIRED true to raise the budget of a LIVE campaign
customerIdNo10-digit account id (dashes ok) — omit to use the brand’s selected default account
dailyBudgetUsdYesdaily budget in USD (1–100000)
loginCustomerIdNomanager id if operating through an MCC
budgetResourceNameNoexisting budget to UPDATE — omit to CREATE a new budget

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
dailyBudgetUsdNo
budgetResourceNameNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations indicate a non-read-only, non-idempotent, non-destructive operation, the description adds crucial behavioral context by warning that raising a live budget increases real spend immediately. It also discloses the confirmation workflow, which is not captured in annotations. However, it does not address all edge cases (e.g., lowering live budgets), slightly limiting transparency.

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 compact and front-loaded: it states the primary purpose in the first sentence, then gives a critical safety warning, then a safe-operations note. Every sentence carries essential information with no fluff or redundancy.

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 description covers the risky action (raising on live) and safe actions (creating/lowering on paused), but leaves ambiguity about lowering a live campaign or creating a budget for a live campaign. Given the financial impact, this is a meaningful gap. Output schema exists, so return values need not be explained, but the live-campaign behavior matrix is incomplete.

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?

Since schema description coverage is 100%, the schema already explains all parameters clearly. The description reinforces the create/update distinction and the confirm requirement, but these are already in the parameter descriptions. No additional semantic meaning is added beyond what the schema provides, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a new daily budget or changes an existing budget's amount, with explicit resource reference (budgetResourceName). It distinguishes from sibling tools like set_google_ads_status or set_google_ads_bidding by focusing specifically on daily budget operations.

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?

The description provides detailed when-to-use guidance: raise live campaign budgets only after explicit user confirmation, with confirm:true. It explicitly contrasts safe scenarios (creating or lowering on paused campaigns) and mandates showing the new daily amount. This is stronger than typical usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_google_ads_statusEnable, pause or remove a Google Ads campaign / ad group / adA
Idempotent
Inspect

Turn a campaign, AD GROUP or AD ON (ENABLED), OFF (PAUSED) or REMOVED. Pass level:"campaign" + campaignId, level:"adGroup" + adGroupId, or level:"ad" + BOTH adGroupId and adId (Google keys an ad by adGroupId~adId). ENABLING STARTS REAL AD SPEND — you MUST first show the user the campaign name + its daily budget, get an explicit yes, then call with status:"ENABLED" and confirm:true. Pausing is always safe. REMOVED is PERMANENT in Google Ads and is handled by the same gate as delete_google_ads_object — call it once WITHOUT confirm to see what goes with it, and expect to echo back the object’s name and child count when it has children, is live, or has spent. The resulting status is READ BACK from Google before you are told it took.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNoad id (level:"ad" — pass adGroupId too)
levelNowhat to change — default campaign
statusYesENABLED = start spending; PAUSED = stop; REMOVED = permanent
confirmNoREQUIRED true to ENABLE (real spend) or to REMOVE (permanent)
adGroupIdNoad group id (level:"adGroup", or with adId for level:"ad")
campaignIdNocampaign id (level:"campaign")
customerIdNo10-digit account id (dashes ok) — omit to use the brand’s selected default account
loginCustomerIdNomanager id if operating through an MCC
campaignResourceNameNofull resource name, e.g. customers/{cid}/campaigns/{id}

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
levelNo
statusNo
resourceNameNo
verifiedStatusNo
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark destructiveHint=false, but the description warns 'REMOVED is PERMANENT in Google Ads' and references the same gate as delete_google_ads_object. This is a direct contradiction with the annotation. Because the description's core safety mechanism centers on destruction, the annotation misleads the agent about the tool's destructive potential.

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 moderately long but information-dense. Every clause contributes: the ID rules, spend warning, safe pause, permanent removal, and read-back verification. It is structured clearly with clauses separated by em dashes and uppercase warnings; no fluff.

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?

The description covers purpose, per-level parameter mapping, safety gates, confirmation flow, destructive permanence, and verification behavior. Combined with the input schema and output schema, it equips an agent with nearly all necessary context. The only significant gap is the contradiction with destructiveHint, which is a consistency issue not a completeness 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 covers all 9 params with descriptions, but the description adds crucial combinatorial logic: which ID fields are needed for each level, especially the adGroupId+adId pairing for ad level. It also explains confirm:true is required for ENABLE/REMOVE, which goes beyond the schema's generic 'REQUIRED true' note. This adds significant meaning.

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 clear declarative: 'Turn a campaign, AD GROUP or AD ON (ENABLED), OFF (PAUSED) or REMOVED.' This identifies the resource (Google Ads object) and the action (status change) explicitly. It also distinguishes from sibling status tools by naming the three levels and permanent removal semantics.

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?

The description gives explicit scenarios: passing level+ID pairs for each object type, and requires confirm:true for ENABLE and REMOVE. It states prerequisites (show user campaign name and daily budget, get yes) and contrasts 'Pausing is always safe' with the gated destructive operations. This is strong usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_google_ads_targetingAdd Google Ads location & language targetingAInspect

ADD locations and languages to an existing Google Ads campaign. THIS ADDS; IT DOES NOT REPLACE — Google campaign criteria are a list, this call only ever creates entries, and there is no remove operation here. So a campaign already targeting the United States that you "change to Canada" ends up targeting BOTH and still spending in the US; the read-back names every pre-existing location and language it kept, and you MUST relay that rather than reporting the new total as the answer. Removing targeting is done in Google Ads (Campaign ▸ Settings ▸ Locations). Pass locations by NAME ("United States", "California", "Toronto") — they are resolved to Google's geo target ids for you; excludedLocations adds a NEGATIVE criterion (the reliable way to stop serving somewhere from here); languages takes ISO codes ("en","fr"). A campaign with NO location targeting runs WORLDWIDE, which is the most expensive default in Google Ads. Changing a LIVE campaign's targeting moves real spend immediately, so that needs confirm:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNo
confirmNoREQUIRED true to change a LIVE (ENABLED) campaign
languagesNoISO language codes, e.g. ["en","es"]
locationsNolocation NAMES to target
campaignIdYesthe campaign to target
customerIdNoomit to use the brand’s selected default account
countryCodeNo2-letter hint to disambiguate a city name, e.g. CA for "London"
loginCustomerIdNo
excludedLocationsNolocation NAMES to exclude

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
campaignIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond annotations by disclosing that the operation is additive-only, not a replace, and explains the real-world consequence of accidentally targeting both US and Canada. It also reveals the read-back behavior ('you MUST relay that') and the live-spend risk, which are not visible in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but every sentence carries critical operational knowledge, with the most important caveat ('THIS ADDS; IT DOES NOT REPLACE') placed at the start. It uses parenthetical examples to clarify parameter formats without wasting words.

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 mutation tool with real-world financial impact, the description covers purpose, behavior, parameter semantics, alternative workflows, and warnings. The existence of an output schema means return-value details are not needed, so the description provides sufficient context for correct invocation.

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 78%, but the description adds important semantics: locations are resolved by name, excludedLocations creates negative criteria, and languages use ISO codes. It does not elaborate on dryRun or login/customer IDs, but the schema already covers those adequately.

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 'ADD locations and languages to an existing Google Ads campaign', providing a specific verb, resource, and scope. It clearly distinguishes from sibling tools like set_google_ads_status or add_google_ads_keywords by focusing on location/language targeting.

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 explicitly states when to use this tool (adding locations/languages) and notes that removal must be done in Google Ads, which acts as an alternative. It also explains the consequences of adding to an already-targeted campaign and warns about the 'no location = worldwide' default, giving clear context for decision-making.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_linkedin_ads_budgetSet a LinkedIn campaign budgetA
Idempotent
Inspect

Change a LinkedIn campaign’s daily and/or total budget. On a LIVE (ACTIVE) campaign this changes real spend immediately — and LinkedIn can spend up to 150% of a daily budget on a high-opportunity day — so show the user the new amount, get an explicit yes, then call with confirm:true. The currency must match the ad account’s. Read back after the change.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true to change the budget of a LIVE campaign
campaignIdYes
adAccountIdNo
dailyBudgetNo
totalBudgetNo
currencyCodeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
campaignIdNo
dailyBudgetNo
totalBudgetNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds critical behavioral details beyond annotations: immediate real-spend impact, 150% daily overspend possibility, mandatory confirm:true, currency matching, and read-back. These are substantial and not inferable from the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every clause serves a purpose: action, risk warning, confirmation protocol, currency rule, and verification step. No filler words, and the critical warning is front-loaded.

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?

The tool involves real money on live campaigns; the description covers the essential operational safeguards (confirmation, currency, read-back) and budget types. Output schema exists, so return details are not required. It is complete for this sensitive operation.

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?

With only 17% schema description coverage, the description compensates by explaining daily/total budget, confirm semantics, and currency constraint. It does not detail campaignId or adAccountId, but those are relatively self-evident.

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 starts with 'Change a LinkedIn campaign’s daily and/or total budget,' clearly stating the action and target resource. It distinguishes from sibling budget tools for other platforms (e.g., set_google_ads_budget) by specifying LinkedIn.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: live campaigns spend immediately, require user confirmation, and currency must match the ad account. It does not explicitly name alternatives or when-not-to-use, but the guidance is concrete and actionable for the safe invocation of this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_linkedin_ads_statusActivate or pause a LinkedIn campaign group / campaign / adA
Idempotent
Inspect

Turn a LinkedIn campaign group, campaign or CREATIVE (the ad itself) on (ACTIVE) or off (PAUSED). Pass level:"campaign" + campaignId, level:"campaignGroup" + campaignGroupId, or level:"creative" + creativeId. All three tiers must be ACTIVE for an ad to serve — activating only the campaign leaves a DRAFT creative sitting there showing nothing. ACTIVATING STARTS REAL AD SPEND — you MUST first show the user the campaign and its budget, get an explicit yes, then call with status:"ACTIVE" and confirm:true. Pausing is always safe. The resulting status is READ BACK from LinkedIn along with its servingStatuses before you are told it took: LinkedIn defers validation on drafts, so activation is exactly where a hidden problem surfaces, and the note reports what LinkedIn actually says rather than what was requested.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNodefault campaign
statusYes
confirmNoREQUIRED true to set ACTIVE (real spend)
campaignIdNo
creativeIdNo
adAccountIdNo
campaignGroupIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
levelNo
statusNo
verifiedStatusNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations (readOnlyHint=false, destructiveHint=false) by disclosing that activation starts real ad spend, requires confirm:true, and that the resulting status is read back from LinkedIn with servingStatuses. It explains that LinkedIn defers validation on drafts, so activation is where hidden problems surface. This gives the agent crucial behavioral insight without contradicting 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 dense but each sentence adds value: level/ID mapping, spend warning, confirmation gate, hierarchy, and read-back behavior. The use of ALL CAPS is slightly noisy but serves to highlight critical warnings. It is appropriately sized for the risk involved, though it could be more succinctly organized.

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 tool with an output schema, the description covers all major usage aspects: levels, ID requirements, the activation confirmation and spend implications, the need for all tiers to be ACTIVE, and the read-back behavior. It doesn't need to explain return values since an output schema exists. Minor gaps like adAccountId and ARCHIVED/DRAFT are not central to the primary use 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?

With only 29% schema description coverage, the description compensates well by mapping each level to its required ID (campaign+campaignId, campaignGroup+campaignGroupId, creative+creativeId) and explaining the confirm:true requirement for ACTIVE. However, it does not clarify the role of adAccountId or the ARCHIVED/DRAFT enum options, leaving some parameters under-explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Turn a LinkedIn campaign group, campaign or CREATIVE (the ad itself) on (ACTIVE) or off (PAUSED).' It names the specific resource types and differentiates from sibling tools by focusing on LinkedIn ad status changes.

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 instruction on how to use the tool: 'Pass level:"campaign" + campaignId, level:"campaignGroup" + campaignGroupId, or level:"creative" + creativeId.' It also warns when to use ACTIVE (only after explicit user confirmation due to real spend) and states that pausing is always safe. The three-tier hierarchy clarifies when multiple status changes are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_meta_campaign_statusActivate or pause a Meta campaignA
Idempotent
Inspect

Turn a campaign ON (ACTIVE) or OFF (PAUSED). ACTIVATING STARTS REAL AD SPEND — you MUST first show the user the campaign name + its daily budget, get an explicit yes, then call with status:"ACTIVE" and confirm:true. Pausing is always safe. Needs ads-management permission.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYesACTIVE = start spending; PAUSED = stop
confirmNoREQUIRED true to activate (real spend) — set only after the user explicitly approved the budget
campaignIdYesthe campaign id (from create_meta_campaign)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
statusNo
campaignIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses significant behavioral traits beyond annotations: activating starts real ad spend, requires ads-management permission, and mandates a confirmation step. It also clarifies that pausing is safe. These details add valuable context not covered by the annotation fields, and no contradictions exist.

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 sentences with no redundant information. It front-loads the core action, then delivers critical safety and permission warnings in a compact format. The all-caps 'MUST' and 'REAL AD SPEND' draw attention without wasting words.

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 real-world financial impact, the description is remarkably complete. It covers purpose, the mandatory user-confirmation workflow, permission requirements, and the safety of pausing. With an output schema present, return-value details are unnecessary. No important gaps remain.

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% for all parameters. The description adds meaning by tying the confirm flag to the ACTIVE status, explaining that confirm:true is required for activation. It also clarifies the behavior of status values (ACTIVE starts spending, PAUSED stops), complementing the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool turns a campaign ON (ACTIVE) or OFF (PAUSED), using a specific verb and resource. It is explicitly scoped to Meta campaigns, distinguishing it from sibling status-setting tools for other platforms (e.g., set_google_ads_status).

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 provides explicit when-to-use guidance: activation requires showing the user campaign name and daily budget, obtaining explicit yes, and setting confirm:true. It also states pausing is always safe. However, it does not explicitly mention alternatives for other ad platforms, but the Meta-specific naming makes the context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_microsoft_ads_budgetSet a Microsoft Advertising daily budgetA
Idempotent
Inspect

Change a Microsoft Advertising campaign’s DAILY BUDGET (in the account’s currency). Raising it on a LIVE (Active) campaign increases real spend immediately — you MUST show the user the new daily amount, get an explicit yes, then call with confirm:true. If the campaign is on a SHARED budget its amount is read-only here and this refuses with an explanation rather than pretending to change it. Read back after the change.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true to change the budget of a LIVE campaign
accountIdNoMicrosoft ad account id — omit to use the brand’s single shared account
campaignIdYesthe campaign whose budget changes
dailyBudgetYesnew daily budget in the account’s currency

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
campaignIdNo
dailyBudgetNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behavioral traits not captured by annotations: raising a live campaign budget increases real spend immediately, a confirmation protocol is mandatory, shared budgets are refused rather than silently ignored, and the tool reads back after changes. This adds significant operational risk context beyond the readOnly/destructive hints.

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 three sentences: main action, critical safety caveat, shared-budget exception, and read-back instruction. It is compact, front-loaded, and every sentence earns its place with no redundancy.

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 mutation tool with output schema and annotations present, the description covers all essential operational nuances: live-budget spend consequence, confirmation requirement, shared-budget refusal, and post-change read-back. This is complete enough for safe and 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 description coverage is 100%, and the tool description does not add new parameter-level details beyond reinforcing the confirm requirement and currency context. The shared-budget behavior is a property of the campaign type, not the parameters themselves, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the verb 'Change' and resource 'Microsoft Advertising campaign's DAILY BUDGET', with a note about the account's currency. It distinguishes this from sibling budget setters (e.g., set_google_ads_budget) by naming the platform and budget type.

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 provides explicit guidance for live campaigns: show the new daily amount, get explicit yes, and call with confirm:true. It also explicitly states that shared budgets are read-only and the tool refuses, giving a clear when-not situation. However, it doesn't explicitly name alternative tools for other platforms, though that's implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_microsoft_ads_statusActivate or pause a Microsoft Advertising campaign / ad group / adA
Idempotent
Inspect

Turn a Microsoft Advertising campaign, AD GROUP or AD on (Active) or off (Paused). Pass level:"campaign" + campaignId, level:"adGroup" + adGroupId, or level:"ad" + BOTH adGroupId and adId. ACTIVATING STARTS REAL AD SPEND — you MUST first show the user the campaign name + its daily budget, get an explicit yes, then call with status:"Active" and confirm:true. Pausing is always safe. Microsoft has only these two statuses — its Deleted state is internal-only and cannot be SET — so to remove something use delete_microsoft_ads_object, which is a real delete operation, not a status. The resulting status is READ BACK from Microsoft before you are told it took — and Microsoft may report BudgetPaused / BudgetAndManualPaused / Suspended instead, which the note names explicitly.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNoad id (level:"ad" — pass adGroupId too)
levelNowhat to change — default campaign
statusYesActive = start spending; Paused = stop
confirmNoREQUIRED true to set Active (real spend)
accountIdNoMicrosoft ad account id — omit to use the brand’s single shared account
adGroupIdNoad group id (level:"adGroup", or with adId for level:"ad")
campaignIdNocampaign id (level:"campaign")

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
levelNo
statusNo
verifiedStatusNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, it discloses critical behavior: activating starts real ad spend, requires showing the user campaign name + daily budget and getting explicit yes, and requires confirm:true. It also explains Microsoft's Deleted state is internal-only and that the resulting status is read back from Microsoft and may differ (BudgetPaused, etc.). This goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence carries functional weight: scope, parameter mapping, safety warning, alternative tool, and read-back behavior. It is dense yet well-organized, front-loading the primary action before diving into constraints and edge cases.

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 (7 parameters, three levels, real-spend implications), the description covers purpose, usage combinations, confirmation requirements, platform limitations, and expected result verification. It is fully self-contained and leaves no material gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already provides 100% parameter descriptions, the description adds vital semantics: 'level:"campaign" + campaignId, level:"adGroup" + adGroupId, or level:"ad" + BOTH adGroupId and adId' clarifies required combinations, and it emphasizes the confirm parameter's role as mandatory for activation. This enriches the schema meaning.

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 specific verb and resource: 'Turn a Microsoft Advertising campaign, AD GROUP or AD on (Active) or off (Paused).' It clearly distinguishes from sibling tools by naming Microsoft and the three levels, and explicitly differentiates from delete_microsoft_ads_object by noting Deleted is not settable.

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 provides explicit when-to-use guidance, including the exact parameter combinations for each level and a direct alternative: 'to remove something use delete_microsoft_ads_object, which is a real delete operation, not a status.' It also states when confirmation is required (activating) versus safe (pausing).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_openai_ads_budgetSet a ChatGPT Ads campaign budgetA
Idempotent
Inspect

Change a ChatGPT Ads campaign’s budget — a daily cap, a lifetime cap, or both, in the ad account’s currency. ChatGPT Ads’ own minimum for a DAILY budget is 25.00 (measured live 2026-08-05; a LIFETIME budget has no such floor, so use one to spend less than that in total). Raising it on a LIVE (active) campaign increases real spend immediately, so you MUST show the user the old and new amounts, get an explicit yes, then call with confirm:true. Lowering it or changing a paused campaign is safe. The campaign is READ BACK after the change and the note is built from that.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true when the campaign is live
campaignIdYes
dailyBudgetNo
lifetimeBudgetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
campaignNo
campaignIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that raising a live campaign's budget increases real spend immediately and requires explicit user confirmation via confirm:true. Also notes the campaign is read back after the change, going well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by essential caveats in compact sentences. Every sentence adds critical information without repetition or 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 (multiple budget types, confirmation requirement, safety differences), the description covers all key operational aspects, including minimums, confirmation, safe cases, and read-back behavior. An output schema exists, so return description is not required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema coverage at only 25%, the description compensates by explaining the purpose and constraints of dailyBudget and lifetimeBudget (minimums), the confirm flag's role, and the currency context. This adds significant meaning beyond the bare 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?

The description explicitly states the tool changes a ChatGPT Ads campaign's budget, specifying daily cap, lifetime cap, or both, and in the ad account's currency. This is a specific verb+resource with scope, clearly distinguishing it from sibling budget tools for other ad platforms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context on when to use daily vs lifetime budgets (minimums), and guidance on raising vs lowering on live vs paused campaigns. It does not explicitly name alternative tools, but the platform-specific name and budget-specific sibling set make the intended use unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_openai_ads_statusActivate, pause or archive a ChatGPT Ads campaign / ad group / adA
Idempotent
Inspect

Turn a ChatGPT Ads campaign, AD GROUP or AD on (active), off (paused), or ARCHIVE it. Pass level:"campaign" + campaignId, level:"adGroup" + adGroupId, or level:"ad" + adId. ACTIVATING STARTS REAL AD SPEND — you MUST first show the user the object and its budget, get an explicit yes, then call with status:"active" and confirm:true. Pausing is always safe and stops all spend. ARCHIVING IS IRREVERSIBLE: it is this platform’s only teardown (there is no delete and no un-archive, and OpenAI’s own guidance is "only archive objects you have no further use for"), so it ALSO requires confirm:true — prefer pausing unless the user is certain. Remember an ad only serves when the ad, its ad group AND its campaign are all active and the ad has passed OpenAI’s review. The resulting status is READ BACK from OpenAI before you are told it took.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNo
levelNoinferred from which id you pass — default campaign
statusYesactive = start spending; paused = stop; archived = permanent
confirmNoREQUIRED true to activate (real spend) or to archive (irreversible)
adGroupIdNo
campaignIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
levelNo
objectNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, destructiveHint=false), the description discloses critical behavioral traits: activation starts real ad spend, archiving is irreversible with no delete/un-archive, confirmation is mandatory for spend/archive, and the resulting status is read back from OpenAI before confirmation. This add substantial context and contradicts no 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?

The description is long but every sentence carries essential information for high-stakes operations. It uses capitalization for critical warnings (e.g., ACTIVATING, ARCHIVING) and organizes guidance logically: action, parameter mapping, safety requirements, and service condition. The length is justified by the tool's complexity and risk.

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 (6 parameters, 3 levels, irreversible actions) and the presence of an output schema, the description covers all necessary aspects: parameter selection, status semantics, confirmation requirements, irreversible behavior, and the dependency on all levels being active. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 50%, the description compensates by explaining the semantic relationship between level and IDs, the meaning of each status, and the confirm parameter's role. It adds scenario-based context (e.g., 'ad only serves when all three active') that the schema doesn't convey, clarifying how to combine parameters correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: turning a ChatGPT Ads campaign, ad group, or ad on, off, or archiving it. It explicitly names the resource (ChatGPT Ads objects) and distinguishes it from sibling tools for other ad platforms (e.g., set_google_ads_status, set_meta_campaign_status). The level-specific parameter mapping (level + corresponding ID) clarifies the exact scope of operation.

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?

The description provides explicit when-to-use guidance for each status: activating requires showing the user the object and budget, obtaining explicit consent, and confirm:true; pausing is safe and stops spend; archiving is irreversible and should be avoided unless certain. It also names an alternative (prefer pausing) and explains the prerequisite for ads serving (all levels active and review passed). This exceeds typical guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_pinterest_ads_budgetSet a Pinterest campaign budgetA
Idempotent
Inspect

Change a Pinterest campaign’s budget — a DAILY cap or a LIFETIME cap, in the ad account’s currency. Pinterest allows only one of the two per campaign, so passing both is refused rather than silently picking one. Raising it on a LIVE (ACTIVE) campaign increases real spend immediately — you MUST show the user the new amount, get an explicit yes, then call with confirm:true. Read back after the change.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoREQUIRED true to change the budget of a LIVE campaign
campaignIdYesthe campaign whose budget changes
adAccountIdNo
dailyBudgetNo
lifetimeBudgetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
campaignIdNo
dailyBudgetNo
lifetimeBudgetNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond what annotations state (readOnly=false, destructive=false, idempotent=true), the description discloses key behaviors: conflicting parameters cause a refusal rather than silent selection, raising a live campaign budget immediately increases spend, and a post-change read-back is expected. These insights materially change how an agent should invoke the tool.

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 three sentences, front-loaded with the core purpose, then constraints, then the critical safety instruction. Every sentence adds essential information, and there is no redundancy or 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 tool with a confirmation param, exclusivity constraint, and live-spend risk, the description covers all necessary context: what the tool does, how to use it correctly, what pitfalls exist, and what to do after calling. The presence of an output schema removes the need to describe return values. This is a complete and self-sufficient description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 40% schema coverage, the description compensates well. It clarifies that dailyBudget and lifetimeBudget refer to 'DAILY cap' and 'LIFETIME cap' and that they are mutually exclusive. It also explains the confirm parameter by tying it to the explicit user-approval step. The adAccountId is implied via 'ad account’s currency,' though not named, which is acceptable given its self-evident name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Change a Pinterest campaign’s budget — a DAILY cap or a LIFETIME cap, in the ad account’s currency.' It specifies the exact resource and scope, and the mention of 'DAILY' vs 'LIFETIME' distinguishes it from sibling tools like set_pinterest_ads_status or other ad platform budget setters.

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?

The description gives explicit when-to-use guidance, including the critical rule that only one budget type (daily or lifetime) may be set per campaign and that passing both is refused. It also mandates a confirmation workflow for live campaigns: 'you MUST show the user the new amount, get an explicit yes, then call with confirm:true.' This is direct, actionable usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_pinterest_ads_statusActivate, pause or archive a Pinterest campaign / ad group / adA
DestructiveIdempotent
Inspect

Turn a Pinterest campaign, AD GROUP or AD on (ACTIVE) or off (PAUSED) — and, because Pinterest has NO DELETE anywhere in its API, this is also the only way to retire one (ARCHIVED). Pass level:"campaign" + campaignId, level:"adGroup" + adGroupId, or level:"ad" + adId. ACTIVATING STARTS REAL AD SPEND, and ARCHIVING is effectively a delete: both require you to show the user exactly what changes, get an explicit yes, and call again with confirm:true. Pausing is always safe. The resulting status is READ BACK from Pinterest before you are told it took.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNo
levelNowhat to change — default campaign
statusYesACTIVE = start spending; PAUSED = stop; ARCHIVED = retire (Pinterest’s delete)
confirmNoREQUIRED true for ACTIVE (real spend) or ARCHIVED (irreversible retirement)
adGroupIdNo
campaignIdNo
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
levelNo
statusNo
verifiedStatusNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond annotations by disclosing that activating 'STARTS REAL AD SPEND', archiving 'is effectively a delete', that both require a two-step confirmation flow, and that status is 'READ BACK from Pinterest' before success is reported. This is exactly the kind of behavioral context agents need.

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?

Every sentence carries critical information: the statuses, the parameter mapping, the danger warnings, and the confirmation workflow. The caps and formatting emphasize the most important cautions without padding. It is dense but not bloated.

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 description thoroughly covers the main statuses, danger vectors, and parameter relationships, and the output schema covers return values. However, it omits the DRAFT status present in the schema's enum and never mentions adAccountId, leaving minor gaps for a complex mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 43% schema description coverage, the description compensates exceptionally well. It maps each level to its required ID parameter ('level:"campaign" + campaignId') and explains the two-call confirm:true pattern, which the schema alone does not convey. This adds meaning beyond the structured field descriptions.

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: 'Turn a Pinterest campaign, AD GROUP or AD on (ACTIVE) or off (PAUSED)' and adds the unique ARCHIVED retirement capability. It clearly distinguishes itself from sibling tools like set_pinterest_ads_budget and status tools for other platforms.

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 explicit invocation patterns (level + matching ID) and clear high-stakes usage rules: activating requires consent/confirm:true, archiving is the only delete path, pausing is always safe. It does not explicitly name alternative tools for budget changes, but the 'only way to retire' phrasing provides strong when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_post_refillConfigure the posting refillA
Idempotent
Inspect

Turn the automatic posting refill on or off and set how it behaves. PASS ONLY WHAT CHANGES. enabled:false is the PAUSE — it removes the recurring job outright, and posts already queued are left alone (cancel those with cancel_scheduled if you want them gone). It starts in dryRun, which plans and previews without queueing; set dryRun:false only once a human has read a preview from run_post_refill. THE CADENCE IS THE BRAND’S POSTING TIMES, not a number here: three posting times means three posts a day. Raising maxImagesPerDay / maxVideosPerDay / maxCreditsPerDay above 0 lets it SPEND on new creative — at 0 (the default) it only reuses renders already in the Library and costs nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNotrue (the default) = plan and preview only, queue nothing. Set false ONLY after a human has read a preview.
pageIdNoFACEBOOK / INSTAGRAM / THREADS — which connected Page to publish from (list_meta_pages). Omit for the brand’s only Page.
boardIdNoPINTEREST — which board Pins go on (list_pinterest_boards). Without one, Pinterest is skipped: a Pin on the wrong board is a public mistake, so it is never guessed.
enabledNoon/off. false PAUSES it: the recurring job is deleted and nothing new is queued. Already-queued posts are untouched.
channelsNorestrict it to these channels. Omit (or send an empty list) to use every connected channel that can carry each post.
daysAheadNohow far ahead to keep the queue full, 1–30 (default 7)
postsPerDayNocap the posts per day BELOW the number of posting times. 0 (default) = use every posting time, which is where "3 a day" comes from. To post MORE per day, add posting times instead.
maxImagesPerDayNohow many NEW images a day it may render when the Library runs dry. 0 (default) = none, spend nothing.
maxVideosPerDayNohow many NEW videos a day it may render. 0 (default) = none. Video is the expensive one — hundreds of credits each.
maxCreditsPerDayNoa hard credit ceiling per day, checked BEFORE any render starts. It binds independently of the counts above.
assetCooldownDaysNohow long before a Library render may be posted again (default 30). It never repeats one inside this window — it queues fewer posts and says so.
linkedinOrganizationIdNoLINKEDIN — which company Page to post as (list_linkedin_pages). A single shared Page is used automatically; a Page that is not shared with this brand is ignored rather than failing the whole post.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dryRunNo
enabledNo
runningNo
daysAheadNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint:false, openWorldHint:true), the description discloses important behaviors: enabled:false 'removes the recurring job outright' but leaves queued posts; dryRun defaults to true and only plans/previews; raising budget params lets it 'SPEND on new creative' with video costing hundreds of credits. It also clarifies the cadence comes from posting times, not a parameter, and that Pinterest is skipped if boardId is omitted rather than guessed.

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 compact but information-dense, with key instructions like 'PASS ONLY WHAT CHANGES' and critical warnings front-loaded. Every sentence contributes new information; formatting with backticks and capitalization highlights important caveats without excessive length.

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 (12 optional parameters), the description addresses the highest-risk decisions: enable/disable semantics, dryRun safety, spending controls, and channel-specific behaviors (Pinterest, LinkedIn). Output schema covers return values, and schema descriptions cover individual params, so the description is complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the description still adds value: 'Video is the expensive one — hundreds of credits each' gives cost context for maxVideosPerDay; 'at 0 (the default) it only reuses renders already in the Library and costs nothing' explains the zero-default spend behavior; the boardId safety rule ('a Pin on the wrong board is a public mistake, so it is never guessed') goes beyond 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?

The description clearly states the tool's purpose: 'Turn the automatic posting refill on or off and set how it behaves.' This specific verb+resource framing distinguishes it from sibling tools like get_post_refill (read config) and run_post_refill (preview/run).

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 explicitly names related tools for alternative workflows: use run_post_refill to preview before setting dryRun:false, and cancel_scheduled to remove queued posts. The caution 'set dryRun:false only once a human has read a preview' provides a clear when-not condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_product_imageSet product photoA
Idempotent
Inspect

Lock an image as the ad's real PRODUCT photo so every render grounds on the true packaging. Pass imageUrl = a product shot's URL — an image from a prior research result (an organic Instagram/TikTok post, a scraped page image), a workspace / list_product_photos url, or any public product photo. The server downloads it and runs a product+safety check: a lifestyle/scene shot with no clear product, or an off-category / unsafe image, is REJECTED and NOTHING is locked (the summary says why). On PASS it persists the photo to a DURABLE url and returns it — pass that url as a reference to generate_image / render_ad. Bills one vision check. Reads YOUR saved brand for the category match (pass brandId to target a specific brand — switches this key's active brand like use_brand).

ParametersJSON Schema
NameRequiredDescriptionDefault
brandIdNoa brand id/name from list_brands to lock the product for; omit to use the active brand
imageUrlYesthe image URL to lock as the product (from a research result, a workspace / list_product_photos url, or any public product photo)
source_noteNoa short note on where it came from, e.g. "from their IG post"

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNothe durable served URL of the locked product photo
summaryNothe check verdict — on rejection, why nothing was locked
attachedNotrue when the image passed the product check and was locked
source_noteNowhere the photo came from
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behaviors beyond annotations: server downloads the image, runs product+safety checks, rejects with explanation, persists to a durable URL on success, bills one vision check, and reads/switches the active brand via brandId (comparing to use_brand). This aligns with annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=true, destructiveHint=false) and adds operational context like cost and 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than two sentences but each sentence earns its place: purpose, URL sources, validation behavior, success path, billing, and brand side effect. It is front-loaded with the primary purpose and flows logically from input to outcome. No filler or redundancy, though it could be slightly tightened without losing 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 tool with three parameters, an output schema, and a multi-step server process, the description covers necessary context: input sources, validation criteria, rejection behavior, success persistence, return value usage, cost, and brand interaction. The presence of an output schema means the return format is handled elsewhere, so the description is complete for decision-making.

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 enriches imageUrl by specifying it must be a 'product shot's URL' and gives concrete sources (organic Instagram/TikTok post, scraped page image). It also clarifies brandId's side effect of switching the active brand, going beyond the schema's simple description. source_note is only in the schema, but the description's added context for two of three params justifies a 4.

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 'Lock an image as the ad's real PRODUCT photo so every render grounds on the true packaging,' which uses a specific verb ('lock') and a clear resource ('ad's real PRODUCT photo'). It distinguishes this tool from siblings like generate_image or render_ad by focusing on setting a reference photo rather than creating content.

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 tells the agent when to use this tool: before generating/rendering ads, by providing an imageUrl from research results, list_product_photos, or any public product photo. It also explains the downstream usage ('pass that url as a reference to generate_image / render_ad'). It lacks an explicit 'when not to use' statement or direct alternatives, but rejection criteria (lifestyle shots, off-category/unsafe images) imply when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_reddit_ads_statusActivate, pause, archive or delete a Reddit campaign / ad group / adA
DestructiveIdempotent
Inspect

The one switch that arms real money on Reddit. Pass kind ("campaign", "ad_group" or "ad") plus the object id. ACTIVE starts real spend as soon as Reddit approves — show the user exactly what will run and get an explicit yes, then call again with confirm:true. PAUSED is always safe and never gated. REDDIT HAS NO DELETE OPERATION for these three: removal is a status, and ARCHIVED/DELETED here run the SAME blast-radius gate as delete_reddit_ads_object (call that one instead when you mean to remove something — it is the same code path and its unconfirmed call reports what goes with it). Remember Reddit’s three tiers all have to be ACTIVE for a single impression to serve: activating the campaign alone does nothing if its ad group and ad are still paused. The resulting status is READ BACK from Reddit.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
kindYes
statusYesACTIVE = start spending; PAUSED = stop; ARCHIVED = retire; DELETED = permanent, and blocked for 3h after any change
confirmNoREQUIRED true for ACTIVE (real spend), ARCHIVED and DELETED
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
kindNo
nameNo
noteNo
statusNo
effectiveStatusNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond annotations by disclosing that ACTIVE triggers real spend and requires explicit user confirmation, that there is no true delete operation, and that ARCHIVED/DELETED go through the same blast-radius gate as the delete tool. It also states that the resulting status is read back from Reddit, providing a clear behavioral model. Nothing 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 description is dense and front-loaded with the core message, but it is also quite long and contains a somewhat convoluted nested parenthetical about delete_reddit_ads_object. Every sentence adds value for a high-stakes tool, but tighter structure would improve 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?

Given the complexity of Reddit's three-tier hierarchy, real-spend implications, and deletion semantics, the description is outstandingly complete. It covers the confirmation gate, the blast-radius gate, the need for all tiers active, and the read-back behavior. The output schema exists, so return details are not required, and the only minor omission—adAccountId—is not a required 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 only 40%, but the description compensates by explaining the meaning of kind, id, status, and confirm. It clarifies when confirm:true is required and describes the status semantics (ACTIVE, PAUSED, ARCHIVED, DELETED) beyond the schema. However, adAccountId is not mentioned at all, leaving a gap for that parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a status switch for Reddit campaigns, ad groups, and ads, naming the exact kind values. It also distinguishes itself from the sibling delete_reddit_ads_object by clarifying the deletion semantics. The title and first sentence together firmly establish the resource and action.

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?

The description provides explicit when-to-use guidance: use this tool for status changes, but call delete_reddit_ads_object instead when removal is intended. It also details the ACTIVE confirmation flow, notes PAUSED as always safe, and warns about the three-tier activation requirement, making usage boundaries exceptionally clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_roleChange a teammate’s roleA
Idempotent
Inspect

Change a workspace member’s role — admin (full access incl. billing) or member (read-only on billing). A privilege change: confirm the exact person + new role with the user, then call with confirm:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleYesthe new role
emailYesthe member’s email
confirmNoREQUIRED true

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
roleNo
emailNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a non-read-only, non-destructive, idempotent operation. The description adds valuable behavioral context by explaining privilege implications ('admin (full access incl. billing) or member (read-only on billing)') and the need for user confirmation before proceeding. This goes beyond annotations to inform the agent of the operational impact and required confirmation step.

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 sentences long, front-loaded with the primary purpose, and every clause serves a purpose. It defines roles, indicates the confirmation requirement, and clearly instructs the agent on the next step. No redundant or flowery language is present.

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 tool of this complexity, the description is complete. It covers the core behavior (role change), explains the role definitions, and includes the critical confirmation step. The input schema documents all parameters, and an output schema exists to explain return values. The description, combined with annotations and schema, provides a thorough understanding without additional gaps.

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 baselines are met. The description enriches the role parameter by defining 'admin' and 'member' in terms of billing access, which the schema does not provide. It also clarifies the purpose of the confirm parameter ('A privilege change: confirm the exact person + new role with the user') beyond the schema's bare 'REQUIRED true'. This adds meaningful semantic value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Change a workspace member’s role') and the resource (workspace member). It distinguishes the tool from siblings like invite_member and remove_member by explicitly mentioning role change and defining the two roles with access differences. The verb 'change' and resource are specific and unambiguous.

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 provides clear context for when to use this tool (to change a member's role) and includes a procedural guideline ('confirm the exact person + new role with the user, then call with confirm:true'). It does not explicitly name alternatives or exclusions, but the purpose is distinct enough that an agent can infer when to select this tool over invite_member or remove_member.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_x_ads_statusPause or activate an X campaign or line itemAInspect

Pause or ACTIVATE an X ads CAMPAIGN (campaignId) or ONE LINE ITEM inside it (lineItemId) — pass exactly one. ACTIVATING STARTS REAL SPEND on the next auction, so it requires confirm:true — this is the only switch on X that arms money. Tell the user the budget and what will start spending BEFORE you pass confirm. DELIVERY ON X IS THE AND OF BOTH LEVELS: an ACTIVE line item under a PAUSED campaign serves nothing, so the result reads the PARENT back too and states whether anything can actually spend rather than letting you infer it. Pausing a line item is the REVERSIBLE way to take one ad group out of delivery — deleting it is not.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
confirmNorequired to set ACTIVE — real money
accountIdYes
campaignIdNothe whole campaign — pass this OR lineItemId
lineItemIdNoone ad group — pass this OR campaignId

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
statusNo
campaignIdNo
lineItemIdNo
parentStatusNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses critical behaviors beyond the openWorldHint annotation: activation 'STARTS REAL SPEND on the next auction', confirm is required for ACTIVE, and 'this is the only switch on X that arms money'. It also explains the parent-level delivery logic and that the result reads back the parent to state whether anything can actually spend. Excellent transparency.

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 compact despite covering safety, parameter selection, hierarchy, and reversibility. Every sentence adds necessary behavioral or safety context. The opening sentence immediately states purpose and object selection, making it front-loaded and efficient.

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 mutating ad-status tool, the description covers safety warnings, campaign/line-item semantics, confirm requirement, parent-level delivery behavior, and reversibility. An output schema exists, so return structure need not be repeated. This is a complete and actionable description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema description coverage is 60%, the description clarifies the mutual exclusivity of campaignId and lineItemId ('pass exactly one'), the meaning of status (ACTIVE vs PAUSED), and the role of confirm ('required to set ACTIVE — real money'). This substantially compensates for undocumented parameters like accountId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the specific verb and resource: 'Pause or ACTIVATE an X ads CAMPAIGN (campaignId) or ONE LINE ITEM inside it (lineItemId)'. It distinguishes the tool from siblings by specifying the exact X ads object at which the status change is aimed.

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 instructs to pass exactly one of campaignId or lineItemId, requires confirm:true for activation, mandates informing the user about budget before confirming, and contrasts pausing with deleting: 'Pausing a line item is the REVERSIBLE way to take one ad group out of delivery — deleting it is not.' This gives clear when-to-use and alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_youtube_thumbnailSet the custom thumbnail on a YouTube videoA
Idempotent
Inspect

Set the CUSTOM THUMBNAIL on a video already on the connected channel, using a Hermoso image — a make_thumbnail render, a generated image, or a frame. The thumbnail is the single biggest lever on YouTube click-through and YouTube otherwise auto-picks a frame, so a published video without one is leaving reach on the table. It changes ONLY the thumbnail — video, title and privacy are untouched — but it is public and immediate, so show the user which image is going on which video and get a yes first. Custom thumbnails require a VERIFIED YouTube channel (a phone number at youtube.com/verify); without it YouTube refuses and the error says so. Images over YouTube’s 2MB cap are compressed automatically. The image must be Hermoso-HOSTED, which is not the same as Hermoso-GENERATED: the user’s own artwork works, put it through upload_file first and pass the URL that returns. An arbitrary external host is refused. 0 credits. Needs a connected YouTube channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
videoIdYesthe YouTube video id (what post_to_youtube returned)
imageUrlYesa Hermoso-hosted image URL — a make_thumbnail / list_library render, OR any image of the user’s own passed through upload_file first. An arbitrary external host is refused.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
noteNo
bytesNo
videoIdNo
thumbnailUrlNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses important behaviors beyond annotations: the change is public and immediate, requires a verified channel, images over 2MB are compressed, and Hermoso-hosted is not the same as Hermoso-generated. It also says it uses 0 credits and needs a connected channel. 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?

The description is longer than average but every sentence earns its place: purpose, rationale, scope, side effects, constraints, prerequisites, and cost. It is front-loaded with the primary action and then flows logically. No wasted words.

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 tool with prerequisites (verified channel), side effects (public immediate), and constraints (Hermoso-hosted, 2MB cap), this description covers all of them. It also clarifies what it does NOT do (touches title/privacy). With output schema present and full parameter coverage, nothing essential 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 already covers 100% of parameters with meaningful descriptions. The description adds significant extra semantics for imageUrl (explicitly explaining Hermoso-hosted vs generated, upload_file path, external hosts refused) and reinforces videoId's origin. It does not add new videoId info but the schema already covers it.

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 uses a specific verb+resource: 'Set the CUSTOM THUMBNAIL on a video already on the connected channel.' It clearly differentiates from sibling tools like update_youtube_video by stating it changes ONLY the thumbnail and video/title/privacy are untouched.

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 provides explicit when-to-use context (published video missing a custom thumbnail, the click-through benefit), when-not (requires verified channel, image must be Hermoso-hosted), and how to prepare the image via upload_file. This gives clear decision guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stitch_videoStitch multi-scene videoAInspect

Render a multi-scene STITCHED video (≥2 scenes) — ONLY for spots LONGER than one model clip (>15s). A ≤15s multi-beat ad renders better and cheaper as ONE single-pass generate_video/render_ad on seedance-2 (it handles the full hook→demo→payoff arc in one take) — never stitch those. Blocks until done. Spends credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNovideo model id from hermoso_capabilities — omit to let the router pick
voiceNovoiceover voice name, e.g. Rachel / George
scenesYesarray of scene objects (visual + optional voiceover/seconds)
voiceoverNofull voiceover script spoken across the scenes
resolutionNo720p (default), 480p draft, or 1080p final
aspectRatioNooutput aspect ratio, e.g. 9:16 (default) / 1:1 / 16:9
durationSecondsNototal spot length in seconds (defaults to the sum of the scenes’ seconds)

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no meaningful behavioral hints (all false), so the description carries the burden. It discloses that the tool 'Blocks until done' and 'Spends credits,' which are important side effects. It does not describe failure modes or what happens to the scenes, but the output schema and the 'Render' verb cover the core behavior sufficiently.

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 compact and front-loaded. It states the primary purpose in the first clause, provides the critical threshold (>15s), names alternatives, and ends with two short side-effect disclosures. Every sentence earns its place; no filler or repetition of schema details.

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 7-parameter tool with 100% schema coverage and an output schema, the description supplies the missing decision-relevant context: when to use it, when not to, why (cheaper/better alternative), and side effects. It fully covers the selection and invocation decision for an agent without redundancy.

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% (all parameters have descriptions), so the baseline is 3. The description adds only a little extra parameter meaning: it clarifies scene count (≥2) and the >15s constraint, but the scenes item structure remains vague in both schema and description. It does not materially deepen understanding of parameter values 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?

The description clearly states the tool's action and scope: 'Render a multi-scene STITCHED video (≥2 scenes)' and specifically limits it to spots longer than one model clip (>15s). It also distinguishes from generate_video/render_ad by explicitly naming the alternative.

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?

The description gives an explicit when-to-use condition ('ONLY for spots LONGER than one model clip (>15s)') and a when-not-to-use condition ('A ≤15s multi-beat ad renders better and cheaper as ONE single-pass generate_video/render_ad... never stitch those'). It names the specific alternative tools, making the guidance actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

store_getRead a workspace storeA
Read-only
Inspect

Read one of this workspace’s data stores by key, for visibility into what the app holds — playbooks, swipefile, saved locations, avatars, creations, chats, brand, memory, skills, employees. Read-only, free. Allowed keys: heist.memory.v1, heist.skills.v1, heist.employees.v1, heist.playbooks.v1, heist.avatars.v1, heist.locations.v1, heist.chats.v1, heist.creations.v1, heist.assets.v1, heist.brand.v1, adInspo.swipefile.v1. (The typed tools — list_memory / list_skills / list_employees / get_brand — are friendlier for those; use store_get for the rest.)

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesthe store key to read (one of the allowlisted keys)
limitNomax array items to return (default 50)

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNo
valueNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces 'Read-only'. It goes beyond annotations by listing the exact allowed keys and noting the tool is free, which are meaningful behavioral constraints. It does not cover rate limits or error behavior, but this is acceptable given annotation coverage and the simple nature of a read 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 description is longer than average due to the key list and examples, but every sentence contributes useful information. It front-loads the core action ('Read one of this workspace’s data stores by key') and then efficiently organizes examples, allowed keys, and alternative tools. It could be slightly tighter, but the structure is clear.

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, return values are already covered. The description fully addresses what stores exist, which keys are valid, and which sibling tools are preferred for certain stores. This makes the description complete for an agent to select and invoke the tool correctly in most scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions cover both parameters (key and limit), but the description adds critical value by listing all 11 valid key values, which the schema merely refers to as 'one of the allowlisted keys'. This enumeration is essential for correctly setting the key parameter and is not available elsewhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Read one of this workspace’s data stores by key' with a specific verb and resource, lists example store contents, and explicitly differentiates from sibling typed tools (list_memory, list_skills, list_employees, get_brand). This makes the purpose unambiguous and distinct.

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 explicitly says 'Read-only, free', enumerates all allowed keys, and provides direct guidance: 'The typed tools — list_memory / list_skills / list_employees / get_brand — are friendlier for those; use store_get for the rest.' This gives clear when-to-use and when-not-to-use instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

threads_insightsThreads insightsA
Read-only
Inspect

Performance for ONE Threads post (views, likes, replies, reposts, quotes, shares) when postId is given, or for the whole ACCOUNT when it is omitted — views, likes, replies, reposts, quotes, LINK CLICKS, follower count, and follower_demographics broken down by country, city, age or gender. Note the two metric sets differ: "clicks" exists only at account level and "shares" only on a single post, and an unknown metric is refused by name rather than dropped. since/until narrow the account window (Threads has no data before 2024-04-13, and followers_count / follower_demographics are lifetime metrics that ignore a window — the reply says so when that happens). Threads returns no demographics below 100 followers; an absent block means the account is under Meta’s floor, NOT that the audience is empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoYYYY-MM-DD window start (account scope)
untilNoYYYY-MM-DD window end (account scope)
postIdNopost id from list_threads_posts — omit for account-level insights
metricsNoaccount metrics: views, likes, replies, reposts, quotes, clicks, followers_count, follower_demographics
breakdownNocountry / city / age / gender — required by follower_demographics, exactly one

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
scopeNo
metricsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses critical behaviors: metrics differ by scope, unknown metrics are refused, since/until behavior, lifetime metrics ignoring the window, date floor, and the 100-follower demographic threshold. This goes well beyond the readOnlyHint/openWorldHint annotations and adds substantial context.

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 but every sentence carries useful information. It is front-loaded with the core function and then adds crucial caveats. Slightly long and run-on, but not wasteful.

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 an output schema is present, the description doesn't need to explain return structures. It covers edge cases, parameter semantics, and behavioral nuances thoroughly, making it sufficient for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds significant value by explaining interactions (clicks only at account level, shares only on a post), the refusal of unknown metrics, and that follower_demographics requires a breakdown and ignores the date window. This complements the schema's parameter descriptions effectively.

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 uses a specific verb ('Performance for') and resource ('Threads post' or 'whole ACCOUNT'), clearly distinguishing post-level vs account-level insights. It enumerates the exact metrics for each scope, making the tool's purpose unmistakable.

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 clearly explains when to pass postId vs omit it for account-level data, and notes metric-set differences. However, it does not explicitly mention alternatives (e.g., instagram_insights, meta_insights) or when NOT to use this tool, so it falls short of the highest bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

threads_publishing_limitThreads quota remainingA
Read-only
Inspect

How much of the brand’s Threads quota is left right now — posts (250 per rolling 24 hours), replies (1,000), DELETIONS (100) and location searches (500) — each as used, total and REMAINING. Check it before any bulk operation, and read it the moment Threads starts refusing: a quota refusal is otherwise indistinguishable from a broken connection or a missing permission, and reconnecting cannot fix it. A number comes back null when Threads did not report it, never as 0 — "none left" and "we could not tell" are different answers. Read-only, 0 credits. Needs Threads connected.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsNo
deletesNo
repliesNo
usernameNo
locationSearchesNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, openWorldHint), it adds crucial behavior: null values indicate Threads did not report the quota, never 0, and that 'none left' vs 'could not tell' are distinct. It also discloses reads are 0 credits and require a connected Threads account, providing full behavioral transparency.

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 concise but information-dense. Every sentence adds value: purpose, usage timing, null semantics, and access requirements. It is front-loaded with the main purpose and avoids redundancy.

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?

Despite having an output schema, the description provides all essential context: what data is returned, when to use it, why it matters, handling of missing data, and access prerequisites. For a zero-parameter tool, this is fully complete.

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 has zero parameters, so the baseline is 4. The description appropriately focuses on output (quota categories and fields) rather than parameters, and no parameter explanation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports the brand's Threads quota remaining for posts, replies, deletions, and location searches, each with used, total, and remaining. This is specific and distinguishes it from siblings like list_threads_posts or threads_insights by focusing on quota status.

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?

The description explicitly says when to use it: 'Check it before any bulk operation', and 'read it the moment Threads starts refusing'. It also explains why it's needed over troubleshooting (distinguishing quota refusal from broken connection/missing permission), which is clear usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tiktok_accountRead the connected TikTok accountA
Read-only
Inspect

Read the connected TikTok account: display name, username, bio, verified status, and their follower / following / total-likes / video counts. Use it for “how many followers do we have on TikTok”, “how is our TikTok doing”, or to confirm whose account is linked before posting. Read-only. Needs TikTok connected (Settings ▸ Connectors ▸ TikTok).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
bioNo
likesNo
avatarNo
openIdNo
videosNo
partialNo
usernameNo
verifiedNo
followersNo
followingNo
displayNameNo
profileLinkNo
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description redundantly says 'Read-only'. It adds the prerequisite that TikTok must be connected, which is useful. However, it does not disclose what happens if the connector is missing, rate limits, or any other behavioral characteristics beyond what annotations already cover.

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 three sentences, each earning its place: the first lists the returned data, the second provides concrete use cases, and the third states read-only status and the connector prerequisite. It is appropriately sized and front-loaded with the main purpose.

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?

The tool is simple (no parameters) and has an output schema, so the description doesn't need to explain return structure. It covers what the tool does, when to use it, and prerequisites. It is complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description adds value by listing the account fields that will be returned, which is more informative than the empty input schema.

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 clearly identifies the tool as reading the connected TikTok account and lists the specific data returned (display name, username, bio, verified status, follower/following/likes/video counts). It uses a specific verb and resource, but it does not distinguish itself from the sibling tool 'tiktok_creator_info', which could overlap in purpose.

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 provides explicit use cases: answering follower-count questions, checking overall TikTok performance, and confirming which account is linked before posting. It also states the prerequisite that TikTok must be connected. It does not explicitly mention alternatives or when not to use the tool, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tiktok_creator_infoRead the connected TikTok creator’s posting optionsA
Read-only
Inspect

Read the connected TikTok creator’s REAL posting options BEFORE posting: which privacy levels THEY are allowed to use, whether comments / duet / stitch are available on their account, their maximum video length, and their nickname. TikTok REQUIRES that the user is shown these actual options and picks a privacy level — never assume or default one. Call this first, show the options, get the user’s pick, then call post_to_tiktok with destination:"post". The SAME privacy options govern PHOTO posts (slideshows), not just video — TikTok takes the same four levels on both. Needs TikTok connected (Settings ▸ Connectors ▸ TikTok).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
avatarNo
nicknameNo
usernameNo
duetDisabledNo
privacyOptionsNo
stitchDisabledNo
commentDisabledNo
maxDurationSecondsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description reveals that TikTok requires showing actual options and forbids assuming a default privacy level. It also discloses that the same privacy options apply to photo posts. These are critical behavioral details that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tight and well-organized: purpose first, then data details, workflow, photo post nuance, and connection prerequisite. Every sentence adds value without repetition.

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 zero-parameter read-only nature and presence of an output schema, the description is complete: it covers data returned, the mandatory user-consent workflow, the photo post equivalence, and setup requirement. Nothing critical 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?

The tool has zero parameters, so parameter semantics are inherently clear. The description reinforces that no inputs are required, and all necessary context is about the output.

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 explicitly states the tool reads the connected TikTok creator's real posting options and enumerates the specific data returned (privacy levels, comment/duet/stitch availability, max video length, nickname). It clearly differentiates from siblings like post_to_tiktok by positioning it as a prerequisite read call.

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 a clear workflow: call this first, show options, get user's pick, then call post_to_tiktok with destination 'post'. It also states the prerequisite that TikTok must be connected. No explicit exclusions or alternative tools are mentioned, but the context is strong enough to guide usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_brandUpdate brand fieldsAInspect

Patch SPECIFIC fields of the workspace brand profile (name, domain, sells, summary, category, audience, positioning, voice, style, goal) WITHOUT overwriting the rest — a read-modify-write on the saved brand. Use for “change our voice to playful”, “we sell to dentists now”. To onboard a brand from scratch, use draft_brand. Only pass the fields you’re changing.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalNocurrent marketing goal
nameNo
sellsNowhat the brand sells
styleNovisual style — palette, typography, aesthetic
voiceNobrand voice/tone
domainNowebsite domain
summaryNoone-line description
audienceNo
categoryNo
positioningNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
brandNo
updatedNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false, so no safety profile is given. The description discloses the key behavioral trait: it patches only specified fields and does not overwrite the rest. This is valuable. It does not elaborate on side effects or auth, but the patch semantics are clear.

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 sentences, front-loaded with the core purpose, followed by examples, an alternative, and a usage rule. Every sentence adds value and there is no redundant 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?

The description covers purpose, field scope, use cases, an alternative tool, and partial update behavior. Since an output schema exists, return details are not needed. It does not state preconditions like requiring an existing brand, but this is implied by 'saved brand' and the draft_brand 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 description coverage is 60%, leaving four fields (name, audience, category, positioning) without descriptions. The description lists all fields and adds the rule 'Only pass the fields you're changing,' but it does not explain ambiguous fields like positioning or category. It partially compensates but not fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool patches SPECIFIC fields of the workspace brand profile without overwriting the rest, using a read-modify-write. It lists all fields and explicitly contrasts with draft_brand for onboarding, distinguishing it from related brand tools.

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 use cases ('change our voice to playful', 'we sell to dentists now') and names the alternative for onboarding from scratch (draft_brand). Also instructs to pass only changed fields, guiding correct usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_business_locationUpdate a Google Business Profile listingA
DestructiveIdempotent
Inspect

Change the brand’s Google Business Profile listing — hours, phone, website, description, categories, service area, labels, store code, address or the business name. THIS EDITS THE PANEL ON GOOGLE SEARCH AND MAPS, immediately and publicly: there is no draft, no preview and no undo. Pass ONLY what changes, in fields, keyed by Google’s own field names: websiteUri, phoneNumbers, regularHours, specialHours, moreHours, profile, categories, storefrontAddress, title, labels, storeCode, openInfo, serviceArea, serviceItems, latlng, adWordsLocationExtensions, relationshipData. CALL IT WITHOUT confirm FIRST — nothing is written, Google validates the payload for you, and you get back the CURRENT value of every field you are about to change, so you can show the user the exact before-and-after; then call again with confirm:true once they approve. Changing the business NAME (title) or ADDRESS (storefrontAddress) additionally needs confirmName set to the listing’s CURRENT name, because Google can suspend a listing over either. Output-only fields (metadata) and immutable ones (languageCode) are refused by name rather than dropped. Use dryRun:true to validate a payload with Google and write nothing. Needs Google Business Profile connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNovalidate with Google and write nothing (needs no confirm)
fieldsYesthe changes, keyed by Google’s Location field names, e.g. {"websiteUri":"https://example.com"} or {"regularHours":{"periods":[…]}}
confirmNotrue ONLY after the user has seen the exact before-and-after and approved it
locationIdNowhich listing, from list_business_locations — only needed when more than one is shared with this brand
confirmNameNothe listing’s CURRENT name, echoed back — required when changing title or storefrontAddress

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
dryRunNo
appliedNo
locationNo
validatedNo
locationIdNo
notAppliedNo
updateMaskNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description deeply discloses behavioral traits beyond the annotations: edits are immediate, public, and irreversible ('no draft, no preview and no undo'), name/address changes require confirmName to avoid suspension, and output-only/immutable fields are refused. This complements the destructiveHint and readOnlyHint annotations without any contradiction.

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 dense but exceptionally well-organized: it opens with purpose, follows with an urgent warning, then the field list, the confirmation protocol, special cases, and prerequisites. Every sentence carries necessary information with no filler, and the layout makes it easy 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?

For a complex mutation tool, the description covers execution flow, side effects, prerequisites, special cases (name/address suspension), and error handling for immutable fields. Since an output schema is present, return values don't need to be described. This leaves no significant gaps for an agent to make mistakes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the schema by enumerating the exact allowed keys in `fields` (websiteUri, phoneNumbers, regularHours, etc.) and explaining the two-step confirm workflow and the specific conditions for confirmName. This goes far beyond the schema's generic descriptions, helping the agent construct accurate payloads.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action—'Change the brand's Google Business Profile listing'—and lists the specific mutable fields (hours, phone, website, etc.). This distinguishes it from sibling tools like get_business_location or answer_google_business_question, making its purpose unmistakable.

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 provides explicit step-by-step usage guidance: call without confirm first to preview current values, then call with confirm:true after approval, and use dryRun:true to validate without writing. It also mentions the prerequisite that a Google Business Profile must be connected. However, it does not explicitly state when not to use this tool in favor of an alternative, though the context makes the use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_docEdit a Google Doc in placeA
DestructiveIdempotent
Inspect

EDIT a Google Doc — the correction append_to_doc cannot make, which until now meant a doc could only ever grow and a wrong line stayed in it forever. Two shapes: replacements:[{find, replace}] rewrites specific text wherever it appears (call read_doc first and match the text EXACTLY; matchCase:false ignores case), or rewrite:"…" replaces the ENTIRE body (rewrite:"" empties it). Find/replace runs immediately and REPORTS how many occurrences changed — zero matches is reported as a FAILURE to match, never as a quiet success, because a text edit that silently does nothing is worse than one that visibly fails. A whole-body rewrite is destructive: call it without confirm first to get the character count, then confirm:true + confirmCells. Both are index-free by design — an agent cannot reliably compute Google’s character offsets, and a wrong offset deletes the wrong sentence.

ParametersJSON Schema
NameRequiredDescriptionDefault
docUrlNoa Google Docs URL — the id is extracted from it
confirmNo
rewriteNoreplace the WHOLE body with this text ("" empties the doc)
documentIdNothe document id (from create_doc, or list_drive_files for one the user picked)
confirmCellsNoecho back the character count the unconfirmed call reported (rewrite only)
replacementsNofind/replace pairs, applied in order

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
noteNo
textNo
titleNo
verifiedNo
documentIdNo
occurrencesNo
replacementsNo
replacedCharsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds critical behavioral context: find/replace reports occurrence counts, zero matches is a hard failure rather than silent success, whole-body rewrite requires a two-step confirm, and the index-free design rationale. It goes far beyond the structured annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries operational weight. It is front-loaded with the core verb and resource, structured clearly into two shapes, and incorporates failure semantics and destructive-safety instructions without redundancy. The length is justified by the tool's complexity.

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 two-mode complexity, destructive rewrite behavior, and confirmation requirement, the description covers all necessary context: return reporting, failure conditions, prerequisites, and safety flows. With an output schema present, return details need no further explanation. This is complete for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 83% (only 'confirm' lacks a schema description), the description substantially enriches all parameters: replacements must match exact text, matchCase semantics, rewrite replaces the entire body, confirmCells echoes the character count, and the design avoids index-based offsets. It compensates fully for the one undocumented parameter and adds meaning well beyond bare schema fields.

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 'EDIT a Google Doc' – a specific verb and resource – and immediately distinguishes itself from the sibling append_to_doc ('the correction append_to_doc cannot make'). It clearly delineates two operational modes (find/replace and full rewrite), leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly contrasts with append_to_doc, naming the alternative for when to use this tool vs. the sibling. Provides concrete prerequisites ('call read_doc first and match the text EXACTLY'), a mandatory destructive-confirm workflow, and a fail-fast condition (zero matches reported as failure). This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_drive_fileRename / move / trash a Drive fileA
Idempotent
Inspect

Update a Drive file: rename (name), move it into a folder (moveToFolderId, optionally removeFromFolderId to move OUT of the old one), or trash / untrash it (trash:true|false). Pass fileId (from list_drive_files). To delete permanently, use delete_drive_file.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNonew name
trashNotrue → move to Trash; false → restore from Trash
fileIdYesthe Drive file id
moveToFolderIdNofolder id to move the file into (from create_drive_folder / list_drive_files)
removeFromFolderIdNothe old parent folder id to remove (when moving)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
trashedNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and destructiveHint=false, which align with the update operations. The description adds useful behavioral context beyond the schema by explaining how removeFromFolderId moves out of the old folder and how trash:true|false toggles the trash state. This clarifies non-obvious behavior.

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 concise, three sentences, with no redundant information. It front-loads the primary operations and effectively uses formatting (parameter names in parentheses) to aid scanning.

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?

The description covers all operations, specifies the source of fileId, and points to the alternative tool for permanent deletion. Since an output schema is present, the description needn't detail return values. It is complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the schema covers all 5 parameters with descriptions, the tool description groups parameters into meaningful operations and explains the relationship between moveToFolderId and removeFromFolderId. It also clarifies the trash parameter semantics ('true → move to Trash; false → restore') beyond the schema's individual descriptions.

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 explicitly states 'Update a Drive file: rename (name), move it into a folder (moveToFolderId, optionally removeFromFolderId to move OUT of the old one), or trash / untrash it (trash:true|false)'. This clearly enumerates the tool's operations and differentiates it from siblings like delete_drive_file and list_drive_files.

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?

The description provides explicit guidance by saying 'To delete permanently, use delete_drive_file' and indirectly specifies when to use this tool (for rename, move, trash/untrash). It also mentions 'Pass fileId (from list_drive_files)', giving usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_meta_objectEdit a Meta campaign / ad set / adA
Idempotent
Inspect

Update an EXISTING campaign, ad set, or ad — rename, change its daily budget, retarget (ad sets), or change status (PAUSED / ACTIVE / ARCHIVED). Pass objectId (from list_meta_ads) + adAccountId. Setting something ACTIVE can start REAL AD SPEND — show the user what will run + its budget, get a yes, then pass confirm:true. Pausing and renaming are always safe and always reversible. ARCHIVING IS NOT: Meta treats an archived object as DELETED and refuses to bring it back — every later edit answers "This campaign has been deleted, so you can only edit the name" (measured live 2026-08-05), archiving a campaign takes its ad sets and ads down with it, and the only way back is to duplicate it as a new object. Use PAUSED unless the user has said they are finished with it for good.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNonew name
statusNoACTIVE starts spend (needs confirm:true); PAUSED / ARCHIVED are safe
confirmNoREQUIRED true ONLY to set status ACTIVE (real spend)
objectIdYesthe campaign / ad set / ad id (from list_meta_ads)
targetingNoreplacement targeting spec (ad sets) — a Meta targeting object
adAccountIdYesad account id (for auth + scope)
dailyBudgetUsdNonew daily budget in USD (1–10000; ad-set or campaign level)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
updatedNo
objectIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations by disclosing that ACTIVE starts real ad spend, ARCHIVING is effectively irreversible and cascades deletion, and pausing/renaming are reversible. It includes a measured live failure mode and explicitly warns to prefer PAUSED. This is exactly the behavioral nuance the annotations don't convey.

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 dense but every sentence earns its place. It is front-loaded with the main purpose, then delivers critical safety warnings about real spend and irreversible archiving. Length is justified by the high-stakes nature of the operations.

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 tool with 7 parameters, nested targeting, and real-world consequences, the description is exceptionally complete. It covers required IDs, confirmation workflow, budget limits, irreversible deletion behavior, and the user decision process. An output schema exists, so return values need not be described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds substantial meaning: objectId source from list_meta_ads, confirm required only for ACTIVE, daily budget range (1–10000), targeting specifically for ad sets, and the irreversible semantics of ARCHIVED. This significantly enhances schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates an EXISTING campaign, ad set, or ad, listing concrete operations: rename, daily budget, retarget (ad sets), and status. This distinguishes it from create/delete siblings by emphasizing 'EXISTING' and by specifying the exact object types and editable fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides strong usage context: pass objectId from list_meta_ads and adAccountId, and requires confirm:true for ACTIVE status. It implies when to use (updating existing objects) and gives a clear when-not for ARCHIVED, but it does not explicitly contrast with alternatives like set_meta_campaign_status or create_meta_campaign.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_onedrive_fileRename / move a OneDrive fileA
Idempotent
Inspect

Update a OneDrive item: rename (name) and/or move it into a folder (moveToFolderId). Pass fileId (from list_onedrive_files). To remove an item, use delete_onedrive_file.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNonew name
fileIdYesthe OneDrive item id
moveToFolderIdNofolder id to move the item into (from create_onedrive_folder / list_onedrive_files)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false (mutation), destructiveHint=false (not destructive), and idempotentHint=true. The description adds minimal behavioral context: the source of fileId and the alternative to delete. It does not disclose potential side effects like overwriting existing names or permission requirements. Given annotations cover the safety profile, the additional info is useful but not extensive, so a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loaded with the core action and parameters. Every word earns its place: the first sentence states the operations and relevant parameters, the second gives a source and an explicit alternative. No fluff.

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 rename/move tool with 100% schema coverage, an output schema, and annotations covering safety, the description is adequate. It covers the key operations, required parameter, and a path to the delete alternative. It does not mention edge cases like rename conflicts or permissions, but such details are likely beyond the scope of a concise MCP tool description.

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 each parameter described. The description repeats the parameter names and adds minimal extra meaning: the 'and/or' combination and the source of fileId (which schema lacked for fileId). It does not clarify that at least one optional parameter should be provided, but the schema already makes them optional. Overall, it adds marginal value 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?

The description clearly states the tool's purpose: renaming and/or moving a OneDrive item. It uses specific verbs ('rename', 'move') and identifies the target resource ('OneDrive item'). It also distinguishes itself from the delete operation by explicitly referencing delete_onedrive_file, and implies distinction from list/get tools.

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 provides explicit context on when to use the tool (to rename/move) and an explicit alternative ('To remove an item, use delete_onedrive_file'). It also instructs to pass fileId from list_onedrive_files, serving as a prerequisite. However, it does not explicitly exclude other operations like content updates or conversions, but the purpose is clear enough for typical use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_openai_ads_objectEdit a ChatGPT Ads campaign / ad group / adA
Idempotent
Inspect

EDIT an existing ChatGPT Ads object in place — rename it, change a campaign’s budget or geo targeting, rewrite an ad group’s context hints or bid, or replace an ad’s title, body, landing page or image. Pass level:"campaign" + campaignId, level:"adGroup" + adGroupId, or level:"ad" + adId. Only the fields you pass are changed, but note that context hints, bidding and the creative are REPLACED WHOLESALE rather than merged, so send the complete list. Changing the budget, the bid or the creative of a LIVE (active) object changes what real money buys immediately — show the user the old and new values, get an explicit yes, then pass confirm:true. The object is READ BACK after the change.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdNo
nameNo
levelNoinferred from which id you pass
maxBidNo
confirmNoREQUIRED true to change budget / bid / creative on a LIVE object
endTimeNo
creativeNoREPLACES the ad’s creative (text + image card only)
adGroupIdNo
countriesNo
campaignIdNo
dailyBudgetNo
descriptionNo
locationIdsNo
billingEventNorequired alongside maxBid — bidding is replaced wholesale
contextHintsNoREPLACES the existing list
lifetimeBudgetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
okNo
noteNo
levelNo
objectNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses critical behaviors beyond the annotations: context hints, bidding, and creative are replaced wholesale rather than merged; live-object changes take effect immediately on real spend and require explicit user confirmation; and the object is read back after the change. These add significant value over the schema and 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?

The description is dense but every sentence serves a purpose: primary action, object selection, replacement behavior, and safety confirmation. It is well-structured with the verb first and proceeds logically through invocation to caveats.

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?

The description covers the essential behavioral, safety, and semantic aspects for a complex tool with 16 parameters and nested creative object. It accounts for wholesale replacement, confirmation, and read-back, and the output schema presumably documents the return. It is sufficiently complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains the level/id pattern, the wholesale replacement semantics for contextHints, billingEvent+maxBid, and creative, and the confirm:true requirement. It also covers geo targeting and budget changes at a high level. However, it does not detail every parameter (e.g., locationIds format), though the schema's descriptions and field names cover many basics.

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 'EDIT an existing ChatGPT Ads object in place' which clearly identifies the action and resource. It enumerates the object types (campaign/ad group/ad) and distinguishes this update tool from create/set siblings. The scope is specific and unambiguous.

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 provides clear context on when to use this tool: to edit any existing ChatGPT Ads object by passing the appropriate level and ID. It includes instructions on field-level changes and the confirm:true flow for live objects, but it does not explicitly name sibling tools like set_openai_ads_budget as alternatives for specific single-purpose changes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_pinterest_boardRename or re-privacy a Pinterest boardA
Idempotent
Inspect

Rename a board, rewrite its description, or change its privacy. ⚠️ SETTING A BOARD TO SECRET HIDES EVERY PIN ON IT from everyone but this account — nothing errors and nothing is deleted, the Pins simply stop being public, which is the Pinterest flavour of a post that looks published and is not. Say so and get a yes before doing it; it IS reversible (set PUBLIC again), and the read-back reports how many Pins were hidden. Pinterest accepts only PUBLIC or SECRET on an update: PROTECTED can be chosen when a board is created and can never be set afterwards, so that is refused by name rather than sent and rejected. 0 credits. Needs Pinterest connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
boardIdYesnumeric board id from list_pinterest_boards
privacyNoSECRET hides every Pin on the board from everyone but this account
descriptionNomax 500 characters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
nameNo
noteNo
boardIdNo
changedNo
privacyNo
descriptionNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses significant behavioral traits beyond the annotations: hiding pins when set to SECRET, reversibility, read-back reporting hidden pin counts, and the refusal of PROTECTED by name rather than sending an invalid value. This goes well beyond the readOnlyHint/destructiveHint annotations, which are not contradicted.

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 a dense paragraph but every sentence adds value, covering purpose, warnings, reversibility, edge cases, cost, and prerequisites. While slightly long, the complexity of the privacy behavior justifies the length. The warning is front-loaded and clear.

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 mutation tool with non-obvious side effects, this description is complete. It covers return behavior (read-back pin count), prerequisites (Pinterest connected), cost (0 credits), and edge cases (PROTECTED). The output schema exists, so detailed return format is not required here, but the description still mentions the key output.

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 input schema already documents boardId and privacy, with privacy noting that SECRET hides pins. The description adds crucial nuance: it explains the PUBLIC/SECRET enum limitation, the special refusal of PROTECTED, and the read-back behavior for hidden pins. This meaningfully extends the schema's parameter descriptions, even though name lacks schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's functions: 'Rename a board, rewrite its description, or change its privacy.' It uses specific verbs and a resource (Pinterest board), and distinguishes itself from sibling tools like update_pinterest_pin and create_pinterest_board by focusing on existing board metadata updates.

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 provides strong context for when to use this tool, including the critical exception that PROTECTED cannot be set on update and must be chosen at creation. It also instructs the agent to get explicit user confirmation before setting a board to SECRET. However, it does not explicitly name alternative tools (e.g., create_pinterest_board) for creating boards with PROTECTED privacy, so it misses the full 'when-not' guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_pinterest_pinEdit a published PinA
Idempotent
Inspect

Edit a published Pin — its title, description, destination link, alt text, or which board it sits on. Only send the fields that should change. TWO LIMITS TO STATE BEFORE OFFERING THIS. (1) Pinterest marks its Update Pin endpoint "currently in beta and not available to all apps" in its own API description, so it may be refused outright whatever the account’s scopes or access tier — reconnecting cannot change that. If it is refused, save_pinterest_pin gets the Pin onto another board (generally available) and changing the wording means deleting and re-pinning. (2) A published Pin’s IMAGE or VIDEO can never be changed by anyone: Pinterest’s update model has no media field at all, so swapping the creative means delete and re-pin, which loses the Pin’s accumulated saves. The values reported back are what Pinterest STORED, not what was sent. 0 credits. Needs Pinterest connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
linkNodestination URL, max 2048
pinIdYesnumeric Pin id from list_pinterest_pins
titleNomax 100 characters
altTextNoaccessibility alt text, max 500
boardIdNomove the Pin to this board
descriptionNomax 800 characters — the text Pinterest search reads
boardSectionIdNosection within the board

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
linkNo
noteNo
pinIdNo
titleNo
altTextNo
boardIdNo
changedNo
descriptionNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description adds crucial behavioral details: the Pinterest endpoint may be refused even with valid scopes, media cannot be changed, the response reports stored values not sent values, and re-pinning loses accumulated saves. These are exactly the kind of non-obvious runtime behaviors the agent needs to know. 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?

The description is longer than typical but every sentence earns its place given the tool's caveats. It is front-loaded with a clear one-line summary, then uses numbered limits for the critical constraints, making it scannable. The all-caps header 'TWO LIMITS TO STATE BEFORE OFFERING THIS' is slightly shouty but effectively highlights urgency.

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?

The description covers prerequisites ('Needs Pinterest connected'), credit cost ('0 credits'), beta/access limitations, immutable media, response semantics, and alternatives. Given the tool's complexity and that an output schema exists, this is a fully contextual description. There is no missing information that an agent would need to invoke it correctly.

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 adds the important partial-update semantic ('Only send the fields that should change') and maps fields like 'board it sits on' to the boardId/boardSectionId params. It does not add per-parameter format details, but the schema already provides those, so this is a meaningful enhancement above 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?

The description clearly states the tool's action ('Edit') and resource ('a published Pin'), and enumerates the mutable fields (title, description, destination link, alt text, board). It distinguishes itself from siblings like save_pinterest_pin and delete_pinterest_pin by explicitly scoping the operation to editing an existing Pin.

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?

The description provides explicit when-to-use guidance including 'Only send the fields that should change' and lists two concrete limits with alternatives. It names save_pinterest_pin as an alternative for moving Pins and describes delete/re-pin for wording or media changes, giving the agent clear direction on when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_reddit_ads_adEdit a Reddit adA
Idempotent
Inspect

Rename a Reddit ad, point it at a different post, or change its click url. Does not activate or pause it — use set_reddit_ads_status. Swapping the post changes what people see, so confirm the new creative with the user first. The result is read back from Reddit.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdYes
nameNo
postIdNopromote a different post
clickUrlNopass an empty string to clear it
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
noteNo
statusNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and idempotentHint=true, and the description adds valuable context: it clarifies that swapping posts 'changes what people see' and emphasizes confirming with the user. 'The result is read back from Reddit' sets expectations about response verification. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the primary purpose. Each sentence earns its place: first lists editable fields, second excludes status changes and names the alternative, third adds the user-confirmation caveat and result verification. No wasted words.

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 output schema exists and the sibling set is large, the description covers the core functionality, notes side effects (visible creative change), provides a usage caveat, and clarifies the return behavior. It is fully adequate for an agent to select and invoke this tool correctly without needing more detail.

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 only 40% (postId and clickUrl have descriptions). The description compensates by explaining that 'rename' corresponds to the name parameter, 'point at a different post' to postId, and 'change its click url' to clickUrl. It does not explicitly cover adId or adAccountId, but adId is a required identifier and adAccountId is likely contextual, so the description adds enough meaning beyond the sparse 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?

The description clearly states the tool's function: 'Rename a Reddit ad, point it at a different post, or change its click url.' It uses specific verbs and resources, and differentiates from sibling tools by explicitly excluding activation/pause actions.

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 what it does NOT do: 'Does not activate or pause it — use set_reddit_ads_status.' This names the alternative tool for status changes. Also advises confirming the new creative with the user before swapping posts, providing practical usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_reddit_ads_ad_groupEdit a Reddit ad groupA
Idempotent
Inspect

Change an existing Reddit ad group’s name, budget, goal type, bid, schedule dates or targeting. Budget and bid are ordinary amounts in the ad account’s currency. Targeting MERGES KEY BY KEY — measured live 2026-08-05, and it is NOT a wholesale replace: a key you send replaces that whole list, a key you LEAVE OUT is kept exactly as it was, and an explicit empty array (geolocations: []) is the only way to clear one. So passing just {communities:[…]} does NOT drop an existing geo or interest filter on an ad group that holds the budget — name every key you want gone. This does NOT activate or pause anything; use set_reddit_ads_status for that. The result is read back from Reddit.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
budgetNo
bidTypeNo
endTimeNo
goalTypeNo
scheduleNo
adGroupIdYes
bidAmountNo
startTimeNo
targetingNosame shape as create_reddit_ads_ad_group — REPLACES the existing targeting
adAccountIdNo
bidStrategyNo
savedAudienceIdNopoint this ad group at a saved audience instead

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
noteNo
budgetNo
statusNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false, openWorldHint=true, idempotentHint=true. The description adds substantial behavior: targeting MERGES KEY BY KEY, empty array clears, omissions preserve, and results are read back from Reddit. It also clarifies no pause/activate side effect. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense with critical information. It front-loads the purpose and then details the tricky merge behavior and exclusions. Some CAPS and redundancy ('name every key you want gone') add emphasis but are arguably necessary for a high-risk update. Every sentence contributes value.

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?

Given the tool's complexity (13 params, nested targeting object, no output schema), the description covers the main pitfalls: merge semantics, non-activation, and read-back behavior. It doesn't explain every parameter, but the schema and sibling references fill gaps. Annotations are present, so the safety profile is partially covered.

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 low (15%), but the description enriches key parameters: budget/bid are 'ordinary amounts in the ad account’s currency,' and targeting semantics are explained deeply with a concrete example. It does not cover bidStrategy, savedAudienceId, or schedule structure, but the most non-obvious parameters are addressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Change an existing Reddit ad group’s name, budget, goal type, bid, schedule dates or targeting.' This is a specific verb+resource with explicit scope, and it distinguishes itself from sibling tools like create_reddit_ads_ad_group (existing vs new) and set_reddit_ads_status (does not activate/pause).

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 provides clear context on what the tool can update and explicitly warns what it does NOT do: 'This does NOT activate or pause anything; use set_reddit_ads_status for that.' It also points to create_reddit_ads_ad_group for targeting shape. However, it doesn't explicitly state when to use this tool over create_reddit_ads_ad_group or other update tools, though 'existing' implies it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_reddit_ads_audience_usersAdd or remove people in a Reddit custom audienceAInspect

Add people to, or remove people from, a Reddit custom audience. Pass ordinary email addresses and/or mobile advertising ids — each one is canonicalised the way Reddit specifies and SHA-256 hashed on our server before it is sent, so raw customer data never reaches Reddit, and an identifier you already hashed is passed through untouched. Up to 2,500 rows per call; send bigger lists as repeated calls and the audience accumulates. EVERY ROW MUST CARRY THE SAME FIELDS: Reddit’s upload is positional, so if some rows have an email and others do not, the values shift into the wrong column and match nobody — split those into separate calls instead. After Reddit accepts the upload the size does not move for up to 4 hours and processing can take 36, so never re-send the same batch because the count looks unchanged. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
usersYesup to 2,500 rows; every row must carry the same fields
actionNodefault ADD
adAccountIdNo
customAudienceIdYesfrom create_reddit_ads_audience or list_reddit_ads_audiences

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
noteNo
rowsNo
actionNo
sizeUpperNo
customAudienceIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses rich behavioral details beyond the annotations: server-side canonicalisation and SHA-256 hashing, raw data never reaching Reddit, pass-through of already-hashed identifiers, the 2,500-row limit, how the audience accumulates across calls, the positional upload issue, and the 4-to-36-hour processing delay with a warning not to re-send batches. The annotations only state readOnlyHint=false and openWorldHint=true, so this description carries the full burden and exceeds 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 description is appropriately sized for the operation's complexity. Every sentence earns its place: purpose, hashing, limits, positional-matching warning, processing delay, and re-send warning. It is front-loaded with the primary action and then provides structured caveats. No filler or redundant 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?

The description is complete for a complex mutation tool. It covers the purpose, parameters semantics, batch limits, data transformation, processing time, and anti-patterns. An output schema exists, so the absence of return-value discussion is acceptable per the rubric. The annotations are minimal, so the description compensates fully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, but the description adds significant meaning beyond the schema. It explains the users parameter in detail: ordinary email addresses and mobile advertising ids, canonicalisation, hashing behavior, and the requirement that every row carries the same fields due to positional upload. It also clarifies the action parameter by stating the tool adds or removes people. This goes well beyond the schema's brief property descriptions.

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 specific verb+resource: 'Add people to, or remove people from, a Reddit custom audience.' This clearly distinguishes the tool from siblings like create_reddit_ads_audience, which creates a new audience, while this updates an existing one's membership. The title reinforces the same clear purpose.

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?

The description provides explicit usage guidance: it states the maximum batch size (2,500 rows), recommends repeated calls for larger lists, and explains the positional upload requirement that rows must carry the same fields. It also explicitly instructs to 'split those into separate calls instead' when mixing fields, giving clear when-not guidance. While it doesn't name alternative tools, the instructions are specific and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_reddit_ads_campaignEdit a Reddit campaignA
Idempotent
Inspect

Change an existing Reddit campaign’s name, spend cap, budget, goal type or flight dates. Amounts are ordinary numbers in the ad account’s currency. This does NOT activate, pause or archive anything — use set_reddit_ads_status for that. The result is read back from Reddit before you are told it took.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
budgetNo
endTimeNo
goalTypeNo
spendCapNolifetime spend ceiling in the ad account’s currency
startTimeNo
campaignIdYes
adAccountIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
noteNo
statusNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare idempotentHint=true and readOnlyHint=false, but the description adds valuable context: the tool does not activate/pause/archive, and it 'reads back from Reddit' before confirming. This goes beyond the structured hints, though it omits potential details like required permissions or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences: the first states the primary actions, the second clarifies currency, and the third lists exclusions and an alternative. Every sentence earns its place with no redundancy or fluff.

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?

Given the 8 parameters and the available output schema, the description covers the tool's purpose, exclusions, currency semantics, and verification behavior. It is complete for most use cases, though it does not mention prerequisites like ad account access or permission requirements.

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 schema has only 13% description coverage, but the description compensates by clarifying that parameters like name, spendCap, budget, goalType, and flight dates are used, and by stating amounts are 'ordinary numbers in the ad account’s currency.' It does not detail formats for startTime/endTime or explain the goalType enum, but the schema provides the enum.

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 uses a specific verb 'Change' with a clear resource ('existing Reddit campaign') and enumerates the editable fields ('name, spend cap, budget, goal type or flight dates'). It also distinguishes itself from related tools like 'set_reddit_ads_status' and 'create_reddit_ads_campaign' by explicitly noting it does not activate/pause/archive and by saying 'existing'.

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?

The description explicitly states when to use the tool (to change specific campaign attributes) and when not to use it ('does NOT activate, pause or archive anything'), directly pointing to 'set_reddit_ads_status' as the alternative. This is clear usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_reddit_ads_postTurn comments on or off on a Reddit ad postA
Idempotent
Inspect

Turn comments ON or OFF on an existing Reddit ad post. THAT IS THE ONLY EDIT REDDIT ALLOWS: its post-update schema permits exactly one field, allow_comments, and REQUIRES it — headline and body both answer “Additional fields not permitted” once a post is published (measured live 2026-08-05). So a copy change is not an edit at all: create a new post with create_reddit_ads_post and point the ad at it with update_reddit_ads_ad, or fix the wording in Reddit’s Ads Manager. Never promise to reword a live post. A REDDIT AD POST CANNOT BE REMOVED THROUGH THE API AT ALL: Reddit publishes no delete endpoint for one and its update schema has no status, archived or deleted field (re-checked against Reddit’s own reference on 2026-08-05), so creating one is a one-way door and the only way to take it down is Reddit’s Ads Manager. Say that plainly rather than offering to delete it. Turning comments off is publicly visible on a post people may already be replying to, so confirm it with the user first.

ParametersJSON Schema
NameRequiredDescriptionDefault
postIdYesthe post id (t3_…)
adAccountIdNo
allowCommentsYesREQUIRED — Reddit demands allow_comments on every post update, and it is the only field it permits

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
noteNo
headlineNo
allowCommentsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate a non-read-only, idempotent operation, and the description adds substantial behavioral context beyond that: the API's single-field requirement, the one-way door of creation, the impossibility of deletion, and the public visibility of toggling comments. No contradiction with annotations exists.

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 information-dense; every sentence contributes critical caveats and usage guidance. It is somewhat verbose (with measured dates and repeated emphasis), but this is justified given the tool's restrictions. Could be tightened modestly but remains efficient.

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 and the existence of an output schema, the description is highly complete. It covers purpose, constraints, alternatives, deletion impossibility, and user-confirmation needs. No critical behavioral information is missing, making it fully actionable for an agent.

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 67% (adAccountId lacks a description), but the description significantly clarifies the critical parameter allowComments, explaining that it is required and the only permitted field. postId's schema description is adequate. The description adds value beyond the schema, though adAccountId remains underspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Turn comments ON or OFF on an existing Reddit ad post.' It distinguishes from siblings by specifying that this is the only edit Reddit allows, and explicitly references alternatives like create_reddit_ads_post and update_reddit_ads_ad.

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?

The description provides explicit when-to-use guidance: toggling comments on/off. It also states when not to use it: for copy changes ('a copy change is not an edit at all') and for deletion ('cannot be removed through the API at all'), with clear alternatives (create a new post, use Ads Manager) and a user-confirmation requirement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_reddit_ads_saved_audienceEdit a Reddit saved audienceA
Idempotent
Inspect

Rename a Reddit saved audience or replace its targeting. Targeting MERGES KEY BY KEY — measured live 2026-08-05, not a wholesale replace: a key you send replaces that whole list, a key you LEAVE OUT is kept as it was, and an explicit empty array (geolocations: []) is the only way to clear one — so name every key you want gone. Editing one that live ad groups already use re-targets all of them immediately, so say how many are affected and get a yes before changing targeting on a running account. The result is read back from Reddit.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
targetingNoREPLACES the existing targeting
adAccountIdNo
savedAudienceIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
noteNo
statusNo
activeAdGroupsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond annotations by detailing the key-by-key merge behavior, the empty-array clearing mechanism, and the live re-targeting consequence. It even corrects the schema's misleading 'REPLACES the existing targeting' description, which is critical for correct invocation. No contradiction with annotations (readOnlyHint=false) exists.

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 front-loaded with the core purpose and then delivers the complex merge semantics in a compact, structured way. Every sentence contributes critical information: the rename/replace purpose, merge behavior, live re-targeting warning, and read-back confirmation. The 'measured live' note adds credibility without unnecessary bulk.

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 tool with a nested targeting object and potentially destructive live implications, the description covers the central behavioral nuance, the danger to running ad groups, and the return behavior. The existence of an output schema means explicit return-format details are unnecessary, and the description is complete for a tool of this complexity.

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 schema only describes the targeting parameter, and that description is inaccurate. The tool description compensates by explaining exactly how targeting merges and how to clear a key, which is essential for using that parameter correctly. The other parameters (name, adAccountId, savedAudienceId) are not elaborated but are self-explanatory from their names and the required field.

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 'Rename a Reddit saved audience or replace its targeting,' which is a specific verb+resource statement that clearly identifies the tool's function. It is distinct from sibling tools like create_reddit_ads_saved_audience and delete_reddit_ads_saved_audience, and clarifies that this is an update operation on a saved audience.

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 provides clear context for when to use caution, warning that editing an audience used by live ad groups re-targets them immediately and advising to confirm the number affected before proceeding. It does not explicitly name alternative tools (e.g., create vs. update), but the usage context is clear enough for an agent to know when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_settingsChange app settingsA
Idempotent
Inspect

Change this account's app settings. language = the language EVERY ad, script, plan and answer is written in from now on (say the language in plain English, e.g. "German", "Japanese", "Brazilian Portuguese") — it applies to renders made over MCP as well as in the app. theme = the app's appearance, "dark" or "light". watchEmail = the weekly competitor-watch email on/off. Only pass what you are changing. Account-wide (every brand), and it takes effect on the next call.

ParametersJSON Schema
NameRequiredDescriptionDefault
themeNoapp appearance
languageNolanguage for generated ads, copy and answers — e.g. "English", "German", "Japanese"
watchEmailNoweekly competitor-watch email on/off

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
themeNo
changedNo
languageNo
notificationsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (which only indicate idempotency and non-destructiveness), the description discloses that language affects every generated ad, script, plan, and answer, applies to MCP renders and the app, and that changes take effect on the next call. This is rich, behavior-relevant information with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently organized with clear parameter assignments and no filler. Each sentence adds value, and the 'Only pass what you are changing' note is a useful, concise guideline.

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 simple three-parameter tool, an output schema, and rich annotations, the description fully covers the necessary context: scope, effect timing, parameter semantics, and usage tips. Nothing important is missing for an agent to invoke this correctly.

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 description goes further by clarifying the language parameter's plain-English format, the theme's enum values, and watchEmail's weekly email context. It also instructs to pass only changed parameters, adding practical usage semantics 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?

The description clearly states the tool's purpose: 'Change this account's app settings' with a specific verb and resource. It enumerates the exact settings (language, theme, watchEmail) and explicitly notes the account-wide scope, distinguishing it from get_settings and platform-specific set_* tools.

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 provides clear context on how to use the tool: 'Only pass what you are changing' and notes the effect applies account-wide and on the next call. It does not explicitly mention alternatives like get_settings for reading, but the change-focused title and description make the usage context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_sheetWrite to a range in a Google SheetA
DestructiveIdempotent
Inspect

CORRECT cells in a Google Sheet — write values to an exact range, overwriting whatever is there. This is the fix append_to_sheet cannot make: appending only ever adds rows at the bottom, so without this a wrong number stays wrong forever and the only "correction" is a second row contradicting the first. Pass range (e.g. "B2:C5", or "Q3 Report!B2" to name a tab — list_sheet_tabs gives the names) and values as an array of row arrays; an anchor cell like "B2" is fine and the block is written down and right from it. Writing into EMPTY cells goes straight through. Writing OVER cells that already hold values is REFUSED first, naming exactly how many filled cells would be overwritten — show the user that, get a yes, then call again with confirm:true. The result is READ BACK from the sheet, so what you report is what the sheet now holds rather than what Google accepted.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoA1 range or anchor cell, e.g. "B2:C5", "B2", or "Q3 Report!B2" (default A1)
valuesNoarray of row arrays to write
confirmNorequired only when the target range already holds values
updatesNowrite SEVERAL disjoint ranges in one call, instead of range+values
sheetUrlNo
spreadsheetIdNo
valueInputOptionNoUSER_ENTERED (default) parses formulas, dates and numbers the way typing them would; RAW stores every value as literal text

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
urlNo
noteNo
valuesNo
updatedNo
verifiedNo
overwroteNo
spreadsheetIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond the annotations: it explains that writing into empty cells succeeds, writing over filled cells is refused with a count of affected cells, and confirm:true is required for overwrite. It also discloses that results are read back from the sheet, so the agent knows the return reflects actual sheet state.

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?

Although the description is long, every sentence earns its place: it starts with the core purpose, contrasts with append_to_sheet, explains range/value syntax with examples, details the overwrite refusal flow, and notes the read-back behavior. The structure is front-loaded with the most critical information and is dense but not wasteful.

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?

The description is complete for an agent to select and invoke the tool: it covers the main use case, parameters, the confirmation protocol for destructive writes, how to address named tabs, and the return semantics. The presence of an output schema means the description doesn't need to detail return fields, and it doesn't.

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 schema already covers range, values, confirm, updates, and valueInputOption, but the description adds meaningful semantics: anchor cell behavior ('block is written down and right from it'), the exact form of the range (including named tabs), and the conditional requirement for confirm. It doesn't mention updates or valueInputOption, but those are already well-described in 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?

The description opens with 'CORRECT cells in a Google Sheet — write values to an exact range, overwriting whatever is there,' which clearly identifies the action (writing/correcting) and resource (Google Sheet range). It explicitly distinguishes itself from append_to_sheet, making its unique purpose 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?

The description explicitly states when to use this tool by contrasting it with append_to_sheet, noting that append only adds rows and cannot fix a wrong value. It also gives concrete usage guidance, such as using list_sheet_tabs to get tab names, and explains the confirmation workflow for overwriting non-empty cells.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_x_ads_campaignChange an X campaign budget or settingsAInspect

Change a LIVE X campaign — budget, name, delivery pacing. THIS IS HOW YOU THROTTLE OR RAISE SPEND on a running campaign without rebuilding it, and lowering dailyBudget is the fastest way to slow money down short of pausing. Budgets are in the ad account's own currency. Only fields X actually applies are offered: startTime/endTime are DEPRECATED on an X campaign (its schedule lives on the LINE ITEM — use update_x_ads_line_item) and frequency capping needs an X account feature we cannot enable, so both are refused BY NAME with the reason instead of being sent and silently ignored. THE READ-BACK IS A DIFF against the before-state: a field X did not move is reported as REFUSED, never counted as applied. Print the returned note verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
accountIdYes
campaignIdYesfrom list_x_ads_campaigns
dailyBudgetNoin the ad account's currency
totalBudgetNo
standardDeliveryNofalse = accelerated: spend the budget as fast as the auction allows
purchaseOrderNumberNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
statusNo
changedNo
updatedNo
accountIdNo
campaignIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses crucial behavioral traits beyond the sparse openWorldHint annotation: deprecated fields are 'refused BY NAME with the reason' and 'THE READ-BACK IS A DIFF against the before-state: a field X did not move is reported as REFUSED, never counted as applied.' This is rich, actionable context.

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 lengthy but information-dense; every clause adds critical operational detail (budget throttling advice, deprecated fields, read-back semantics). It could benefit from more structured formatting, but it is not padded or wasteful.

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 mutation tool with unusual refusal behavior and diff-based read-back, the description covers all essential aspects: supported fields, handling of unsupported fields, the diff return behavior, and the alternative tool for scheduling. The presence of an output schema eliminates the need to explain return values in prose.

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?

With schema description coverage at only 43%, the description partially compensates by clarifying that budgets are in the ad account's currency, explaining standardDelivery as 'delivery pacing', and listing which fields are actually offered for update. It doesn't cover accountId or purchaseOrderNumber, but adds meaningful operational context for the core 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 explicitly states 'Change a LIVE X campaign — budget, name, delivery pacing' and clearly distinguishes itself from update_x_ads_line_item for schedule changes, making the purpose and scope unambiguous.

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 directly states when to use this tool: 'THIS IS HOW YOU THROTTLE OR RAISE SPEND on a running campaign without rebuilding it' and provides explicit alternatives: 'use update_x_ads_line_item' for schedule changes and notes that frequency capping is refused because the required X account feature is unavailable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_x_ads_line_itemChange an X line item (ad group)AInspect

Change an X line item — BID, bid strategy, SCHEDULE, goal or name. An X campaign's start and end times are deprecated, so the schedule genuinely lives HERE. Lowering bidAmount is also the fix when X refuses a campaign budget with “Bid is too close to Budget”. NOT changeable after creation: objective and productType — X answers 200 and silently keeps the old value (measured), so both are refused BY NAME here and a different objective means a NEW line item. Changing goal also requires bidAmount (X refuses the goal alone) and that is stated up front rather than relayed. A line-item dailyBudget/totalBudget is only legal when the parent campaign is NOT budget-optimised — that is the campaign's setting, so those two are forwarded and X's own refusal names the remedy rather than Hermoso blocking a legal edit. THE READ-BACK IS A DIFF against an independent re-read: a field X accepted but did not move is reported as REFUSED. Print the returned note verbatim.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalNorequires bidAmount too
nameNo
endTimeNo
accountIdYes
bidAmountNoin the ad account's currency
startTimeNoISO 8601
lineItemIdYesfrom list_x_ads_line_items
bidStrategyNo
dailyBudgetNoonly if the campaign is not budget-optimised
totalBudgetNoonly if the campaign is not budget-optimised

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
statusNo
changedNo
updatedNo
accountIdNo
lineItemIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is rich with behavioral details beyond the openWorldHint annotation: X silently keeps old values with a 200 for objective/productType, goal requires bidAmount, dailyBudget/totalBudget are forwarded with X's refusal naming the remedy, and the read-back is a diff that reports non-moved fields as REFUSED. It also instructs to print the returned note verbatim. This fully discloses quirks and edge cases.

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 the core purpose and structured logically, but it is dense and uses ALL CAPS and somewhat convoluted phrasing (e.g., 'that is stated up front rather than relayed'). While every sentence adds value, some could be tightened without loss. It remains concise relative to the tool's complexity, but is not as clean as the calibration high example.

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 (10 parameters, 2 required, multiple enums) and the presence of an output schema, the description is exceptionally complete. It covers why certain fields are refused, when budgets are legal, the read-back diff behavior, and a critical troubleshooting tip. It does not need to describe return values due to the output schema, and it leaves no major contextual gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 60% schema coverage, the description compensates significantly. It explains the role of bidAmount in fixing budget errors, clarifies that goal requires bidAmount, and details the conditions for dailyBudget/totalBudget. It also ties startTime/endTime to the schedule concept, adding meaning beyond the schema's minimal 'ISO 8601' description. The description gives essential context for semantic interpretation.

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 'Change an X line item — BID, bid strategy, SCHEDULE, goal or name,' clearly identifying the tool's purpose and distinguishing it from siblings. It explicitly lists what can and cannot be changed, and contrasts with campaign-level tools by noting that schedule lives here. This is a specific verb+resource+scope statement.

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?

The description provides explicit when-to-use guidance, including a concrete troubleshooting tip ('Lowering bidAmount is also the fix when X refuses a campaign budget...'). It also states what is not changeable (objective, productType) and that a different objective requires a NEW line item, implicitly directing users to create_x_ads_line_item. It further clarifies when dailyBudget/totalBudget are legal, referencing the parent campaign setting.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_youtube_videoUpdate a YouTube video’s title, description, tags or privacyA
Idempotent
Inspect

Edit an existing video on the connected channel: title, description, tags, and/or privacy (unlisted | public | private). THIS IS HOW YOU FLIP AN UNLISTED UPLOAD PUBLIC — post_to_youtube defaults to UNLISTED, and without this there was no way to publish it afterwards. Making a video PUBLIC puts it on the channel where anyone can find it, so show the user exactly what will change and get an explicit yes before calling with privacy:"public". Fields you omit are left untouched. Needs a connected YouTube channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
titleNo≤100 chars
privacyNopublic = live on the channel; confirm with the user first
videoIdYesthe YouTube video id
descriptionNo≤5000 chars

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
titleNo
privacyNo
videoIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal a mutating, idempotent operation (readOnlyHint:false, idempotentHint:true, destructiveHint:false), but the description adds essential behavioral context: making a video public 'puts it on the channel where anyone can find it' and requires 'an explicit yes before calling with privacy:"public".' It also discloses the partial-update semantics ('Fields you omit are left untouched') and the 'Needs a connected YouTube channel' prerequisite, all beyond what annotations provide.

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 compact (about 75 words) and front-loaded: it leads with the exact purpose, then immediately surfaces the most critical workflow (flipping unlisted to public) and the caution about public visibility. Each sentence has a clear operational purpose, and the all-caps emphasis draws attention to the key differentiator without adding excess length.

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 tool with moderate complexity (5 params, partial update, privacy side effects), the description covers all essential aspects: updatable fields, partial-update behavior, the unlisted-to-public workflow, user confirmation for public, and the connected-channel prerequisite. Since an output schema exists to define return values, the absence of return-value detail is acceptable.

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 80%, so the baseline is 3. The description adds meaningful beyond-schema semantics by stating 'Fields you omit are left untouched,' which conveys the PATCH-like partial-update model not visible in the schema. It also ties the privacy enum to the real-world workflow with post_to_youtube, providing operational meaning that helps select correct values.

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 specific verb and resource: 'Edit an existing video on the connected channel: title, description, tags, and/or privacy.' It clearly enumerates the editable fields and distinguishes itself from the sibling post_to_youtube by naming that tool and explaining the complementary workflow.

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 states the key use case: 'THIS IS HOW YOU FLIP AN UNLISTED UPLOAD PUBLIC — post_to_youtube defaults to UNLISTED, and without this there was no way to publish it afterwards.' It names the alternative tool and provides a concrete scenario, which is exactly the level of guidance needed for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upgrade_planUpgrade planA
Read-only
Inspect

Change this account's SUBSCRIPTION plan (admin only). Call with no argument to list the plans (id · monthly price · monthly credits); call again with plan set to a plan id. A NEW subscriber gets a ready-to-pay Stripe Checkout URL to hand your human — THEY pay on Stripe (agents never spend money directly). If the account already has a paid plan, or you're DOWNGRADING, the change is made by a person in the app (Settings → Billing) and the tool returns exactly what to do. Members (read-only billing) get an honest 'ask an admin' message. Nothing is charged until your human pays.

ParametersJSON Schema
NameRequiredDescriptionDefault
planNothe plan id to move to (e.g. pro) — omit to list the available plans first
periodNobilling cadence — monthly (default) or yearly (2 months free)

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNothe ready-to-pay Stripe Checkout URL (checkout mode)
modeNo'checkout' (a Stripe URL was minted) or 'in_app' (a person makes the change in the app)
planNothe target plan id
plansNoavailable paid plans ({id, name, priceUsd, credits}) when listing
actionNothe in-app action required ('upgrade' or 'downgrade')
periodNobilling cadence of the link — 'mo' or 'yr'
guidanceNoexact instructions when the change must be made in the app
chargeUsdNothe actual charge amount (yearly billing charges the annual total)
planLabelNothe target plan display name
monthlyUsdNothe plan’s monthly price in USD
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations by explaining that agents never spend money directly, that a Stripe URL is returned for new subscribers, and that downgrades/existing plans require human action. It clarifies the tool is essentially a coordination step despite the 'Change' verb, which aligns with readOnlyHint=true and openWorldHint=true.

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 moderately long but each sentence carries unique information (admin restriction, list mode, Stripe flow, downgrade path, member message). It is front-loaded with the main purpose and structured in a logical progression. Slightly dense due to multiple clauses, but not wasteful.

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 dual-mode behavior and payment implications, the description covers all necessary aspects: when to use, how to use, outcomes, and constraints. The output schema and annotations cover return values and safety, so the description completes the picture for an agent to invoke this tool correctly without needing additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds essential usage semantics: omitting `plan` lists plans, `plan` takes an id, and `period` is monthly by default with yearly offering '2 months free'. This contextualizes the parameters beyond their schema descriptions and clarifies the call sequence.

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 specific verb+resource ('Change this account's SUBSCRIPTION plan') and adds '(admin only)' to set access context. It clearly distinguishes from sibling tools like buy_credits and billing_status by focusing on plan changes and describing the dual list/change behavior.

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 explains when to call: with no argument to list plans, and with `plan` set to execute. It also provides clear exclusions and alternatives: for existing paid plans or downgrades, directs to manual UI; for members, tells to ask an admin. This is comprehensive and unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_fileUpload a local file → durable public URLAInspect

Persist an ARBITRARY user file (image or video, up to 150MB) into Hermoso and get back a durable public URL that EVERY publish, schedule and ad-build tool accepts — post_to_meta / post_to_linkedin / post_to_linkedin_page / post_to_youtube / post_to_tiktok / post_to_pinterest / post_to_x / post_to_reddit / post_to_google_business / schedule_post / upload_meta_asset / upload_google_ads_asset / create_meta_ad / create_linkedin_ads_creative / set_youtube_thumbnail / save_to_drive / save_to_onedrive. THIS IS THE BRING-YOUR-OWN-CREATIVE PATH: it is for files that have NOTHING to do with a Hermoso render (media on the user's desktop, an agency's finished ad, a photo they shot), and it means you can publish, schedule and run ads through Hermoso without generating anything here. Provide exactly ONE source: path (a local file — works ONLY when Hermoso runs locally over stdio/CLI; the hosted connector can't see the user's machine), or dataUri (a base64 data: URI — keep under ~15MB on the hosted connector). If the file is ALREADY at a public https URL, the Meta, Reddit and ChatGPT-Ads tools take it directly and re-host it safely — but LinkedIn (posts and ad creatives), Pinterest, the YouTube thumbnail and upload_google_ads_asset upload the BYTES themselves and therefore refuse an external host, so run it through here first and pass the URL this returns. When in doubt, use this: its URL works everywhere. Returns {url, kind, bytes}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNooriginal file name — helps pick the right extension
pathNolocal filesystem path (stdio/CLI only — refused on the hosted connector)
dataUriNobase64 data: URI of the file bytes (data:<mime>;base64,<…>)

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
kindNo
bytesNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate a non-read-only, non-idempotent, non-destructive operation. The description adds substantial context: file size limits (150MB, ~15MB for dataUri), path only works on local stdio/CLI and fails on hosted connector, and the returned structure {url, kind, bytes}. It also explains how different downstream tools handle external URLs, which is critical behavioral knowledge for the agent. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite being long, every sentence adds value: purpose, use cases, source selection, external URL handling, integration list, and a decision heuristic. It is front-loaded with the core action and integrates the siblings list naturally. The structured flow from 'what' to 'when' to 'how' keeps it readable despite density.

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 (environment-dependent path, multiple downstream consumers, size limits) and rich schema/output schema, the description covers all key aspects: acceptable inputs, environment restrictions, alternatives, integration points, and return value. No critical gaps remain for an agent to misuse this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema descriptions cover 100% of parameters, the tool description adds the critical constraint 'Provide exactly ONE source' which is not encoded in the schema (no required/min/max). It also clarifies that 'path' works only on local stdio/CLI, and that 'dataUri' should stay under ~15MB on hosted connectors. These are semantic details beyond the raw property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Persist an ARBITRARY user file ... and get back a durable public URL.' It uses a specific verb ('Persist'/'upload'), names the resource ('arbitrary user file'), and explicitly differentiates itself from siblings by calling it 'THE BRING-YOUR-OWN-CREATIVE PATH' and listing which downstream tools accept its URL. This is far more specific than a vague 'upload' placeholder.

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?

The description gives explicit when-to-use guidance: it is for files unrelated to Hermoso renders, and it contrasts with tools that accept external HTTPS URLs directly ('If the file is ALREADY at a public https URL, the Meta, Reddit and ChatGPT-Ads tools take it directly...'). It also provides a fallback rule: 'When in doubt, use this: its URL works everywhere.' This clearly distinguishes it from alternative upload paths.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_google_ads_assetUpload a creative to Google AdsAInspect

Add a creative to a Google Ads account’s ASSET LIBRARY so it can be used in ads. It does NOT have to be a Hermoso render — the user’s own creative is the normal case; the URL just has to be Hermoso-HOSTED because we fetch the bytes, so run any file of theirs through upload_file and pass the URL it returns. For an IMAGE, pass imageUrl (≤5MB); an arbitrary external/CDN URL is refused. For VIDEO, Google Ads uses YouTube-hosted videos — post the video to YouTube as UNLISTED first (post_to_youtube with privacy:"unlisted" — link-only, not public or searchable, and unlike "private" it CAN run as an ad), then pass its youtubeVideoId here. Returns the asset resource name. Pass customerId (from list_google_ads_campaigns).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoasset name
imageUrlNoa Hermoso-hosted image URL for an IMAGE asset (≤5MB) — a Hermoso render, or the user’s OWN creative put through upload_file first. An arbitrary external/CDN URL is refused.
customerIdNo10-digit account id (dashes ok) — omit to use the brand’s selected default account
youtubeVideoIdNoa YouTube video id for a VIDEO asset (post_to_youtube first)
loginCustomerIdNomanager id if operating through an MCC

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
kindNo
assetResourceNameNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate a non-read-only, non-idempotent, non-destructive operation. The description adds meaningful behavioral context beyond annotations: the tool fetches bytes from the provided URL, refuses arbitrary external/CDN URLs, and returns the asset resource name. It also clarifies the YouTube privacy requirements for video assets.

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 moderately sized but every sentence serves a purpose. It leads with the core purpose, then addresses image and video variants, and ends with return value and customerId. The structure is logical and front-loaded, though slightly lengthy due to the necessary detail for two asset types.

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?

Given the tool's complexity (two distinct asset types, prerequisites, and a return value), the description covers the essential context: the hosting requirement, the YouTube UNLISTED workflow, the ≤5MB restriction, and the return of the asset resource name. It does not delve into loginCustomerId details or error handling, but the schema covers those parameters, and an output schema exists.

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 adds value by clarifying the conditional use of imageUrl vs youtubeVideoId (image vs video), the prerequisite workflow for each, and the cross-reference to list_google_ads_campaigns for customerId. This goes beyond the schema's per-parameter descriptions.

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 clearly states the tool's function: 'Add a creative to a Google Ads account’s ASSET LIBRARY so it can be used in ads.' This is a specific verb+resource (upload/asset library). However, it does not explicitly distinguish itself from the sibling tool 'add_google_ads_assets', relying on the word 'upload' and 'asset library' to imply the difference.

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 provides detailed context on when to use this tool and how to prepare inputs: for images it requires a Hermoso-hosted URL (via upload_file), for videos it mandates YouTube UNLISTED privacy (via post_to_youtube). It also references list_google_ads_campaigns for customerId. However, it does not explicitly state when not to use this tool versus alternatives like add_google_ads_assets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_meta_assetUpload an asset to a Meta ad accountAInspect

Upload creative(s) — a finished Hermoso ad OR arbitrary user files (e.g. a folder of media from the user’s desktop) — into a connected ad account’s ASSET LIBRARY so the user or a later ad-build step can use them in their OWN campaigns. Pass url for one file, or urls (up to 20) to BULK-upload in a single call. Each accepts a public https URL, a data: URI, or a Hermoso /generated path; for LOCAL files call upload_file first and pass the url(s) it returns. Image → image hash; video → video id. Pass adAccountId from list_meta_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoa single public https URL / data: URI / /generated path
kindNoinferred from the URL if omitted
nameNoa label for the asset
urlsNoup to 20 media URLs/paths for a one-call BULK upload
adAccountIdYesad account id (digits or act_… — from list_meta_pages)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
hashNo
kindNo
assetsNo
videoIdNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds behavioral context beyond annotations: explains the transformation ('Image → image hash; video → video id'), accepted URL types (public https, data: URI, /generated path), and the bulk limit (up to 20). The annotations already signal write/open-world behavior, but the description enriches the agent's understanding of side effects and return semantics.

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?

Description is dense but well-structured: starts with purpose, then parameter usage, then accepted formats, then prerequisite. Every sentence carries key information; no fluff, though it is longer than the minimal two-sentence ideal.

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 (bulk vs single, multiple file types, prerequisites), the description covers all necessary operational details: when to use alternative tools, accepted inputs, return values, and where to get the required parameter. Output schema exists so return format need not be enumerated.

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 goes further by clarifying the relationship between `url` and `urls` (single vs bulk), the inference of `kind` from URL, and the source of `adAccountId`, providing workflow-level meaning not fully explicit in 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?

Description clearly states specific verb+resource: 'Upload creative(s) ... into a connected ad account's ASSET LIBRARY'. It differentiates from siblings like 'upload_file' and 'upload_google_ads_asset' by specifying Meta ad account asset library context and the end goal of using assets in campaigns.

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 provides when-to-use guidance: for LOCAL files, 'call upload_file first and pass the url(s) it returns'; suggests pulling `adAccountId` from `list_meta_pages`; and distinguishes single vs bulk uploads via `url`/`urls`. This gives clear alternatives and prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upscale_videoUpscale videoAInspect

Upscale a video to higher resolution (2x) for final delivery. Paid render; returns the served URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
videoYesthe source video URL

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawNothe raw job result payload (e.g. images[] for carousel template ads)
urlNothe served URL of the finished media (absent/null while still rendering)
jobIdNothe render job id — poll get_job with this id to resume or inspect
modelNothe product-facing label of the model that rendered it
stillRenderingNotrue when the render is still in progress — keep polling get_job with jobId
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses 'Paid render' (cost implication) and 'returns the served URL' (output format), which are behavioral details not captured in the annotations (all false). It also implies the operation produces a new rendered asset rather than modifying the original, which is useful context. However, it doesn't discuss processing time or side effects.

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 main purpose. The first sentence states what it does, the second covers cost and return value. No redundant or vague wording.

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 one well-documented parameter, explicit mention of cost and output, and the existence of an output schema, the description covers the essential operational details for a straightforward render tool. Minor omissions like whether the source must be an existing hosted video are already implied by the schema's 'URL' description.

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?

The schema fully documents the single parameter 'video' with the description 'the source video URL' (100% coverage). The tool description doesn't add additional parameter-specific guidance, so it stays at 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?

The description uses a specific verb 'Upscale' targeting a video, with explicit details 'to higher resolution (2x)' and 'for final delivery'. This clearly distinguishes it from other video processing tools like clip_video, edit_video, or dub_video.

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?

'for final delivery' provides a clear context for when to use this tool—when a high-resolution version is needed for final output. The mention 'Paid render' implicitly warns about cost, guiding users to reserve it for appropriate moments. It doesn't explicitly name alternatives, but the use case is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

use_brandSwitch brandA
Idempotent
Inspect

Pin which brand this connection acts on (multi-brand accounts). Pass the brand id or exact name from list_brands. Works for a brand on your own account AND for a workspace another account SHARED with you — for a shared one pass its name or the profile id list_brands prints, and access is verified against your real membership before it is pinned. Persists for this API key until changed, on every surface (hosted connector included — no environment variables, no restart).

ParametersJSON Schema
NameRequiredDescriptionDefault
brandYesbrand id (e.g. default / p_xxx), its exact name from list_brands, or the profile id of a workspace shared with you

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNotrue when the brand switch persisted
brandNothe now-active brand ({id, name})
sharedNotrue when the pinned workspace is owned by another account
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond annotations: it states the action persists 'for this API key until changed, on every surface (hosted connector included — no environment variables, no restart)' and that access is 'verified against your real membership' for shared workspaces. This enriches the idempotentHint=true and destructiveHint=false annotations with concrete side-effect and validation details.

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 front-loaded with the core purpose and then provides essential details in a logical sequence (identifier forms, shared-workspace behavior, persistence). Every sentence conveys necessary information with no redundancy, keeping it dense but appropriately sized.

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 single-parameter state-change tool, the description thoroughly covers the parameter's acceptable inputs, the tool's scope (own vs shared workspace), validation behavior, and persistence across surfaces. An output schema exists, so return-value details are not required. It is complete for effective agent use.

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 input schema already fully describes the 'brand' parameter with examples, so baseline is 3. The description adds extra nuance by clarifying the shared-workspace alternative and that membership is verified, enhancing understanding of the parameter's accepted values 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?

The description begins with a specific verb+resource: 'Pin which brand this connection acts on (multi-brand accounts).' This clearly distinguishes use_brand from siblings like list_brands, get_brand, create_brand, and update_brand by stating its unique role of switching the active brand 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?

It provides explicit instructions on what to pass: 'Pass the brand id or exact name from list_brands,' and elaborates on the shared-workspace case with details about using the name or profile id. It also references list_brands as the source of identifiers, effectively complementing it. However, it does not explicitly state when not to use this tool or name direct alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

x_ads_reportX ads performance reportA
Read-only
Inspect

Performance stats for X campaigns, line items or promoted posts. placement here is SINGULAR and comes from a FOUR-value set (ALL_ON_TWITTER / PUBLISHER_NETWORK / SPOTLIGHT / TREND) — deliberately not the twelve placements a line item accepts; do not carry one across. THE TRAP THIS REPORTS: an entity id that does not exist on the account answers 200 with every metric null, which is indistinguishable from a real zero, so an all-null response is FLAGGED rather than narrated as zero performance. Max 20 ids per call. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityNodefault CAMPAIGN
endTimeNoISO 8601; defaults to now
accountIdYes
entityIdsYesmax 20
placementNodefault ALL_ON_TWITTER
startTimeNoISO 8601; defaults to 7 days before endTime
granularityNodefault TOTAL
metricGroupsNodefault ENGAGEMENT

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
rowsNo
countNo
accountIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description explains a critical behavioral trap: nonexistent entity IDs return 200 with all-null metrics, indistinguishable from real zeros, and are flagged rather than narrated. This is valuable context not present in annotations. Also clarifies placement semantics and that the tool 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?

The description is compact and every sentence serves a purpose: purpose, placement trap, null trap, and constraints. The warning about nulls is clearly highlighted with caps, and the length is appropriate for the complexity.

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 description covers the main entities (campaigns, line items, promoted posts) and key constraints, but omits mentioning other supported entities like ACCOUNT, FUNDING_INSTRUMENT, and ORGANIC_TWEET visible in the schema. An output schema exists, so return values are covered. Overall sufficient for selection and invocation.

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 high (88%), so most parameters are already described. The description adds specific meaning to 'placement' by contrasting it with the twelve-placeholder line item field, clarifying the valid enum values. This goes beyond the schema's mere enum listing.

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 'Performance stats for X campaigns, line items or promoted posts,' which clearly identifies the tool as a reporting tool for X ads with specific entity types. It differentiates from sibling report tools (e.g., google_ads_report, meta_insights) by the explicit X ads scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides important usage constraints: the placement parameter is a singular four-value set and warns not to carry over line item placements. It also states 'Max 20 ids per call.' However, it does not explicitly mention alternatives or when not to use this tool in favor of others, leaving room for improvement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

x_mentionsRead who is mentioning you on XA
Read-only
Inspect

Read the posts mentioning the connected X account — who is talking to the brand, in their own words, newest first. Use it to find what deserves a reply (reply with post_to_x + replyToId) and to mine real objections and customer language for ad copy. COSTS CREDITS PER MENTION RETURNED, plus one account lookup — keep maxResults small (default 10) and tell the user the cost before pulling a big page. Needs X connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceIdNoonly return mentions newer than this post id
maxResultsNohow many mentions to pull, 5-100 (default 10) — every one is billed
paginationTokenNonext_token from a previous call, to page further back

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
accountNo
mentionsNo
nextTokenNo
costCreditsNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read nature is known. The description adds important behavior beyond annotations: cost structure (credits per mention plus account lookup), the 'newest first' ordering, and the requirement that X must be connected. It also advises informing the user of cost before large pulls, which is valuable operational context.

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 three sentences that each serve a clear purpose: purpose, use cases, and cost/connection guidance. It is front-loaded with the main purpose and avoids redundancy. The all-caps cost warning is effective and noticeable without being overly disruptive.

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 read tool with an output schema and safe-read annotations, the description covers the essential behavior (what it returns, order, cost), prerequisites (X connected), and operational guidance (keep maxResults small, tell user cost). It also differentiates from sibling mention tools and directly supports follow-up actions, leaving no major gaps.

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 all three parameters are well described in the schema. The description adds meaningful context for maxResults by stating the default (10) and emphasizing that each mention is billed, which helps the agent interpret the parameter's impact. It does not need to repeat sinceId/paginationToken details since the schema covers them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads posts mentioning the connected X account, explicitly identifies the scope ('mentions'), and notes the ordering ('newest first'). It distinguishes from siblings like list_threads_mentions (Threads) and search tools by focusing on X account mentions.

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 explicitly provides use cases: identifying replies worth sending (with post_to_x + replyToId) and mining customer language for ad copy. It also gives operational guidance on cost and maxResults, but does not explicitly name alternative tools or when not to use it. The context is clear and practical.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

x_post_insightsAdvertiser analytics for your own posts on XA
Read-only
Inspect

Advertiser-grade analytics for the connected account’s OWN posts on X — impressions, engagements, LINK CLICKS, profile visits, video views and video completion quartiles. This is the read that answers “did the creative work”, which x_post_metrics cannot: public metrics show likes and reposts, never clicks or video retention. Takes up to 25 post ids in one call. COSTS CREDITS PER POST READ, so ask about the posts that matter rather than everything. If X returns no rows, say so — that is missing data, not zero performance. Needs X connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesnumeric X post ids (max 25) — the last part of each post URL
granularityNodefault Total

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsNo
errorsNo
costCreditsNo
granularityNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint and openWorldHint, but the description adds cost implications, a prerequisite ('Needs X connected'), and an important data-interpretation caveat ('If X returns no rows, say so — that is missing data, not zero performance'). These go beyond the annotations and add behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is around 90 words and is front-loaded with the core purpose. Every sentence adds distinct information (differentiation, batching, cost, missing data, prerequisite), though it is slightly dense. No fluff, but the multiple clauses make it less crisp than a two-sentence ideal.

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 read tool with an output schema and good annotations, the description covers purpose, differentiation, batching, cost, missing-data handling, and connection prerequisite. It does not detail output fields, but the output schema handles that. It also doesn't mention related historical tool, but that's optional.

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 covers both parameters with descriptions (100% coverage), so baseline is 3. The description reinforces the ids parameter by mentioning the 25-id limit and cost-per-post, which informs which ids to pass. This adds usage semantics beyond the schema, justifying a 4.

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 'Advertiser-grade analytics for the connected account’s OWN posts on X' and enumerates specific metrics, clearly stating the tool's function. It explicitly contrasts with sibling x_post_metrics, noting public metrics lack clicks/video retention, so it distinguishes from alternatives.

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 explicitly positions this as 'the read that answers did the creative work' and states 'which x_post_metrics cannot', giving an alternative. It also provides usage constraints: max 25 ids per call, cost per post read prompting selective use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

x_post_insights_historicalAdvertiser analytics for your own X posts, over any date rangeA
Read-only
Inspect

The same advertiser-grade X analytics as x_post_insights — impressions, engagements, LINK CLICKS, profile visits, video views and video completion quartiles — over ANY date range instead of only the last 28 hours. This is the one to use for “how did last week’s post do”, “compare these three posts over the month”, or any retrospective: x_post_insights physically cannot see past yesterday, so asking it about an older post returns nothing and that is not zero performance. Takes up to 25 post ids at once; the window defaults to the last 28 days when you name none, and the window actually queried is reported back. COSTS CREDITS PER POST READ — X bills us per API call — so say the cost before pulling a big batch and ask about the posts that matter. Needs X connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesnumeric X post ids (max 25) — the last part of each post URL
endDateNoYYYY-MM-DD or a UTC timestamp; defaults to now
startDateNoYYYY-MM-DD or a UTC timestamp; defaults to 28 days before the end
granularityNodefault Total

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsNo
errorsNo
endTimeNo
startTimeNo
costCreditsNo
granularityNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, openWorldHint), the description discloses credit costs per post read, reports the actual window queried, clarifies that old posts return nothing (not zero performance), and warns about the 25-post limit. These behavioral traits are not in the schema/annotations and are critical for correct use.

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 but organized: purpose first, then use cases, then constraints and cost. Every sentence adds value, but the length is slightly more than minimal. It front-loads the key differentiator (any date range) and ends with critical warnings.

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 (date range, batch IDs, cost implications, sibling distinction), the description covers all essential aspects: what it returns, when to use it, limits, defaults, cost, and prerequisites. The output schema likely handles return details, so the description is complete for selection and invocation.

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 already covers all parameters with descriptions (100% coverage). The description adds valuable context: the default window (28 days), the max 25 IDs, and that the actual window queried is reported back. This supplements rather than repeats 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?

The description clearly states this tool provides advertiser-grade X analytics (impressions, engagements, link clicks, etc.) over any date range, distinguishing it from x_post_insights which only covers the last 28 hours. The verb 'get insights' is implied through 'analytics for your own X posts' and the scope is explicit.

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: 'This is the one to use for “how did last week’s post do”...' and contrasts with the sibling x_post_insights. It also explains caveats (up to 25 ids, default window, cost warnings, X connection requirement), giving clear operational guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

x_post_metricsRead performance of a post on XA
Read-only
Inspect

Read the PUBLIC metrics of a post on X — impressions, likes, reposts, replies, quotes and bookmarks — to judge whether a hook landed before spending more behind it. For the advertiser numbers (link clicks, video views, profile visits) use x_post_insights instead. Costs a small number of credits (X bills per API read). Needs X connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe numeric X post id — the last part of the post URL

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNo
textNo
likesNo
quotesNo
repliesNo
repostsNo
postedAtNo
bookmarksNo
costCreditsNo
impressionsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the tool is known to be non-destructive. The description adds valuable context beyond the annotations: it mentions the credit cost (X bills per API read) and the need for X to be connected. This enriches the behavioral profile without contradicting 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?

Three sentences, each carrying distinct and necessary information: the core purpose and metrics, the alternative tool, and the cost/connection requirements. There is no redundancy or 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?

The tool has a single parameter, an output schema, and strong annotations. The description covers the purpose, use case, alternative, cost, and connection prerequisite. There are no obvious gaps for an AI agent selecting and invoking this simple read tool.

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?

The input schema documents the single parameter 'id' with a clear description ('the numeric X post id — the last part of the post URL'). Schema coverage is 100%, so the description itself doesn't need to elaborate on parameters. The baseline of 3 is appropriate here.

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 ('Read') and a specific resource ('PUBLIC metrics of a post on X'), and enumerates the exact metrics (impressions, likes, reposts, replies, quotes, bookmarks). It also names a concrete use case (judging whether a hook landed) and explicitly distinguishes itself from the sibling tool x_post_insights.

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?

The description clearly tells when to use this tool (for organic/public metrics to judge hook success) and points to x_post_insights as the alternative for advertiser metrics (link clicks, video views, profile visits). It also notes the requirement that X must be connected, adding a practical prerequisite.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

youtube_bulk_reportYouTube bulk report (thumbnail CTR, cards, end screens)A
Read-only
Inspect

THE ONLY PLACE YOUTUBE PUBLISHES THUMBNAIL IMPRESSIONS AND THUMBNAIL CTR. This is a different API from youtube_channel_report — YouTube’s bulk Reporting API — and for a product that generates thumbnails it is the number that says whether the thumbnail actually worked. Reports: thumbnails (impressions + CTR per video per day) · thumbnails_by_source (the same, split by traffic source, traffic source DETAIL, device and OS) · cards (per-card impressions, clicks and click rate by card_id) · end_screens (per end-screen element) · traffic_source (with the UNCAPPED traffic_source_detail — youtube_channel_report caps that at 25 rows) · basic. IT IS SCHEDULED, NOT ON-DEMAND, AND THIS IS THE ONE THING YOU MUST EXPLAIN TO THE USER: the first call SCHEDULES a job and returns NO DATA. YouTube then writes one CSV per 24-hour Pacific day — the first within 48 hours — plus a backfill of the 30 days before scheduling, and files expire after 60 days. It can NEVER answer about a period before the job existed, so "we have no thumbnail history yet" is a real and correct answer on day one. An unknown report name is refused with the list. Zero rows means missing data for that window, never zero impressions. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNohow many recent daily files to read (1–14, default 7)
sinceNoYYYY-MM-DD — only files whose data starts on or after this
untilNoYYYY-MM-DD — only files whose data starts before this
reportNodefault thumbnails
scheduleNofalse = do not create the job if it is missing; just report that none exists

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysNo
noteNo
rowsNo
countNo
jobIdNo
reportNo
columnsNo
scheduledNo
justCreatedNo
reportTypeIdNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnly and openWorld hints, and the description adds extensive behavioral context: first call schedules and returns no data, CSV generation cadence, backfill, 60-day expiry, zero rows meaning missing data, and read-only/0 credits. This far exceeds the structured annotation info.

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 information-dense, with critical facts front-loaded and clearly emphasized via capitalization and bullet-like lists. While not brief, every sentence contributes essential operational detail that would otherwise be missing.

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 tool with complex scheduled behavior, multiple report types, and data availability constraints, the description is remarkably complete. It covers first-call behavior, data lag, backfill, expiry, zero-row semantics, and even how to answer 'no history yet.' The presence of an output schema reduces the need to describe return formats, and this description fully addresses the context.

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% with all parameters described. The description adds extra meaning for the 'report' parameter by explaining the unique traffic_source_detail uncapped behavior and that unknown report names are refused with a list. It also clarifies the scheduling semantics tied to the 'schedule' parameter, adding value 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?

The description clearly identifies the tool as YouTube's bulk reporting API for thumbnail CTR, cards, and end screens, and explicitly differentiates it from youtube_channel_report. It enumerates the exact report types, making the purpose specific and unambiguous.

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: it is the only place for thumbnail impressions/CTR and contrasts with youtube_channel_report. It also states critical usage caveats (scheduled, not on-demand, no historical data before scheduling), effectively telling agents when NOT to use it and what to expect.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

youtube_channelGet the connected YouTube channelA
Read-only
Inspect

Read the brand’s connected YouTube channel — title + subscriber / view / video counts (for reporting). Needs a connected YouTube channel.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
titleNo
viewsNo
videosNo
subscribersNo
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description's 'Read' is consistent. It adds value beyond annotations by specifying the exact data returned (title + counts) and the prerequisite of a connected channel, which is useful behavioral context. No contradictions found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly written sentence that includes the action, resource, data fields, purpose, and prerequisite. Every word earns its place with no fluff or repetition.

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 has no parameters, a clear purpose, and an output schema (as indicated in context signals), the description is complete. It explains what the tool does and what it returns, and the prerequisite is stated. There are no significant gaps for an agent to misuse it.

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 has zero parameters, so the baseline is 4. The description appropriately clarifies that no parameters are needed and what data will be returned, which is sufficient given the schema is empty.

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 uses a specific verb ('Read') and clearly identifies the resource ('brand's connected YouTube channel') along with the exact data fields (title, subscriber/view/video counts). It is easily distinguishable from siblings like youtube_channel_report or list_youtube_videos.

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 provides clear context: it states the purpose ('for reporting') and the prerequisite ('Needs a connected YouTube channel'). However, it does not explicitly mention alternatives or when not to use this tool, such as pointing to youtube_channel_report for more detailed analytics.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

youtube_channel_reportYouTube analytics broken down by dimensionA
Read-only
Inspect

The YouTube Analytics reports that say WHERE views came from, WHO watched and WHERE they stopped watching — the questions youtube_channel (totals) and youtube_video_insights (one video, flat) cannot answer. Pick a report: day / month (time series) · country / province (US states) / city / dma (geography) · trafficSource (search vs browse vs suggested vs shorts feed vs external — the single most useful one for judging a thumbnail and title) · trafficSourceDetail (the actual search terms, inside ONE source — pass parent, e.g. "YT_SEARCH") · playbackLocation / playbackLocationDetail (which sites embedded it) · device / operatingSystem · demographics (age + gender) · sharingService · subscribedStatus · audienceRetention (the drop-off CURVE, 100 points across ONE video — the read that tells you whether the hook held and exactly when people left) · topVideos (the channel’s best in the window). Scope it to one or more videoIds, or omit for the whole channel. An unknown report name is refused WITH the list rather than quietly swapped. TWO THINGS TO SAY OUT LOUD WHEN REPORTING: demographics returns viewerPercentage and NOTHING else — YouTube publishes no absolute demographic counts, so never convert it into a number of viewers — and a capped report (city 250, topVideos 200, the *Detail reports 25) is the TOP N, not the whole set. Zero rows means missing data for that window, never zero views. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNorows, within YouTube’s own cap for that report
parentNorequired by the *Detail reports: the ONE parent to drill into, e.g. "YT_SEARCH" / "SUBSCRIBER" / "RELATED_VIDEO" for trafficSourceDetail, "EMBEDDED" for playbackLocationDetail
reportNowhich report (default day)
endDateNoYYYY-MM-DD, default today
videoIdsNonarrow to these videos — audienceRetention requires exactly ONE, because the curve is per video
startDateNoYYYY-MM-DD, default 28 days ago

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
rowsNo
countNo
reportNo
columnsNo
dimensionsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses that unknown report names are refused with the list, demographics returns only viewerPercentage (no absolute counts), capped reports are top-N rather than full sets, and zero rows means missing data not zero views. These are critical behavioral traits not present in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long and dense, but every sentence serves a purpose: report list, parent requirement, caveats, and annotations-aligned safety info. It is front-loaded with a clear purpose sentence and uses delimiters to separate report categories, though it could be slightly trimmed without losing value.

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 (6 params, 17 report types, output schema), the description covers all essentials: purpose, report semantics, parameter nuances, edge cases, and behavioral caveats. The output schema handles return values, so no further detail needed. It is fully complete for an agent to select and invoke this tool correctly.

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 adds valuable parameter semantics: 'parent' is required for *Detail reports, audienceRetention requires exactly ONE videoId, and the meaning of each report enum is explained. This goes beyond the schema's property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides dimension-based YouTube Analytics reports and explicitly contrasts with sibling tools youtube_channel (totals) and youtube_video_insights (one video, flat), making its purpose and scope unambiguous.

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 by naming which questions it answers that siblings cannot, and then walks through every report type with context (e.g., trafficSource is best for judging thumbnails/titles, audienceRetention shows the drop-off curve). It also states required parent parameters for detail reports and how to scope to videos.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

youtube_video_insightsPerformance of one of your YouTube videosA
Read-only
Inspect

Per-VIDEO performance for a video on the connected channel — views, estimated minutes watched, average view duration, average view PERCENTAGE (the retention number that tells you whether the hook held), likes, comments, shares and subscribers gained. Use it for "how did that video do", "which upload performed best", or to judge an ad before spending more behind it. youtube_channel only returns channel-wide totals and cannot answer this. Defaults to the last 28 days; pass startDate/endDate (YYYY-MM-DD) for another window. Read-only, 0 credits. Needs a connected YouTube channel.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoYYYY-MM-DD, default today
videoIdYesthe YouTube video id (the v= part of the watch URL, or the videoId returned by post_to_youtube)
startDateNoYYYY-MM-DD, default 28 days ago

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
likesNo
viewsNo
sharesNo
endDateNo
videoIdNo
commentsNo
startDateNo
subscribersGainedNo
averageViewDurationNo
averageViewPercentageNo
estimatedMinutesWatchedNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint and openWorldHint, but the description adds meaningful context: '0 credits' (cost), 'Needs a connected YouTube channel' (prerequisite), and 'Defaults to the last 28 days' (behavior). It also lists the returned metrics, giving the agent a clear picture of the tool's output without conflicting 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: the first sentence introduces the core function and metrics, followed by use cases, alternative exclusion, date window, and prerequisites. Every sentence earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

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 and rich annotations, the description still adds essential context: exact metrics returned, clear usage scenarios, the comparison with youtube_channel, default date range, credit cost, and the connection requirement. It is fully sufficient for an agent to select and invoke this 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 100% with all parameters described, so the baseline is 3. The description mentions startDate/endDate defaults and videoId provenance but largely reiterates what the schema already states. No additional parameter semantics beyond the schema are provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as providing per-video performance metrics (views, watch time, retention, engagement, subscribers) and explicitly contrasts it with youtube_channel, which returns channel-wide totals. The resource and scope are unambiguous, making it distinct from sibling tools.

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 use cases ('how did that video do', 'which upload performed best', 'judge an ad') and names the alternative that cannot answer these questions (youtube_channel). It also specifies the default time window and how to override it with startDate/endDate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides Meta and Google Ads intelligence for AI assistants, enabling users to analyze performance, track competitors, and manage ad campaigns through natural language. It features 17 tools for generating creative concepts, scraping competitor ads, and performing deep account-level analysis.
    Last updated
    17
    MIT
  • F
    license
    -
    quality
    A
    maintenance
    Enables AI assistants to create, analyze, and optimize ad campaigns across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Amazon Ads, and ChatGPT Ads through natural language using 400+ tools.
    Last updated
    78

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.