Skip to main content
Glama

Server Details

781 tools, all usable alone: ad research, video ads, 10 publishing channels, 11 ad platforms.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
hermoso-ai/hermoso
GitHub Stars
0
Server Listing
Hermoso

Available Tools

169 tools
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.

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

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds valuable context beyond that: the tool costs '~a transcription call' and extracts specific components such as voiceover vs on-screen text, beat lists, and frame timestamps. This gives the agent accurate expectations about cost and 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?

Three sentences carry all essential information: output contents, intended use, and cost. The most important scoping information is front-loaded, 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?

Despite having no output schema, the description clearly lists what the agent will receive (transcript, beat list, duration, timestamps), what input is needed (URL), and what tradeoff to expect (transcription cost). For a read-only analysis tool with a single parameter, this 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 description coverage is 100%, and the input schema already fully documents the url parameter. The description adds only light context that the URL should point to a video ad for structural analysis; it does not materially expand on the schema's 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 states a specific verb ('Break down'), a specific resource ('a video ad'), and enumerates concrete outputs: verbatim transcript, beat list, duration, and sampled frame timestamps. This clearly distinguishes it from editing/generation siblings like edit_video, clip_video, and 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 an explicit use case: 'Use to study a reference/competitor ad before remixing its structure.' It provides clear workflow context for when to invoke the tool, though it does not explicitly name exclusion criteria or competing alternatives.

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already communicate that this is a write operation (readOnlyHint=false), non-destructive (destructiveHint=false), non-idempotent (idempotentHint=false), and open-world (openWorldHint=true). The description adds useful context about the document eligibility model and end-of-doc positioning. 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?

A single front-loaded sentence that puts the action first and then gives the essential eligibility detail. There is no filler, though the embedded dashes and clauses make it slightly dense to parse.

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 tool with no output schema, the description covers what the tool does, where it appends, which documents are eligible, and how to obtain the documentId. It does not mention formatting behavior like newline handling before appended text, but this is minor given the annotations already cover the safety profile.

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 value by broadening documentId beyond the schema's narrower 'the document id from create_doc', explaining that list_drive_files is also a valid source for user-provided docs. The text parameter is not enriched 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, resource, and position: 'Append text to the end of a Google Doc'. It also defines the tool's scope ('Hermoso can reach') and distinguishes it from siblings like append_to_sheet by naming the Google Doc resource 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?

The description clearly tells the agent when the tool applies — for any reachable Google Doc — and which documents qualify: ones Hermoso created or ones the user shared via the picker. It also routes the agent to create_doc and list_drive_files for obtaining the documentId. It does not explicitly name excluded alternatives like update_doc or read_doc.

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

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already convey readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the mutation profile is established. The description adds useful access-scope context ('Hermoso can reach') and the row structure, but it does not disclose details such as append behavior at the end of the sheet, duplicate rows on retry, or any response shape.

Agents need to know what a tool does to the world before 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 action, and every clause earns its place by explaining reachable sheets, ID provenance, and row structure. 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?

Given the annotations, the 100% schema coverage, and the tool's moderate complexity, the description provides enough for an agent to invoke it correctly. It covers resource eligibility and parameter sourcing. It lacks explicit guidance on what the tool returns after appending, but that is not essential 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 100%, so the baseline is 3. The description adds value by telling the agent exactly where to get spreadsheetId ('pass the spreadsheetId from create_sheet', 'find its id with list_drive_files'), which is actionable guidance beyond the schema's generic parameter 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 states a specific verb ('Append rows') and a specific resource ('a Google Sheet'), and adds meaningful scope: sheets Hermoso created or the user handed over via the file picker. It is clearly distinguishable from sibling tools like append_to_doc and update_sheet.

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 the tool by explaining which sheets are eligible and how to obtain the spreadsheetId from create_sheet or list_drive_files. It does not explicitly contrast with alternatives like update_sheet or clear_sheet_range, 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.

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, pinterest and bluesky; the others say plainly why they cannot (LinkedIn and Reddit have no enumerate-my-posts endpoint on our grant, X bills per read so it is excluded from bulk import, Google Business has had no per-post insights since 2023, and Telegram's Bot API cannot read a chat's past messages at all — nothing published before Hermoso is recoverable through a bot token). 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

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses far more than annotations: it is bounded/resumable/quoted, runs as a dry run by default, requires confirm:true to import, and returns a cursor to continue. It explicitly warns that backfilled posts are weaker evidence, labeled 'backfilled', and that unattributed posts never vote on hooks. This goes well beyond readOnlyHint=false and idempotentHint=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?

The description is long but every sentence earns its place: supported channels with denials, the dry-run/confirm workflow, the evidentiary caveat, and the 'never guess a hook' rule. It is front-loaded with the core purpose and then progressively adds actionable constraints. The capitalization draws attention to critical warnings without being 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 tool with no output schema, the description tells the agent what it will get (a count and a cost quote, a cursor to resume), what will happen on confirm (import with backfill labels), and what the limitations are (unattributed posts, no voting). It also covers edge channels and the reasoning for exclusions. 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?

Schema coverage is 100%, so the schema already documents all five parameters (limit, cursor, channel, confirm, accountRef). The description adds semantic context around confirm ('dry run by default', 'pass the returned cursor to continue') but doesn't add meaning to limit or accountRef 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 opens with a specific verb ('Import') and resource ('this brand's PAST posts from a channel'), and immediately states the purpose: feeding the 'which hook works' analysis with historical data. It clearly distinguishes this from list_published_posts or collect_post_metrics by emphasizing the backfill/import nature and the channel support list.

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 (to draw on history predating Hermoso recording) and names excluded channels with reasons (LinkedIn, Reddit, X, Google Business, Telegram). It even states the dry-run/confirm workflow, which is a usage instruction. The alternative tools are implicit through sibling names but the conditions for choosing this tool are clearly stated.

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 + the price it is ACTUALLY billed — quote plan.priceUsd per plan.period, not plan.monthlyUsd), 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

TDQS

A4.9/5.0
Behavior5/5

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

Even though readOnlyHint is already true in annotations, the description adds substantial behavioral detail beyond annotations: how to quote the price (priceUsd per period, not monthlyUsd), the member-scoped omission of the owner's card and auto-reload settings, and the warning never to tell a member there is no card on file. This is exactly the kind of context annotations cannot express.

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

Conciseness5/5

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

The description is long but information-dense, with the core purpose front-loaded and every subsequent clause adding operational or safety-relevant meaning. The member-scope warning is clearly emphasized and 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?

With no output schema, the description fully enumerates what the caller can expect to learn: current plan details, credit balance, auto-reload status, card presence, own admin rights, and the member-scope variation. For a zero-parameter read-only tool, 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?

The tool takes zero parameters and the empty input schema documents that fully, so there is no parameter burden for the description to carry. The description instead correctly uses its space to explain the result semantics and permission-scoping rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 ('Show this account's billing at a glance') and enumerates exactly what data is returned: plan id/label/actual price, credit balance, auto-reload state, card on file, and the key's admin rights. It clearly distinguishes this read-only status tool from mutation siblings 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 explicitly says 'Call it before upgrade_plan / set_auto_reload to know what's possible' and explains that members have read-only billing. It also gives a concrete when-not-to-infer rule: in a shared team workspace, members only see plan and balance, and must not be told the card is absent.

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. IF YOU ARE AN AGENT HOLDING YOUR OWN PAYMENT CREDENTIAL, there is a third path that needs no human at all: POST /api/billing/machine-payment with a packId answers HTTP 402 carrying an MPP challenge, and grants the pack once you authorise and retry with the credential — the same packs, the same prices, the same credits. GET /api/billing/config carries a machinePayments block listing the packs with their per-credit rates and saying whether that lane is enabled on this server. Most agents do NOT have their own credential yet, so the checkout link above remains the normal path. 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

TDQS

A4.9/5.0
Behavior5/5

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

Discloses a large amount of behavioral context beyond annotations: saved-card vs no-saved-card flow, billing-admin requirement, quote validity of 10 minutes, idempotent retry with quote_token, Stripe checkout behavior with no redirect, and the machine-payment 402 challenge. The description contradicts no annotation and gives an agent an accurate mental model of 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.

Conciseness4/5

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

The description is long but well-structured, front-loading the common path before covering the no-card, machine-payment, and auto-reload edge cases. Some phrases, like the opening 'Out of credits?' and the repeated 'the same packs, the same prices, the same credits,' are somewhat filler, but the density of essential operational detail justifies most of 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?

With no output schema, the description carries the full burden of explaining expected results and behaviors. It covers the list output format, the quote step, the charge step, the checkout URL, the machine-payment challenge, permission requirements, and the auto-reload alternative. For a high-stakes payment tool, this is exceptionally complete; an agent has everything needed to call the tool correctly and understand consequences.

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 each parameter, the description adds crucial semantic meaning: pack is omitted to list packs, confirm:true actually charges the card, and quote_token binds the exact pack and price with a 10-minute validity, making retries idempotent. This is significant extra value beyond the input schema, especially for a payment flow where misuse could cause unintended charges.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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: top up credits with a credit PACK, including listing, quoting, charging, and generating a checkout link. It explicitly contrasts this with subscriptions and auto-reload, and even names the sibling set_auto_reload, so an agent can distinguish it from related billing tools without 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?

Provides explicit call patterns: no arguments to list packs, pack to quote, confirm with quote_token to charge, and a separate machine-payment path for credentialed agents. It clearly states when not to use the tool (subscriptions are managed by a person) and points to set_auto_reload for preventing future low balances, giving an agent both when-to-use and when-to-use-an-alternative guidance.

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

call_toolRun any Hermoso tool by nameA
Destructive
Inspect

Run ANY Hermoso tool by name — including the paid-campaign, analytics and channel-admin tools that are not in this session's starting list — with the same permissions, the same account and the same result as calling it directly. Get the exact name and its args from find_tools first. This is the route on hosts that cannot reload their tool list mid-conversation (claude.ai, ChatGPT): enable_tools switches a group on server-side, but such a host keeps the list it fetched at connect time. Arguments are validated against the tool's own schema and a mistake is answered with the expected parameters, not a silent default. Refused by name, with the way out, when the tool needs a connector this workspace has not made or is withheld by the host's own policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNothe tool's arguments as an object, exactly as its own schema takes them
nameYesthe tool name exactly as find_tools returned it, e.g. create_meta_lead_form

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark destructiveHint=true and readOnlyHint=false, so mutation risk is known. The description adds valuable behavior: same permissions/account/result as direct call, validation against the target tool's schema with error responses rather than silent defaults, and refusal-with-reason behavior. Each of these goes beyond the annotation booleans.

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, dense but each adds a distinct fact: capability, provenance, host limitation, validation and refusal behavior. Slightly longer than necessary but well organized and front-loaded with the core capability.

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?

Covers invocation source, host limitation, validation behavior, and failure modes. No output schema exists, so return format is not documented, but for a dynamic dispatcher the critical unknowns (how to find the name, when to use it, what happens on error) are addressed.

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 both parameters are described. The description reinforces 'exact name from find_tools' and 'args exactly as its own schema takes them', which adds practical guidance about provenance and format beyond the schema's generic object 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 runs any Hermoso tool by name, gives the exact use case (hosts that can't reload tool lists), and differentiates it from enable_tools. It names the resource (any tool by name) and the action (run) with specific scope.

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

Usage Guidelines5/5

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

Explicitly says to get name/args from find_tools first, explains when this route is needed (claude.ai, ChatGPT hosts that can't reload tool lists mid-conversation), and contrasts with enable_tools. Also discloses refusal cases: missing connectors or host policy.

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

TDQS

A4.5/5.0
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 safety profile is covered. The description adds contextual behavior beyond annotations: the queued-only restriction and the cannot-unsent consequence, which are valuable for an agent invoking cancellation.

Agents need to know what a tool does to the world before 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 carry the full message. The action is front-loaded first, followed by the id source, the temporal boundary, and the alternative tool. There is 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 single-parameter cancellation tool, this is complete: the agent learns what to do, which id to use, when it works, what to do after publication, and the destructive/idempotent behavior from annotations. No output schema is a minor gap for such a simple mutation.

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 the single id parameter, including its source in the description. The tool description repeats that the id comes from list_scheduled but does not add new semantic depth beyond what the schema documents. 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 a specific verb and resource: 'Remove a queued post before it goes out.' It clearly differentiates from siblings like schedule_post, list_scheduled, reschedule_post, and duplicate_scheduled, and even names manage_meta_post as the alternative for deleting 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 explicitly says when the tool works: 'Only works while it is still queued.' It also gives the id source ('Get the id from list_scheduled') and names the alternative tool for published posts, making the decision boundary explicit.

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). A saved VOICE CLONE of the user's own voice counts as a preset here — name it the way it is saved on their cast

TDQS

A4.5/5.0
Behavior4/5

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

Annotations are mostly negative hints (readOnlyHint false, destructiveHint false), so they do little to inform behavior. The description adds meaningful behavioral context: it preserves performance, lip-sync, and background sound, and it returns the served URL and is paid. This goes beyond what annotations provide, though it could say a bit more about the mutation'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.

Conciseness5/5

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

Two dense sentences with no wasted words. The primary behavior is front-loaded, then usage guidance, the sibling alternative, cost, and return value are each given in a compact clause. 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?

For a 2-parameter tool with no output schema, the description covers the main behavior, preservation guarantees, use case, alternative path, cost, and return value. The input schema fills in the remaining parameter details. Nothing essential 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.

Parameters3/5

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

Schema coverage is 100%, so the description does not need to compensate for missing parameter docs. The schema already describes video and voice, including examples and the voice-clone caveat. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb ('Swap the narration') and resource ('finished video'), and immediately distinguishes itself from dub_video. The description makes it clear what the tool does and how it differs from the closest sibling.

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 it ('user likes the video but wants a different narrator voice') and when not to ('use dub_video only for language translation'). Also notes it is Paid, giving the agent a clear decision boundary.

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

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool as read-only and non-destructive, and the description adds rich behavioral detail beyond that: it is a 'flat 1-credit check,' it pulls Meta's actual live policy pages, every flagged issue quotes Meta verbatim, it provides a compliant rewrite, and it 'never changes the creative.' This is exactly the contextual behavior an agent needs to set expectations and avoid misuse.

Agents need to know what a tool does to the world before 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: the first sentence states purpose, target, and cost; the second explains method and output; the third removes ambiguity about mutation; the fourth gives concrete use cases. Every sentence earns its place, and there is no repetition of schema or annotation content.

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

Completeness5/5

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

Even though there is no output schema, the description fully compensates by specifying the verdict values ('pass / fix / block'), the quoting-and-rewrite behavior, the live policy source, the cost, and the target scenarios. Combined with 100% schema parameter descriptions and read-only annotations, an agent has everything needed 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 description coverage is 100%, so the schema already documents all four parameters. The description adds meaningful semantic context on top: 'copy' is clarified as 'ad copy / script / on-screen text,' 'claims' maps to 'claims / proof points the ad makes,' and 'category' is explained as helping 'pick the relevant policy pages.' This goes beyond the baseline and connects the parameters to the tool's internal behavior.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Pre-flight ad copy against Meta's REAL, live Advertising Standards.' It also names the exact output form ('verdict (pass / fix / block)') and explicitly contrasts it with editing ('It's a check, not an edit'), which separates it clearly from sibling creative tools like plan_ad, render_ad, or 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 gives explicit trigger conditions: run it before launching ads, especially for regulated-adjacent categories such as health, finance/crypto, alcohol, dating, gambling, or for any strong/absolute/guaranteed claim. It does not name alternative tools or state when not to use it, so it stops short of a full 5, but the when-to-use 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.

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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false, so the destructive nature is known. The description adds valuable behavioral context beyond that: the two-call confirm flow, the echo mechanism (confirmCells) that catches naming mistakes, the fact that there is deliberately NO default range, that the clear is read back and reported as confirmed only if the range is truly empty, and that rows are left in place. This is rich, non-obvious behavioral disclosure that goes far beyond the structured data.

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

Conciseness5/5

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

Every sentence earns its place. The description front-loads what the tool does, then explains the safety protocol, the echo rationale, the no-default-range design, and the alternative tool — all in roughly 110 words. Nothing is wasted or redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 mutation tool with 5 params, no output schema, and only partial schema coverage, this description is remarkably complete. It covers the operation, the safety workflow, the exact parameters to set in each call, a common failure mode, the absence of a default, the post-condition verification, and points to the sibling for a related but different task. There is no meaningful gap an agent would face when invoking 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 only 40%: 'range' and 'confirmCells' have descriptions, but 'confirm' and 'sheetUrl' and 'spreadsheetId' do not. The description partially compensates by explaining confirm (the two-call protocol) and confirmCells (echo the filled-cell count the unconfirmed call reported). It doesn't explain the relationship between sheetUrl and spreadsheetId, but the core usage semantics of the non-obvious parameters are well covered. With 5 params and 40% coverage, the description carries a large share of the burden and does so 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 clearly states the verb 'Empty a range of cells in a Google Sheet' and specifies a resource (cells in a range) and scope (leaving rows in place). It distinguishes itself from the sibling manage_sheet_tabs by explicitly naming it as the alternative for removing a whole tab, and from other sheet operations by focusing specifically on clearing a range.

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 and how-to-use guidance: call once without confirm to get the filled-cell count, show the user that number, get confirmation, then call again with confirm:true AND confirmCells set. It also explicitly names the alternative for a different task: 'To remove a whole tab instead, use manage_sheet_tabs.' This is exactly the kind of exclusionary guidance that helps an agent decide.

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. THE VERTICAL REFRAME IS SUBJECT-AWARE: a few stills per clip go to ONE cheap vision call, which decides a SINGLE crop offset that is held for that clip's whole length — so a speaker sitting camera-left is not cropped out of their own clip, while the framing still never drifts INSIDE a clip (a per-frame crop truncates to whole pixels and shimmers, so it is deliberately not tracked). It costs one small vision call per clip, billed as its own event. When nothing is being discarded, or no single subject can be located, the crop stays dead centre exactly as before — read reframedToSubject and each clip's reframeWhy back off the result rather than assuming either way. 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. SUBTITLES ARE BURNED IN BY DEFAULT — slim white CAPS, thin black outline, bottom safe band, no box and no plate — because short-form is watched on mute; pass captions:false for clean footage. TIMING IS APPROXIMATE, NOT WORD-LEVEL: each cue is anchored to the transcript's own per-sentence timestamp and split inside a sentence by character count, so it tracks the speech closely but is not frame-accurate sync — never promise that. Read captionsBurned back off the result: it counts the clips that actually carry a burned track, and captionNote says why any are bare.

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
captionsNoburn subtitles into every clip. DEFAULT TRUE — a clip cut from a podcast or a talk is watched on mute, and the words are the product. Set false for clean footage. A clip whose window carries no readable speech is delivered bare rather than captioned with a guess, and the result says which.
aspectRatioNoclip shape — '9:16' (default) vertical for Reels/Shorts/TikTok; 'keep' leaves the source framing untouched

TDQS

A4.6/5.0
Behavior5/5

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

Annotations carry essentially no protective hints (all false), so the description bears the full burden — and it delivers extensively: the ffmpeg-only pipeline, subject-aware single-crop reframing with its rationale (per-frame crops shimmer), fallback behavior (dead-centre when no subject found), cost model (~7-credit hold plus per-clip vision event), burned-in subtitle styling, approximate non-word-level timing caveat, and explicit guidance to read reframedToSubject/reframeWhy/captionsBurned off the result rather than assume. No contradiction with the annotations exists; readOnlyHint=false is consistent with a creating operation.

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 (~350 words) but every section earns its place for a tool this complex: novel reframing behavior, cost, input constraints, and caption defaults are all things an agent could not infer from the schema. Key facts are front-loaded (what it does, output shape, core trade-off of speed via no video-model renders). The reframe explanation could be tightened without losing meaning, which 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?

With no output schema and no protective annotations, the description must cover return values, defaults, failure modes, and edge cases — and it does: clips[] fields (mp4 URL, title, hook, caption, score, timecode), defaults for count (4), aspectRatio (9:16), captions (true), the truncated flag, refund behavior on unsupported sources, and the captionNote/reframeWhy diagnostic fields. This is complete enough for an agent to select, invoke, and interpret the result 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%, establishing baseline 3. The description adds genuine value above the schema: for captions it details the visual style, the mute-viewing rationale, the bare-clip fallback, and the result fields to inspect; for video it adds the ~15s/~600MB limits, the 40-minute analysis cap with truncated:true, and the unsupported-source failure behavior. It does repeat some schema content (e.g., aspectRatio 'keep'), so it doesn't reach 5.

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

Purpose5/5

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

The opening sentence states a specific verb+resource+output: 'Cut ONE long video into several RANKED, ready-to-post short clips' with the intended source types (podcast, webinar, interview, conference talk). It clearly differentiates from siblings like edit_video, reframe_video, and stitch_video by emphasizing the one-to-many ranked-clips transformation and ready-to-post output.

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: three accepted input categories (external watch URLs, direct media URLs, Hermoso /generated/ URLs), hard exclusions (TikTok/Instagram/Facebook links, age-restricted/private/geo-blocked/LIVE content), and a concrete fallback instruction ('ask for a direct file or an upload rather than retrying'). However, it never names sibling tools such as edit_video or reframe_video to state when those should be chosen instead, so differentiation guidance is implied rather than explicit.

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

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

TDQS

A4.4/5.0
Behavior5/5

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

The description goes well beyond the annotations: it explains that metrics accrue and skips already-taken readings (aligning with idempotentHint=true), that ABSENT is recorded with a reason rather than zero, that failed reads are recorded as 'could not tell', and that X is skipped by default for cost reasons with the skip always reported. It also discloses the credit cost implication, which the 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 dense but not bloated; each sentence carries a distinct behavioral fact. It front-loads the core purpose and then covers accrual, data semantics, and cost. Some repetition about skipping occurs ("skips the ones already taken" and "X IS SKIPPED BY DEFAULT"), but it remains focused and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 no output schema, the description thoroughly covers what the agent needs to know before calling: the timing logic, the data recording semantics (ABSENT vs zero, 'could not tell'), the cost trigger, and the skip reporting so missing channels are not misinterpreted. The parameters are fully covered by the schema, and annotations supply the safety profile, so no critical context is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by revealing that X is skipped by default, that the skip is always reported, and that the operation is free except for X, which enriches the meaning of includeMetered:true beyond the schema's 'bills credits' note. max gets no additional semantics, but the run cap is already adequately 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 states a specific verb ('Fetch') and resource ('this brand's recorded posts') plus the storing action ('as a time-series'). It conveys the unique accrual logic (read at ~24 hours and ~7 days) that distinguishes it from a one-shot performance reader like post_performance, so the agent can tell what this tool alone does.

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 clear situational context: it collects readings that are due and skips ones already taken, and it explicitly instructs when to pass includeMetered:true and to warn the user about credits. However, it never names sibling alternatives or says when NOT to use this tool in favor of another, so the when-to-use vs alternatives guidance 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.

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 a credit or two, longest-running = proven winners). Auto-tailors the white space + counter-plays to YOUR saved brand. Spends credits (free 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

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that omitting `ads` triggers a live Meta ads pull that 'spends a credit or two', and that passing ads makes it free. It also explains the auto-tailoring to the saved brand and that 'longest-running = proven winners', providing meaningful behavioral detail 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?

Although longer than a typical one-liner, every sentence carries unique operational information: purpose, deliverables, contract for ads, credit cost, and personalization. The structured 'CONTRACT:' marker and front-loaded outcome ('actionable playbook') make it easy to parse despite the 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?

The description covers what the tool produces (a componentized playbook), how to control input (ads vs. auto-pull), cost behavior, personalization, and the source of data. With no output schema, the description's enumeration of the playbook sections is essential and sufficiently complete for an agent to invoke the 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 has full 100% coverage, so the bar is at 3. The description adds value by clarifying the credit implication of omitting `ads`, calling them 'raw ad objects', and reinforcing that `domain` refines the auto-pull page match. This is modest but genuine added 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 identifies the verb ('Tear ... down') and the resource ('a competitor's ad strategy'), then enumerates the exact deliverables (hook mix, themes, white space, counter-plays, avoided territories). This makes it easily distinguishable from sibling tools like pull_competitor_ads or research_ads, which remain precursors or broader alternatives.

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 concrete workflow: pass `competitor` and either supply `ads` from a prior pull or let the tool auto-pull. It explicitly states the trade-off (credit spend vs. free with ads), giving an agent clear guidance on when to choose each path. It does not explicitly list alternatives or exclusions, 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.

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

TDQS

A4.3/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the annotations: the conversion happens server-side by Microsoft ('nothing is re-encoded here'), the result lives at a durable Hermoso URL while 'Microsoft's own conversion link expires within minutes', and it only needs OneDrive connected with 'no new permission'. These are exactly the non-obvious traits an agent must know to use the result safely. No contradiction with 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.

Conciseness4/5

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

The description front-loads the core purpose, then each subsequent block earns its place: format coverage, use cases, the JPG dimension constraint (in caps, drawing attention), URL durability warning, and permission note. The enumerated format list is somewhat verbose but serves the differentiator function. Slightly longer than the tightest possible version, but nothing is 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?

For a 4-parameter tool with no output schema, the description covers the essentials: operation, supported formats, concrete use cases, a hard parameter constraint, the durability of the output URL, and the auth prerequisite. The one gap is that it never explicitly states the return shape — it strongly implies the durable URL is returned ('you can pass straight to a render or a post') but does not say so directly, and error behavior is undocumented.

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 all four parameters, establishing a baseline of 3. The description does add one meaningful nuance beyond the schema: it stresses that JPG requires BOTH width AND height together ('Microsoft refuses the call without them'), which clarifies the interdependence of those parameters. This is useful but marginal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter 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 'Turn a file already in the user's OneDrive into a PDF or a JPG' gives a specific verb, resource, and output format. The description further differentiates the tool by enumerating ~130 source formats including raw camera formats 'that nothing else in this product can open', which sets it apart from sibling file tools like get_onedrive_file or 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?

Three concrete use cases are given ('turn a client's deck into images you can actually put in an ad... get a usable JPG out of a designer's PSD... hand someone a PDF of a spreadsheet'), giving clear contextual guidance for when to invoke the tool. However, it never explicitly states when NOT to use it or names an alternative sibling for comparison, so exclusions are left to inference.

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

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, but the description adds valuable context beyond those: it switches to the new workspace, isolates data between workspaces, returns the existing workspace on re-run, and clarifies that the research credit cost only applies to draft_brand. 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?

Every sentence earns its place: the main action is front-loaded, followed by isolation semantics, usage routing, idempotence, and cost. It is dense yet well-organized 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 creation tool with no output schema, the description covers purpose, switching behavior, isolation, idempotence, and cost thoroughly. The only gap is that it does not state what the tool returns on success beyond the switch, which an agent might need for follow-up calls. Minor gap given the rich context otherwise provided.

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 both name and activate already have clear descriptions in the schema. The description's mention of 'switch to it' reinforces the activate parameter's behavior but does not add new meaning beyond what the schema already 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 opens with a specific verb and resource ('Add a NEW brand workspace') and clarifies it is a separate brand/client on the account. It explicitly distinguishes itself from sibling tools draft_brand (fill) and update_brand (edit), so an agent can tell them apart without opening schemas.

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

Usage Guidelines5/5

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

States exactly when to use it ('for a second brand or a new client') and names alternatives with their purposes ('use draft_brand to FILL a workspace, and update_brand to edit one'). It also flags the idempotent re-run behavior and cost implications, leaving no doubt about appropriate invocation.

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

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the annotations, the description discloses that the tool returns the document id and URL and requires the Google Drive connector. This is useful operational context. It could add more about overwrite/duplicate behavior, but creating a new doc is adequately implied.

Agents need to know what a tool does to the world before 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: main purpose with examples, return value, and connection prerequisite. Every sentence earns its place with no redundant restatement of the title or 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 simple create tool with fully covered parameters, the description provides everything needed: what it creates, example uses, return values, and setup requirement. Even without an output schema, the return info is explicitly stated.

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 both parameters (title and text) at 100% coverage, so the baseline applies. The description adds that text is optional and gives example content types, but does not meaningfully expand on parameter formatting or constraints.

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

Purpose5/5

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

The description names a specific verb ('Create'), a specific resource ('a new Google Doc in the user's Drive'), and a clear scope (title + optional body text). This clearly differentiates it from create_sheet, create_drive_folder, append_to_doc, and update_doc.

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 concrete example use cases (export ad copy, creative brief, report) and states the prerequisite that Google Drive must be connected. It does not explicitly mention when to prefer a sibling like append_to_doc or update_doc, but the usage 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_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)

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already signal non-read-only and non-idempotent behavior, and the description adds the return format (folder id + webViewLink) plus how the ID flows to sibling tools. It also clarifies the find-or-create behavior of save_to_drive, which is useful context beyond the structured 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?

Three sentences, each with distinct value: purpose, return value and downstream usage, and a cross-tool caveat. No filler and the core action is front-loaded. It is 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?

For a two-parameter create tool with no output schema, the description covers the return value, nesting behavior, and downstream consumption examples. It also addresses the confusing relationship with save_to_drive, making the tool effectively self-contained. An agent can call this correctly without additional clarification.

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 both name and parentId documented, so the schema carries the basic meaning. The description goes further by explaining that parentId creates a nested folder (defaulting to root) and that the returned ID is used downstream. This adds practical parameter usage that 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 'Create a folder in the user's Google Drive' — a specific verb and resource — and clarifies it can be nested under parentId. It clearly distinguishes itself from related tools like save_to_drive and update_drive_file by explaining the folder creation role. Unambiguous and immediately actionable.

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 the agent to use the returned ID as update_drive_file's moveToFolderId or as parentId for a nested folder. It also warns that save_to_drive's folder parameter takes a NAME, not this ID, steering the agent away from a common misuse. This provides direct alternative routing and practical context.

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)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish that this is not read-only and not destructive. The description adds useful behavioral context by stating the return value includes folder id + webViewLink, which is beyond the annotations. It could mention idempotency implications or duplicate-name behavior, but the essential side effect is 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?

Three compact sentences, each earning its place: the first explains the action, the second explains how to consume the result, and the third clarifies a critical distinction from save_to_onedrive. 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, with only two well-documented parameters and no output schema. The description supplies the missing return-format information (folder id + webViewLink) and how to use it in dependent tools, making the definition fully actionable.

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 name and parentId are already documented. The description adds 'optionally nested under parentId' and mentions the root default, but this is largely restating what the schema already provides. It does not add significant new parameter meaning beyond the structured 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 and resource: 'Create a folder in the user's OneDrive'. It immediately distinguishes this from Google Drive siblings by naming OneDrive, and it includes the optional parentId nesting behavior. The tool's role is 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 explains how to use the returned folder id — as update_onedrive_file's moveToFolderId or as parentId for a nested folder. It also warns that save_to_onedrive's `folder` parameter expects a NAME, not this id, which prevents a likely misuse and distinguishes this tool from a related sibling.

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

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (which already indicate a non-read-only operation), it discloses the optional fill behavior, the row-array layout including header treatment, the returned spreadsheet id + URL, and the Drive connector 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 tight sentences that front-load the core behavior, then add only the needed formatting, return, and connection details. 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?

For a simple 2-parameter tool with no output schema, the description covers return value, row format, and auth prerequisite. It is slightly incomplete only in not naming the sibling tools for appending/updating an existing sheet.

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 rows and title are already described in the schema; the description mostly restates 'array of row arrays, first row = headers' in natural language. It adds little information that an agent couldn't already derive from the schema.

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

Purpose5/5

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

States a specific action ('Create'), an exact resource ('new Google Spreadsheet in the user's Drive'), and gives concrete example payloads ('swipefile, ad list, performance report'). Saying 'new' plus 'Spreadsheet' separates it from create_doc and from update/append sheet 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?

Gives clear contexts for use: creating a fresh spreadsheet and optionally exporting row data, and a concrete prerequisite ('Needs Google Drive connected'). It doesn't explicitly say when to prefer append_to_sheet or update_sheet instead, so it misses the explicit exclusions needed for a 5.

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

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructiveHint:true and readOnlyHint:false; the description substantially supplements them by disclosing irreversibility, impact on everyone the workspace is shared with, connected-account disconnection, the dry-run inventory behavior of the first call, and the rationale that confirming intent does not prove the correct workspace was picked. No contradiction with the annotations.

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

Conciseness4/5

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

The description is long, but every sentence carries safety-critical weight and the most urgent facts (permanent, everything, irreversible, shared impact) are front-loaded. The rationale sentence about wrong targets is slightly verbose but earns its place for a destructive tool of this severity.

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 destructive tool with no output schema, the description fully specifies the call workflow, the confirmation requirements, and the anchor-brand exclusion. The only minor gap is not describing the exact format of the inventory the first call returns, though the instruction to show it verbatim reduces the need for that 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 100%, so the baseline is 3; the description adds real value above it by explaining why confirmName and confirmConnectors exist (protecting against destroying a live brand) and how they derive from the first call's reported inventory. It connects the parameters into a workflow even though it doesn't reformat each parameter's syntax.

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

Purpose5/5

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

States a specific verb and resource — 'PERMANENTLY delete a brand workspace and EVERYTHING in it' — and enumerates the full contents (brand profile, memory, swipefile, Library creations, generated assets, avatars, skills, playbooks, chats) plus disconnection of connected accounts. This clearly distinguishes it from siblings that delete narrower resources (delete_playbook, delete_skill, delete_drive_file) or mutate brands (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?

Provides an explicit two-phase protocol: call without confirm first to obtain an inventory, show it verbatim, get an unambiguous yes, then call again with confirm:true plus the exact confirmName and confirmConnectors values. It also names the when-not-to case — the account's first/anchor brand cannot be deleted this way and must be replaced from the app.

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)

TDQS

A4.7/5.0
Behavior5/5

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

The description adds valuable behavioral detail beyond the annotations: it records a cross-device delete to prevent reappearance, it only removes the roster entry rather than affecting ads, and it clarifies no confirmation is needed because the creator can be saved again. This fully explains the destructive-but-reversible nature of the operation.

Agents need to know what a tool does to the world before 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 lead with the core action, then clarify scope, side effects, and re-creation path. No filler, and each sentence adds relevant 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 single-parameter tool with rich annotations and no output schema, this description is complete. It tells the agent what the tool affects, what it does not affect, how the id is obtained, and how the action can be reversed. 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?

Schema description coverage is 100%, and the schema already documents the 'id' parameter as 'the creator id (from list_creators)'. The description reiterates this source but does not add new 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 states a specific verb ('Remove'), a specific resource ('a saved creator from this workspace's cast'), and an explicit identifier source ('by id (from list_creators)'). It clearly distinguishes this tool from sibling tools like save_creator and list_creators.

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 clear context for when to use the tool: removing a creator from the workspace cast by id. It also explicitly tells the agent what this tool does NOT do (ads already rendered are untouched) and names save_creator as the way to re-add the same portrait, effectively covering alternatives and exclusions.

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)

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, and the description goes further by explaining that deletion defaults to the recoverable Trash, that permanent:true is irreversible, and that user confirmation should precede permanent deletion. This adds meaningful behavioral context beyond the annotations 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?

Three short, purposeful sentences cover the operation, default behavior, parameter requirements, and the safety warning. The irreversible caveat is front-loaded before invocation details, 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 three-parameter delete tool with no output schema, the description supplies the essential operational details: recoverability, irreversibility, required confirmation, and how to obtain fileId. Given the existing destructive annotation, nothing critical is missing 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real value by specifying that fileId comes from list_drive_files and by reinforcing that confirm:true is required. It also ties permanent:true to irreversibility, matching and slightly enriching 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?

States a specific verb and resource ('Delete a Drive file'), then adds the Trash-vs-permanent distinction so the operation is unambiguous. The resource is clearly Google Drive, distinguishable from siblings like delete_onedrive_file and update_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?

Gives clear invocation guidance: fileId should come from list_drive_files, confirm:true must be passed, and the user should be consulted before a permanent deletion. It does not explicitly name alternatives or exclusions, but the sibling resource differences are evident from the tool names.

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

delete_linkedin_lead_subscriptionStop a LinkedIn lead webhookA
DestructiveIdempotent
Inspect

Remove a lead notification webhook (subscriptionId from list_linkedin_lead_subscriptions). Leads themselves are unaffected and stay readable; only the real-time delivery stops. Read back from LinkedIn. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdNothe company Page that owns the form — from list_linkedin_pages; omit when one Page is shared
adAccountIdNoread forms owned by an AD ACCOUNT instead of a Page
subscriptionIdYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, idempotentHint=true), the description adds valuable behavioral detail: leads are unaffected and remain readable, only the webhook delivery stops, and state is read back from LinkedIn. It also mentions 'Free,' which is useful operational 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.

Conciseness5/5

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

Three short sentences deliver the action, the source of the ID, the exact scope of destruction, and the source-of-truth behavior. There is no redundant or filler content, and the most important operational detail is front-loaded.

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

Completeness4/5

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

For a simple three-parameter destructive tool, the description covers the critical context: what is removed, what is not removed, and where the ID comes from. It does not describe the return value or how to reverse the action, but the annotations and schema cover the rest, making this adequate though not 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 required parameter subscriptionId lacks a schema description, but the tool description fills that gap by pointing to list_linkedin_lead_subscriptions as the source. The optional pageId and adAccountId are already described in the input schema, so between the description and schema, all parameters have meaningful 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 a specific action ('Remove') on a specific resource ('lead notification webhook') and clearly distinguishes it from lead deletion: 'Leads themselves are unaffected and stay readable; only the real-time delivery stops.' It also names the source of the identifier, which removes ambiguity from similarly named LinkedIn lead 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 clear context: use the subscriptionId from list_linkedin_lead_subscriptions, and the effect is only on real-time delivery. It does not explicitly name an alternative action such as subscribe_linkedin_leads or list_linkedin_lead_subscriptions, but the context is strong enough for an agent to know when this tool applies.

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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true, so the description adds meaningful context by disclosing that the item moves to the OneDrive recycle bin and is recoverable there. It also communicates the confirmation safeguard, which is valuable behavioral context 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 three short sentences with no filler. It front-loads the core behavior, then covers the parameter source and confirmation requirement. 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 two-parameter delete operation with no output schema, the description covers the action, the recoverability consequence, the source of the identifier, the required confirmation flag, and the user-confirmation step. Nothing essential is missing 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 coverage is 100%, but the description adds important semantic guidance: fileId should come from list_onedrive_files, and confirm must be true. This compensates for the schema's inconsistency where confirm is described as 'REQUIRED true' but is not listed in the required array.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 a specific resource ('a OneDrive item'), and immediately clarifies scope by noting it is a recycle-bin move rather than a permanent purge. This clearly differentiates it from related siblings like update_onedrive_file, get_onedrive_file, and save_to_onedrive.

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 concrete usage instructions: pass fileId from list_onedrive_files, pass confirm:true, and confirm the exact file with the user first. This is strong practical guidance, though it does not explicitly name alternatives or conditions 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.

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)

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, idempotentHint=true), the description discloses a non-obvious trait: 'Records a cross-device delete so it does not come back on the next sync,' which an agent could not infer from structured data. The 'Minor + re-creatable' note adds severity context that helps the agent set confirmation expectations. No contradiction with 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 short sentences: the core action is front-loaded, followed by the sync behavior and the severity rationale. Every sentence adds information; there is no filler.

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

Completeness5/5

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

For a one-parameter destructive tool with a fully documented schema and a complete annotation set (destructive, idempotent, read-only), the description covers action, id source, persistence behavior, and severity. Return-value details are reasonably unnecessary given no output schema and the simple action.

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 schema already documents id as 'the playbook id (from list_playbooks)'. The description repeats the same provenance rather than adding new parameter details, 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 names a specific verb ('Delete'), a specific resource ('saved playbook'), and the source of the identifier ('from list_playbooks'). This clearly differentiates delete_playbook from its delete_* siblings such as delete_brand, delete_drive_file, 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 gives clear operational context: the id must come from list_playbooks, pointing the agent at the prerequisite call. It also justifies invocation without extra safeguards ('Minor + re-creatable, so no confirm needed'). It stops short of explicitly naming alternatives or 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.

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)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already signal destructiveHint=true and idempotentHint=true. The description adds meaningful behavioral context: only custom skills are affected, built-in skills are protected, and the skill is minor and re-creatable, which is why no confirmation is needed. This goes beyond the structured hints 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 short sentences with no filler. The core action and scope come first, the exclusion rule follows, and the final sentence provides useful operational context. 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 single-parameter delete tool, the description covers what can be deleted, what cannot, where to get the id, and why no confirmation is needed. Annotations cover safety and idempotency, 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?

Schema coverage is 100%, and the id property is already described as 'the custom skill id (from list_skills)'. The description repeats this same information rather than adding new parameter-level meaning, 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 states a specific verb ('Delete') and a clear resource ('one of the workspace’s CUSTOM skills'), scoped by id and sourced from list_skills. It also distinguishes this tool from related skill tools like get_skill, save_skill, and list_skills by emphasizing custom-only deletion.

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 deletion is allowed (custom skills) and when it is not (built-in skills/recipes can’t be deleted). It also tells the agent where to obtain the id (from list_skills), which is practical routing guidance for use.

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

diagnose_postsWhat to fix next, post by postA
Read-only
Inspect

WHAT TO FIX NEXT, post by post — and the tool that fixes it. post_performance tells you which hook is AHEAD; this tells you what is WRONG with a given post and where the next edit goes. Under-distributed is A HOOK PROBLEM (change the opening: mine_angles, then list_hooks, then plan_variations). Seen but not held is A RETENTION PROBLEM (plan_variations to rebuild the middle against the same hook). Seen, held, and still not converting is AN OFFER PROBLEM. FOUR REFUSALS, AND YOU SHOULD REPEAT THEM RATHER THAN PAPER OVER THEM: (1) a post younger than ~24h is TOO EARLY and is never called a failure — it has not had its run; (2) a metric the platform does not publish is UNMEASURED, never zero — Facebook has published no post reach since 2026-06-15, Reddit publishes no impressions, and Google Business publishes nothing per-post at all; (3) below 5 measured posts on a channel there is no baseline of the brand's own, and the ONLY fallback is a published short-video hook floor that is NOT our measured number and does not transfer off TikTok/Instagram/YouTube — it is attributed in the output and you should attribute it too; (4) it does not always find a problem, and 'nothing here needs fixing' is a real answer rather than a failure to look. Hermoso cannot see conversions for an organic post — no channel reports installs or purchases against a post id — so the offer rung runs ONLY when the user tells you they are not converting and you pass converting:false. Print summary verbatim. Read-only, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many recent posts to diagnose (default 25, max 200). The baseline is always built from EVERY post recorded for the brand, never only these, so a bad month can never become its own definition of normal.
channelNorestrict to one channel: facebook, instagram, threads, x, linkedin, youtube, tiktok, reddit, pinterest
convertingNopass false ONLY when the user has told you these posts are getting seen and are not converting — it re-reads the ones that are earning their reach as an offer problem instead of a win. Omit when you do not know; we cannot measure it.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say read-only/non-destructive; the description adds substantial behavioral detail: four refusal conditions, the inability to see conversions for organic posts, the requirement to print summary verbatim, and the attribution of fallback baselines. These go well beyond the annotations and materially shape how an agent interprets results.

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 heavily formatted, but each block carries diagnostic heuristics, routing, or refusal logic that would otherwise be absent. It is front-loaded with the core purpose, though the all-caps style and several run-on passages keep it from being maximally clean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 diagnostic tool with no output schema, the description covers selection, invocation, edge cases, refusal behavior, fallback attribution, conversion limitations, and the required summary output. An agent has enough context to call and interpret the tool correctly without inventing missing 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 per the rubric the baseline is 3. The description mainly reinforces converting:false behavior already documented in the schema, and it does not add new parameter-level meaning beyond what the input schema already gives for limit, channel, and converting.

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

Purpose5/5

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

States a specific diagnostic function: it tells what is wrong with a given post and where the next edit goes, and explicitly contrasts with sibling post_performance (which hook is ahead vs what is wrong). This makes the tool's unique 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?

Gives explicit routing guidance: use post_performance to see which hook is ahead, use diagnose_posts to identify hook/retention/offer problems, and follow with mine_angles/list_hooks/plan_variations. It also defines when NOT to diagnose (posts younger than ~24h, unreliable metrics, fewer than 5 baseline posts) and when converting:false should be passed.

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 always drops the stored credentials, so every tool for that provider stops working immediately and posts/campaigns already published are NOT affected. WHETHER IT ALSO REVOKES THE GRANT AT THE PROVIDER DEPENDS ON THE PROVIDER — a few (Threads, Microsoft) publish no revocation endpoint, so the authorisation stays in place until the user removes it in that provider's own settings. The unconfirmed call reports which it is for this provider (list_connectors also carries it as revokesAtProvider) — relay that verbatim rather than promising a revoke. 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
accountNoon a channel with several connected accounts (TikTok, X, YouTube, Threads, Bluesky, Telegram, Reddit, Pinterest): remove ONLY this account (@handle or id from list_connector_accounts) and keep the others
confirmNoREQUIRED true — reconnecting needs the user's browser
providerYesprovider id exactly as list_connectors reports it, e.g. "meta", "google_ads", "youtube", "linkedin"

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark this destructive and non-read-only, but the description goes well beyond them: credentials are always dropped, provider tools stop immediately, published posts are unaffected, revocation at the provider varies (Threads/Microsoft lack endpoints), and the unconfirmed call reports the revokesAtProvider status. This is exactly the behavioral context an agent needs for a destructive, irreversible action.

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 earns its place for a destructive irreversible operation, and the most critical facts (credential drop, published posts unaffected, browser-only reconnection) are front-loaded. The heavy use of ALL-CAPS emphasis is stylistically noisy but does improve skimmability 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?

With no output schema, the description compensates by explaining what the unconfirmed call reports and how to relay it. It covers consequences, provider-dependent variance, preconditions, irreversibility, and cross-references to sibling tools — nothing an agent needs to call this safely 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%, so the baseline is 3 with the schema carrying the parameter documentation. The description adds minor reinforcement — that confirm:true is mandatory and that provider ids come from list_connectors — but does not substantially extend what the schema already states about 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 specific verb+resource ('Disconnect a third-party account from this workspace') and enumerates the affected providers, making the tool's scope unambiguous. It also distinguishes itself from related siblings like list_connectors and list_connector_accounts by positioning them as precursors rather than the action itself.

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

Usage Guidelines5/5

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

The description gives explicit call sequencing: name the provider to the user first, then call with confirm:true, and relay the revocation result verbatim. It names list_connectors as the source for exact provider ids and warns that an agent cannot undo the action because reconnecting needs a browser, effectively stating when not to proceed.

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 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

TDQS

A4.3/5.0
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 important behaviors: it costs 0 credits, a domain can resolve to a different company, the tool cannot ask the user for clarification, and the caller owns the verification check. This materially changes how an agent should invoke and validate 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 dense but every sentence earns its place: purpose first, then cost, then a clearly marked IMPORTANT warning with an example and an actionable rule. It avoids repeating schema details and is structured for quick parsing by an agent.

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 no output schema, it covers the returned object shape ({name, products, logo, …}), the fields to verify, and the save behavior. It could be more explicit that exactly one input source is expected, but the alternatives are clearly stated.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds extra semantic guidance: it maps the three input modes to parameters, warns about domain ambiguity with a concrete example, and explicitly recommends save:false until the result is confirmed. That goes beyond the schema field 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 opens with a specific verb ('onboard') and resource ('brand profile'), lists three input sources, and names the downstream consumers (plan_ad / generate). It is clearly distinct from generic brand management tools, though it does not explicitly contrast itself with sibling 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 Guidelines4/5

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

It clearly states when to use the tool: to turn a domain, description, or social handle into a reusable brand object. It also gives strong operational guidance—verify the returned name, re-draft if wrong, and pass save:false until confirmed—but does not explicitly name alternatives or say 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.

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)'

TDQS

A4.4/5.0
Behavior5/5

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

The description richly discloses behavior beyond the sparse annotations: it explains the full pipeline (transcribe, translate, re-voice, lip-sync), notes the output is a served URL, and states the operation is paid. It also clarifies that the original footage is not re-rendered, which is significant 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?

The description is compact and front-loaded: the core value proposition appears first, followed by usage instructions, payment detail, and return type. Every sentence contributes new information without unnecessary 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 there is no output schema, the description appropriately mentions the return value (served URL) and cost (paid). It also covers the main input requirements and the optional script override. It could be slightly more complete by mentioning billing setup or prerequisites, but for this complexity level it is largely 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?

Schema description coverage is 100%, so the baseline is 3. The description adds a small amount of parameter guidance—'Just pass the video and the language' and 'pass script only to override'—but the input schema already documents these same semantics, so the added value is marginal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 'localize' with the resource 'a finished video' and highlights the key distinction from re-rendering: the visual, timing, and edit remain untouched. This makes it easy to tell apart from siblings like edit_video, clip_video, or reframe_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?

It gives clear context on when to use the tool: pass the video and target language, and only override the script when the auto-transcript is wrong. It doesn't explicitly name alternatives or state when not to use it, but the 'finished video' + 'no re-render' framing conveys the appropriate use case.

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
chatIdNoTELEGRAM — which chat, group or channel the copy goes to (@username or numeric id)
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)

TDQS

A4.8/5.0
Behavior5/5

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

The description goes beyond the sparse annotations by disclosing that the copy is independent, never affects the original, and is a genuinely new post that will publish even where the original already did. These are exactly the non-obvious behaviors an agent needs to know, and 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.

Conciseness5/5

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

The description is substantial but every sentence carries distinct information: purpose, use cases, copying/override behavior, new post independence, and the retry alternative. It is front-loaded with the core operation and uses formatting like INDEPENDENT and NEW to emphasize key facts without 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 tool with 18 parameters, nested objects, and no output schema, the description covers the essential invocation semantics well: required source id, scheduling options, override behavior, and relationship to retry_scheduled. The only small gap is that return values are not mentioned, but this does not block correct selection or 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 72%, so the schema already documents most parameters. The description adds valuable meaning for the key scheduling choices ('Give a new time in at, or useQueue:true') and clarifies that any copied field can be overridden in the same call. A few schema-undocumented parameters like link and imageUrl remain implicit, but the core semantics are well covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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: copying an existing scheduled or already-published post into a NEW queued post. It clearly distinguishes itself from the sibling retry_scheduled, so an agent can tell them apart immediately.

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 the concrete scenarios for using this tool (reuse a post, run a creative again, re-send after publishing) and explicitly says to use retry_scheduled instead when only failed channels need to be re-fired. This is 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_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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only set readOnlyHint=false, openWorldHint=false, idempotentHint=false, destructiveHint=false. The description adds meaningful behavior: it preserves original motion/timing/edit, changes subject/setting/style; it is a paid render; and it returns the served URL of the edited clip. It also discloses the identity/product grounding behavior via the `elements` parameter. A small gap: it doesn't explicitly warn about whether the source clip is consumed or what happens to the audio if keepAudio is omitted, but the schema covers keepAudio default. The behavior about preserving motion/timing is important and disclosed.

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: the first sentence states the core transformation, followed by concrete examples, constraints, exclusions, and cost/return. It is longer than ideal, but every sentence adds value, and key behavioral information is front-loaded. The NOT list is long yet necessary for routing among many video sibling tools.

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 complexity (video-to-video transformation with optional grounding, audio toggle, paid render) and no output schema, the description covers the core semantics: what it does, constraints, alternatives, and return type (served URL). It doesn't detail failure modes (e.g., what if the video is too long or the instruction is ambiguous) or how the audio is handled when keepAudio is false in terms of output format, but given annotations and schema coverage, this is adequate and only missing minor edge-case guidance.

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 semantics beyond the schema: it explains the `elements` parameter's purpose ('so the edit restores the REAL thing instead of re-inventing it') and that `instruction` is in the user's own words, mapping to the natural-language behavior. It also adds context about the video source URL, tying it to 'a previous render, a job result, or list_library' – but that comes from the schema. The description reinforces the exact role of `instruction` and `elements` without redundancy, warranting 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 a specific verb and resource ('EDIT/transform an existing video clip with a natural-language instruction (video-to-video)'), and explicitly distinguishes itself from sibling tools like post_edit, generate_video, dub_video, recast_motion, and render_ad via concrete examples. The transformation scope is well-defined, including what it does NOT do, which makes it immediately distinguishable 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?

The description provides explicit when-to-use guidance ('Use for...') with multiple concrete examples, and explicit when-not-to-use exclusions naming specific sibling tools (post_edit, generate_video/render_ad, dub_video, recast_motion). It also gives a practical constraint ('Best on 3–10s clips'), making it easy for an agent to route correctly.

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

enable_toolsTurn on more Hermoso toolsA
Idempotent
Inspect

Switch on a group of tools that is not in this session's roster. WORKS ON CLIENTS THAT RE-READ THE TOOL LIST (stdio, the CLI); a host that fixed its roster at connect time — ChatGPT does — will not show the new tools until it reconnects, and this tool says so in its reply rather than reporting a success you cannot use. The connect-time route that always works is ?tools=all on the server URL. The default roster is every group EXCEPT ads and analytics and channel_admin, which are held out purely on SIZE: paid-campaign management is by far the largest group, most of the total schema weight across eleven ad platforms, and measurement is a third again on top of everything else. Most sessions need neither. Nothing in either is unfinished or unsafe — they are one call away. CALL THIS THE MOMENT YOU NEED ONE. If the user asks to build, budget, target, report on or change an ad campaign on any platform, call enable_tools({groups:['ads']}) first and the tools appear. If they ask about their own site or product analytics, a tag/tracking container, or how a search engine crawls, indexes or ranks their site, call enable_tools({groups:['analytics']}). Groups: core, research, create, channels, channel_admin, analytics, ads, files, workspace — or 'all'. Free, instant, and it never turns anything off.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupsYesGroups to switch on, e.g. ['ads']. Unknown names are refused by name rather than ignored.

TDQS

A4.9/5.0
Behavior5/5

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

Adds significant behavioral context beyond annotations: it discloses that hosts that re-read the tool list will show new tools, while connect-time hosts like ChatGPT will not, and that the tool reports this instead of returning a misleading success. It also states it is free, instant, and never turns anything off, which is not evident 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.

Conciseness4/5

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

The description is long, but nearly every sentence carries actionable information: trigger conditions, host caveat, default roster, held-out groups, and accepted values. It is front-loaded with the core action and expands only where it directly affects invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 meta-configuration tool with no output schema and one parameter, the description is complete: it lists valid groups, explains the default and excluded groups, provides concrete trigger examples, covers the host-dependent limitation, and gives the fallback connection-time route. No meaningful gap remains for correct selection and 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?

Though the schema already documents the single 'groups' parameter, the description enriches it with the full list of accepted groups ('core, research, create, channels, channel_admin, analytics, ads, files, workspace — or all'), the default roster, and the held-out groups. This gives an agent everything needed to construct correct calls.

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

Purpose5/5

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

States a specific verb and resource ('Switch on a group of tools') and clearly distinguishes itself from the fixed roster and other tools by explaining it affects the session's tool list. The contrast with the `?tools=all` connect-time route helps an agent understand exactly what this tool is for.

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

Usage Guidelines5/5

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

Gives explicit when-to-use instructions: 'CALL THIS THE MOMENT YOU NEED ONE' with concrete examples for ads and analytics. It also names the alternative ('?tools=all') for hosts that fix their roster at connect time, and explains when that route should be preferred.

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true and destructiveHint=false. The description adds valuable context: '0 credits' (cost), 'redacted occurrences' (privacy behavior), and 'shape-only echo of the inputs' (no raw sensitive data returned). These go beyond the annotations and set accurate expectations for a read-only operation.

Agents need to know what a tool does to the world before 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, tightly packed. The first sentence front-loads the purpose and contents; the second sentence adds the value proposition. No redundant phrases 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 one-parameter, read-only lookup with no output schema, the description fully covers what data is returned, where the fingerprint comes from, safety (read-only, 0 credits), and the purpose (bug reproducibility). 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?

Schema coverage is 100% and clearly documents fingerprint as 'the fp value from list_errors.' The description reinforces this by saying 'by fingerprint (from list_errors)' but does not add new semantic meaning 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?

States a specific verb and resource: 'One error group in full by fingerprint.' It clearly names the source (list_errors), specifies what is returned (every field, redacted occurrences, status, connector, job id, workspace, shape-only inputs), and distinguishes itself from list_errors by focusing on a single group in full detail.

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 workflow: start with list_errors to get a fingerprint, then call error_detail for the full error group details. It explains why you would use it ('This is what makes a bug reproducible') but does not explicitly list exclusions or compare against alternatives like get_job or list_errors.

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

export_swipefile_deckSwipefile to Google SlidesAInspect

Turn a SWIPEFILE COLLECTION into a real Google Slides deck — one slide per saved ad, carrying the creative, the brand, the ad copy, the run dates with the run length, and the platform. This is the thing a marketer actually presents to a client or a team; until now the swipefile’s only export was JSON. Returns the presentation id + URL. Creates a NEW deck every time: under the drive.file scope Hermoso can only touch files it created, so it cannot add slides to a deck the user already has. A creative whose ad-library link has expired cannot be embedded — Meta signs those URLs with a short expiry — so that slide says so in words and keeps its copy and run dates, and the reply reports how many. Needs Google Drive connected (Settings ▸ Connectors ▸ Google Drive — one connection covers Drive, Sheets, Docs and Slides).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax ads to include, 1-60 (default 30)
titleNodeck title (default: the collection name)
collectionNothe swipefile collection to export, by name or id (default: the first collection)

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial non-obvious behavior beyond annotations: every call creates a brand-new deck, the drive.file scope limits access to files Hermoso created, expired Meta ad-library links degrade gracefully to a text placeholder, and the reply reports how many such cases occurred. These details align with the annotations (not read-only, not idempotent).

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 main capability is front-loaded in the first sentence, and subsequent sentences add important constraints, failure modes, and prerequisites. It is somewhat dense and includes minor product framing, but each statement 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 mutating tool with no output schema, the description covers the output format (presentation id + URL), side-effect semantics, failure handling, permissions, and integration prerequisites. Nothing essential for correctly calling and interpreting the tool is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents limit, title, and collection. The tool description does not add parameter-level meaning, but it doesn't need to; the baseline of 3 applies because the schema carries that 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 names a specific verb and resource: turn a swipefile collection into a Google Slides deck with one slide per saved ad, including creative, brand, copy, run dates, and platform. This clearly distinguishes it from generic document/sheet tools and from the prior JSON-only export path.

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 frames the intended use case ('the thing a marketer actually presents to a client or a team'), states the Google Drive prerequisite, and warns that it cannot add slides to an existing user-owned deck. It does not name a sibling tool as an explicit alternative, so it stops short of a full when-not-to-use statement.

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

TDQS

A4.6/5.0
Behavior5/5

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

Discloses key behavioral traits beyond annotations: it is keyless/free, requires a confident match, returns 0 and saves nothing on ambiguity, saves screens with durable URLs, and makes them immediately usable. These details go well beyond the annotation flags and give the agent an accurate model of execution and failure.

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, each dense with useful information, and the core purpose is front-loaded. There is slight redundancy around the screens being saved and usable, and the emphatic 'REAL' adds tone but no fact, so it is not 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?

For a two-parameter tool with no output schema, the description covers defaults, side effects, failure behavior, auth/cost, persistence, and immediate usability. It even implies what a result looks like ('returns 0 screens') sufficiently for an agent to interpret the outcome.

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 at 100% coverage, including appName's default and brandId's fallback to the active brand. The description mostly restates the appName default without adding deeper semantic value, 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?

States the specific verb 'Pull... App Store screenshots into the workspace brand' with both the resource (App Store) and the side effect (saving into the brand). It names the intended downstream use (make_template_ad(template:'app-ui-tour')), which clearly distinguishes it from generic fetch or list tools in the sibling set.

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 gives trigger conditions: use when the brand has 0–1 app screens on file, when the user asks to 'pull my app's screenshots', or for a specific template. It also tells the agent not to retry with guesses and to relay a zero-result outcome plainly, making when-to-use and when-not-to-use clear.

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark this as read-only and non-destructive, and the description adds useful behavior beyond that by specifying the return shape (absolute URL and download URL) and accepted input forms (/generated/ path or any URL). It does not cover error behavior or authentication, but the safety profile is covered by 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 entire description is one concise sentence that front-loads the primary purpose and includes the most important input and output details. There is no wasted text or redundant restatement of the 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?

For a simple two-parameter tool with read-only annotations and no output schema, this description is complete. It explains what the tool takes, what it returns, and the kind of inputs it handles. No critical information is missing for an agent to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents the url and name parameters. The description adds marginal context by clarifying 'any URL' is accepted, but does not meaningfully expand on the parameter meanings beyond what the schema provides. 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 uses a specific verb ('Resolve') and identifies the exact resource ('generated asset reference') and output ('clickable absolute URL + a direct download URL'). It clearly distinguishes this tool from siblings like upload_file or store_get by focusing on URL resolution rather than storage or retrieval.

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 the tool: whenever a generated asset reference or URL needs to be converted into clickable and downloadable URLs. It does not explicitly name alternatives or exclusions, but the context is strong enough that an agent can recognize the correct use case.

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

fetch_social_dataFetch social dataA
Read-only
Inspect

Generic escape hatch for any ALLOWLISTED long-tail social/web 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 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesexact endpoint path, e.g. '/v1/tiktok/profile' — non-allowlisted paths are rejected
paramsNoendpoint query params, e.g. {handle:'nike'}

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already convey readOnlyHint=true and destructiveHint=false; the description adds meaningful behavioral context beyond that: allowlist enforcement via path, raw provider JSON output that is 'large and messy', and credit consumption. This gives the agent a strong sense of cost and output quality before invocation. 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.

Conciseness4/5

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

The description is front-loaded with the core escape-hatch concept and example, then logically flows into platform list, parameter conventions, and warnings. The platform list is long but necessary for a generic tool. Every sentence carries useful information, though the density is slightly high and could be tightened.

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 generic fallback tool with no output schema, the description covers the key operational facts: allowed platforms, parameter naming patterns, allowlist restriction, raw/voluminous output, and credit cost. A minor gap is lack of explicit mention of authentication or rate limits, but annotations and the given details are 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%, but the description adds semantic depth beyond the schema: it explains that param names vary per endpoint ('profiles use handle, keyword searches use query, Reddit uses subreddit') and clarifies that path must be an exact allowlisted endpoint. This materially improves an agent's ability to construct valid invocations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 role: 'Generic escape hatch for any ALLOWLISTED long-tail social/web endpoint the dedicated search_* tools don't cover.' This is a clear verb+resource+scope and explicitly distinguishes it from the search_* siblings. Concrete examples like '{path:'/v1/instagram/profile', params:{handle:'nike'}}' further anchor 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?

Usage guidance is explicit and actionable: use this only when 'dedicated search_* tools don't cover' an endpoint, and 'prefer the dedicated search_* tools' as the safer alternative. The WARNING about raw JSON and 'Spends credits' also adds cost/risk considerations that help an agent 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.

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 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

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds valuable behavioral context: results are 'grounded by web search', the tool costs '0 credits', and the default mode excludes the searched company. This goes beyond the annotations by clarifying the nature of the results and cost 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?

A single, dense sentence front-loads the core purpose, then efficiently covers the three modes and the zero-credit cost. There is no filler or redundancy, and every clause contributes 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?

For a simple two-parameter, read-only discovery tool, the description covers purpose, modes, default behavior, search grounding, and cost. The absence of an output schema means the description could mention the return shape in more detail, but 'Discover... brands' and the mode descriptions make the expected result reasonably clear.

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 'domain' and 'mode' are already documented within the input schema. The description largely restates the mode semantics rather than adding new parameter-level meaning, though it does clarify the default mode and the exclusion behavior in a more agent-readable way.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 ('Discover') and a clear resource ('a brand's competitor / similar / adjacent brands from its domain'), making the tool's purpose immediately identifiable. It also disambiguates itself from sibling tools like competitor_teardown and pull_competitor_ads by focusing on brand discovery rather than teardown or ad retrieval.

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: the tool discovers brands related to a given domain, with explicit mode options and defaults ('mode=competitors (default...)', 'inspiration...', 'company'). It does not explicitly name alternatives or state when not to use it, but the mode breakdown provides enough operational guidance for an agent to select appropriate calls.

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

find_creatorsFind the creators already winning in a nicheA
Read-only
Inspect

Scan organic TikTok, Instagram Reels and YouTube for a niche across a few query variants, fold the posts into creators, and rank them on median views, engagement rate and how often they show up for that niche; the top rows get follower counts AND public contact info (an Instagram business email / phone / category, the bio link, an email in a TikTok bio) so outreach can start from the result. Real people, not AI actors — for influencer sourcing, UGC casting and partnership prospecting ("who should we send product to?"). About one credit per search call (platforms × queries, default 3 × 3) plus one per enriched profile; repeats inside 20 minutes are free. Then shortlist (save_to_swipefile), check a profile (instagram_profile / fetch_social_data), draft outreach (generate_text), or approve them for Partnership Ads (manage_meta_partnership_creator).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNocreators to return, 1–30 (default 12)
nicheYesproduct category, topic or hashtag — "calorie tracker app", "matcha", "#cleanbeauty"
enrichNoread follower counts for the top 6 (default true, ~1 credit each)
queriesNoquery variants per platform, 1–4 (default 3); each is a paid search call
platformsNodefault all three
minAvgViewsNo
minEngagementNointeractions per view, 0–1 (0.05 = 5%)

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark it as read-only and non-destructive, and the description adds substantial behavioral context: credit costs per search and enrichment, free repeats within 20 minutes, default platform/query counts, ranking logic, and the inclusion of public contact info. This goes well beyond the 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.

Conciseness4/5

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

The description is front-loaded with the core purpose and remains dense and information-rich throughout. It packs ranking, enrichment, cost, use cases, and downstream actions into one paragraph, though the long sentence structure could be slightly easier 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?

For a tool with 7 parameters, no output schema, and multi-platform behavior, the description covers the essential operational details: what is returned, how results are ranked, cost model, default behaviors, and example use cases. Nothing critical is missing for an agent to select and call 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 high at 86%, and the description adds meaningful context beyond the schema, including credit implications, defaults (3×3, top 6 enrichment), and what 'queries' means. However, minAvgViews has no schema description and is also not explained in the description, leaving one gap 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 ('Scan'), exact resources (organic TikTok, Instagram Reels, YouTube), and a clear transformation pipeline: posts are folded into creators, ranked on median views, engagement rate, and niche frequency. It also distinguishes itself from related search tools by emphasizing creator-level aggregation and contact enrichment, not raw post 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?

The description explicitly names use cases — influencer sourcing, UGC casting, and partnership prospecting — with an illustrative question ('who should we send product to?'). It also shows downstream next steps (shortlist, check profile, draft outreach, approve for Partnership Ads), though it does not explicitly define when NOT to use this tool versus raw search siblings.

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

find_toolsFind a Hermoso tool by name or taskA
Read-onlyIdempotent
Inspect

Search EVERY Hermoso tool — including the paid-campaign (ads), analytics and channel_admin groups that are NOT in this session's starting list because of their size — by name, task or group, and get each one's parameters in one line. Use it the moment the user asks for something you do not see a tool for (a campaign, an ad set, a lead form, a click-to-WhatsApp ad, a report, keywords, audiences): a tool missing from your list is NEVER proof the feature is missing. Then run the tool with call_tool. Free, read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNolimit to one group: core, research, create, channels, channel_admin, analytics, ads, files, workspace
limitNohow many to return (default 12, max 40)
queryNowords from the task or the tool name, e.g. "lead form", "whatsapp", "google ads keyword", "meta insights"

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark read-only/idempotent/non-destructive, and the description adds cost (free), scope (includes ads, analytics, channel_admin groups omitted from session list), and output format (parameters in one line). This gives behavior beyond 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.

Conciseness4/5

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

The description is compact and front-loaded with the scope and trigger. It is slightly dense with parentheticals and repeats read-only from annotations, but every sentence contributes actionable guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 discovery tool with no output schema, it explains why tools may be missing, when to call, what the result contains, and the follow-up action. Nothing essential is missing 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.

Parameters3/5

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

Input schema provides 100% description coverage for query, group, and limit, so the baseline applies. The description echoes the idea of searching by name/task/group but adds no parameter-level detail beyond what the schema already offers.

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

Purpose5/5

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

Defines a specific verb and resource: search every Hermoso tool by name, task, or group and return parameters in one line. It also distinguishes itself by explaining scope beyond the session list, so an agent knows exactly what it 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?

Provides explicit trigger conditions: use whenever the user asks for something with no visible tool, listing campaign, ad set, lead form, report, keywords, audiences as examples. It also prevents false negatives by stating that a missing tool is never proof the feature is missing and gives the next step (call_tool).

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)

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say readOnly=false and destructive=false, so the description adds crucial behavioral detail: it is non-destructive because 'the original is untouched' and it 'Returns a NEW video.' It also discloses performance and cost characteristics (~30s, a couple of credits) and clarifies it uses no AI model, which meaningfully shapes agent expectations. 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 well-organized: core purpose up front, then pill behavior, then grain behavior, then a clear non-destructive return guarantee. Almost every clause delivers actionable information—constraints, defaults, mode combinations, and cost—without fluff. It earns 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?

For a 7-parameter tool with no output schema, the description covers inputs, conditional requirements, behavior, and return type well. It specifies the input is a served mp4 URL from a previous render/job, explains what a NEW video means, and documents the main mode interactions. It could be slightly more explicit about what happens to pill-related parameters when pills=false, but the schema and description together make this reasonably inferable.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value beyond the schema: it explains the relationship between pills and grain, gives character limits in prose, states copy quality guidance ('concrete real benefits, never fabricated stats'), and clarifies that header is required when pills is on. This goes beyond simply repeating property names and 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 states a specific action—post-process an EXISTING rendered video—and names the two concrete finishing modes: reviewer-style proof pills and film grain. The phrase 'no AI model' and 'existing rendered video' clearly distinguishes it from generation and broader editing siblings. This is a specific verb+resource definition, 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 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 context: apply it to an already-rendered served mp4 to add social-proof pills and/or an anti-AI grain pass. It also explains mode combinations, such as setting pills=false for a grain-only pass. However, it does not explicitly name sibling tools like edit_video, clip_video, or upscale_video or state when to prefer them instead, so it stops short of full alternative routing.

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

TDQS

A4.9/5.0
Behavior5/5

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

Although annotations only tell us readOnlyHint=false, destructiveHint=false, idempotentHint=false, the description clearly discloses the surprising behavior: video track is replaced while the rest of the video and ALL audio stay byte-identical. It also surfaces the billing consequence ('bills only the replacement clip's seconds (~1/3 of a full render)') and the lip-sync hazard. 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, each earning its place: behavior, when-to-use plus cost, and a critical do-not rule. The most important behavioral constraint is front-loaded ('VIDEO TRACK ONLY'), and the sibling-differentiating angle comes immediately. 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 complex surgical video-editing operation with no output schema, this description covers the key preconditions, constraints, side effects (audio preservation), billing model, and the one dangerous exclusion (speech overlap). The six parameters are all documented in the schema and the description maps them to behavioral context. Nothing critical is missing for an agent deciding to call it and pick a window.

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 a baseline of 3 applies. The description adds meaningful semantics beyond the schemas: it defines the window constraint (1.5-8s), the enforcement rule for speechWindows, and the billing implication of choosing a smaller window. It doesn't detail the exact format of refImage or prompt beyond 'what the replacement footage should show', but parameter semantics are largely carried by the schema.

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

Purpose5/5

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

States a specific verb ('surgically re-render ONE time window... and splice it back'), a specific resource (existing rendered video, VIDEO TRACK ONLY), and a precise scope. Differentiates itself from full re-render and from video siblings like clip_video or edit_video by describing the surgical splice 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 says when to use this tool ('when one beat/shot is broken... and a full re-render would waste the parts that worked'), what it bills, and gives a hard exclusion ('Do NOT pick a window covering spoken dialogue') with the mechanism to enforce it (pass speechWindows). This goes beyond any sibling definition.

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)

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the destructiveHint and idempotentHint annotations, the description adds meaningful behavioral detail: it records a cross-device delete, prevents the memory from coming back, and notes that the operation is minor and re-creatable, so no confirmation is needed. This gives the agent a strong safety and side-effect picture.

Agents need to know what a tool does to the world before 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: the primary action is stated first, followed by the most important behavioral implications and a rationale for not requiring confirmation. Every sentence contributes useful 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?

The description is complete for a single-parameter destructive tool: it identifies the target, the id source, the cross-device effect, durability of the deletion, and the re-creatable nature. Given the rich annotations and simple schema, 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 input schema already fully documents the sole parameter 'id' as 'the memory item id (from list_memory)', so schema coverage is 100%. The description repeats this source but adds no new parameter-level meaning, which aligns with the baseline score 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 verb 'Delete' and the resource 'saved Memory item', and specifies the identifier source ('by its id (from list_memory)'). This unambiguously distinguishes it from generic delete tools and related memory 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?

The description makes clear this tool is for deleting a specific saved memory using the id obtained from list_memory. It gives enough context for when to use it, though it does not explicitly mention alternative memory tools like tidy_memory or remember for comparison.

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

TDQS

A4.2/5.0
Behavior4/5

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

The description adds meaningful behavior beyond the annotations: it states that no cell values are changed, that the tool is never gated, and that defaults apply all three formatting actions to the first tab. It also explains how to skip individual steps with freezeRows:0, boldHeader:false, and autoResize:false. This is consistent with the idempotentHint and destructiveHint 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 information-dense and front-loads the core purpose with three clear actions. It then adds workflow context and parameter-level skip behavior in compact, scannable prose. Every sentence contributes operational value, and there is no redundant restating of the title or schema.

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

Completeness4/5

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

The description provides the canonical workflow, default behavior, skip flags, and a safety profile, which is strong for a low-complexity formatting tool. It is incomplete only in not addressing how to target the spreadsheet via sheetUrl or spreadsheetId, and there is no return-value note, though that is less critical for an action-style 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 only 33%, so the description must compensate. It does add semantics for autoResize and boldHeader by tying them to visible effects, and it clarifies freezeRows:0 and the default-first-tab behavior. However, sheetUrl and spreadsheetId are never explained in either the schema or the description, leaving a notable gap for how the target spreadsheet is identified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 ('Make ... readable') and enumerates three concrete formatting actions: bolding the header row, freezing it, and auto-sizing columns. It also names the resource (an exported Google Sheet) and positions the tool right after create_sheet, which differentiates it from other sheet-related 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 explicitly says 'Worth calling right after create_sheet,' giving a clear trigger and workflow context. It also notes that the tool 'changes no cell VALUE' and is 'never gated', which tells an agent when it is safe and appropriate to call. It does not enumerate alternative tools for value edits, but the provided guidance is sufficient for the common workflow.

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'1080p' (default) or '480p'/'720p' draft

TDQS

A4.2/5.0
Behavior4/5

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

Beyond annotations, it discloses three important behaviors: blocking with a 1–3 min wait, capability gating (canAvatar in hermoso_capabilities), and credit consumption. This goes well beyond the false readOnly/idempotent/destructive hints. It does not describe the return artifact, though no output schema is provided.

Agents need to know what a tool does to the world before 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 carries distinct value: what it does, how long it blocks, and what prerequisites/costs apply. No redundant filler; the core action 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 schema covers all parameters and annotations capture mutation/idempotency hints, the description supplies the missing operational context: duration, capability requirement, and credits. It leaves out what the tool returns or where the clip is saved, but the other essential context is complete enough for an agent to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains image, script, voice, and resolution. The description adds no new parameter-level meaning beyond hinting the image should be a portrait, 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 uses a specific verb/resource: 'Render a TALKING-AVATAR / creator lip-sync clip from a portrait image + a script.' This clearly differentiates it from siblings like generate_video, generate_voice, or make_explainer by naming the unique output type and inputs.

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 communicates when to invoke: when the user needs a talking-avatar/lip-sync clip from a portrait and script. It also gives prerequisites ('Requires the avatar capability...') and cost/duration context. It does not explicitly name alternatives or exclusions, so it is not a 5.

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

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. NOTE that the saved-brand hydration also decides the ENGINE: attaching product photos routes the render to the compositing model, so a model you named is only honoured when no references ride — pass raw:true (or useBrand:false) to render on exactly the model you asked for. model = a catalog id from hermoso_capabilities (omit for the default). RAW MODEL ACCESS: raw:true dispatches your prompt to the model BYTE-IDENTICAL — no rewriting, no appended guidance, no negative prompt, no brand references attached on your behalf. Credits, the durable delivery of the finished asset and the per-model validation are unchanged. Fast (seconds). Spends credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNoRAW MODEL ACCESS: run the caller’s prompt on the named model with no Hermoso adjustments at all — the prompt reaches the provider byte-identical (no hex-to-colour-name rewrite, no prepended fidelity preamble) and NO saved-brand product photos are attached, so the model you name is the model that renders. Use it to drive the raw catalog; leave it off for an on-brand ad. Billing, the durable Library landing and per-model validation are unchanged.
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'

TDQS

A4.1/5.0
Behavior5/5

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

Annotations carry no safety profile (all hints false/absent), so the description bears the full burden and delivers: it discloses credit spend, fast latency, that saved-brand hydration decides the engine, that a named model is only honored without references, and that raw:true reaches the provider byte-identical with no rewriting. No contradiction with annotations exists—'Spends credits' is consistent 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.

Conciseness3/5

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

The purpose is front-loaded and the content is organized into labeled sections, but the engine-routing guidance is effectively stated twice ('pass raw:true (or useBrand:false) to render on exactly the model you asked for' followed by the RAW MODEL ACCESS paragraph), and the ALL-CAPS headings add noise. The density is justified by real pitfalls, but trimming would improve readability.

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 no output schema, the description correctly covers the return value ('served URL'), durable delivery, per-model validation, and credit spending—the essentials for invoking correctly. Given the tool's high complexity (7 params, brand-hydration traps), coverage is strong; it is only light on failure modes and exact credit cost, which are likely covered by companion billing 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?

Schema coverage is 100%, so the baseline is 3. The description adds genuine value beyond the schema by explaining cross-parameter interactions the schema's per-field text does not: the refImages/useBrand/model/raw interplay, the wrong-brand compositing pitfall, and how engine routing is decided by brand hydration. aspectRatio and imageSize get no extra explanation, but the schema already covers them.

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

Purpose4/5

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

The opening sentence 'Render a finished ad IMAGE and return its served URL' states a specific verb, resource, and outcome, clearly separating it from generate_video, generate_text, and generate_avatar. However, it does not differentiate from the close sibling render_ad, so an agent must infer the boundary rather than have it stated.

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

Usage Guidelines4/5

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

Provides strong condition-based guidance: when to pass refImages, when to switch to useBrand:false (working a non-saved draft_brand), and when to use raw:true. The multi-brand caution and engine-routing note give concrete decision rules. It stops short of explicitly naming tool-level alternatives or exclusion criteria versus siblings like render_ad or make_template_ad.

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

generate_textGenerate textAInspect

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). BY DEFAULT the model answers as a marketing copywriter (a short house system prompt is applied, which is what you want for ad copy); pass raw:true for a plain, unstyled answer from the model itself with NO system prompt at all. model = a writing-model id from hermoso_capabilities (omit for the default Claude orchestrator). Paid (a credit or two by length).

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNoRAW MODEL ACCESS: send the prompt with NO Hermoso system prompt — the model answers as itself rather than as an ad copywriter. Use it whenever the ask is not marketing copy (analysis, code, extraction, a plain question). Default false: the copywriter framing is applied.
modelNoa writing-model id from hermoso_capabilities (a Claude / Gemini / GPT / Llama / DeepSeek id) — omit for the default
promptYesthe writing task / question

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only set hint flags to false, so the description carries the behavioral burden. It discloses that a house copywriter system prompt is applied by default, that raw:true strips it entirely, that the default model is the Claude orchestrator, and that the tool is paid by length. The only minor omission is mention of what the return value looks like.

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

Conciseness4/5

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

Dense but economical: it covers the catalog, use cases, sibling differentiation, default behavior, raw toggle, model default, and cost without fluff. The structure uses parentheticals and arrows effectively. It is slightly long, but every clause 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 three-parameter tool with no output schema and minimal annotations, the description covers selection criteria, behavioral defaults, cost, and alternatives. The only gap is the implicit, not explicit, return shape — the generated text — which is easily inferable from the tool name and purpose.

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 three parameters already described, so the baseline is 3. The description adds value beyond the schema by clarifying the default model ('omit for the default Claude orchestrator'), explaining why raw matters, and tying model ids to hermoso_capabilities.

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

Purpose5/5

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

States a specific verb+resource: 'Text generation against the writing-model catalog' and enumerates concrete use cases (ad copy, hooks, scripts, rewrites, brainstorms). It differentiates from siblings by explicitly routing finished creative to plan_ad → render_ad, and the 'text' scope distinguishes it from image/video/voice generation 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?

Gives explicit when-not-to-use: 'no ad assembly (for a finished on-brand creative use plan_ad → render_ad)'. Also provides a concrete condition for raw:true — whenever the ask is not marketing copy. Names the alternatives and the condition that selects them, leaving nothing to inference.

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

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 — the longest-clip model in the catalog today renders a full multi-beat spot of up to 30 SECONDS in ONE unbroken take with native synchronized audio, so never assume a generic 8–10s cap and never stitch something that fits one clip; durationSeconds must be one of the model’s durations from hermoso_capabilities, which is the live list. TO GET A SPECIFIC MODEL, NAME IT in model: an unnamed render is routed by the server’s own auto-pool, which is narrower than the catalog, so the longest-clip and highest-resolution models are reached by naming them and not by omitting the field. 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). RAW MODEL ACCESS: your prompt is NOT dispatched verbatim by default — a few small guards are appended (packaging/label safety when no reference image rides, a negative prompt on the models that take one, reference-binding lines when references ride) and hex colour codes are rewritten to colour names. Pass raw:true for none of that. raw:true dispatches your prompt to the model BYTE-IDENTICAL — no rewriting, no appended guidance, no negative prompt, no brand references attached on your behalf. Credits, the durable delivery of the finished asset and the per-model validation are unchanged. Spends credits (Starter plan is video-blocked server-side).

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNoRAW MODEL ACCESS: dispatch this prompt to the model BYTE-IDENTICAL — no appended packaging/label guidance, no negative prompt, no reference-binding lines, no hex-to-colour-name rewrite. Use it when you want the model itself rather than Hermoso's render craft. Two provider-mandated corrections still apply, because the vendor hard-fails without them: an @ImageN token that outnumbers the references actually shipped is dropped, and a prompt past the endpoint's published character cap is trimmed at a sentence boundary. Billing, durable delivery and per-model validation are unchanged.
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'1080p' default (what we ship and bill for); '480p'/'720p' = cheaper draft passes, '4k' = premium final delivery (more credits). NOT EVERY MODEL OFFERS EVERY TIER — this enum is what the tool accepts, and each model's OWN `resolutions` list in hermoso_capabilities is what it can actually render (the longest-clip 30s model, for one, tops out at 720p). Ask for a tier the chosen model does not list and it is rendered at that model's best available tier instead, with nothing in the reply saying so — so check `resolutions` before promising anyone 1080p or 4k.
aspectRatioNodefault '9:16'
durationSecondsNolength of THIS ONE clip in seconds — pick one of the CHOSEN model’s listed durations from hermoso_capabilities (never a generic guess: the lists differ per model, from 4–8s on the short models up to 30s on the longest-clip one). This is a single continuous generation, so it CANNOT exceed that model’s longest clip: a longer ask is REFUSED with nothing rendered and nothing charged (it is never quietly truncated). Past ~15s only the long-clip models qualify, and an unnamed render is routed by the narrower auto-pool — so NAME the model in `model` when you are asking for a long single take. For a spot longer than any one clip, use plan_ad with durationSeconds then render_ad, which stitches acts of at most one model clip each (on a 15s-clip model, 40s = 15+15+10).

TDQS

A4.8/5.0
Behavior5/5

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

With annotations carrying almost nothing (readOnly=false, destructive=false), the description carries the full behavioral burden and succeeds. It discloses the automatic music bed and extra charge, prompt rewriting guards, refusal rather than truncation for over-long durations, resolution fallback, 1–3 minute render time, and credit spending—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.

Conciseness4/5

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

The description is long but the tool is genuinely complex with 12 parameters, billing implications, model routing caveats, and raw-mode behavior. It is front-loaded with the core purpose and sibling distinction before diving into warnings. Some redundancy with the schema exists, and the heavy use of caps adds noise, but every block adds unique operational guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 no output schema, the description still covers the return value (mp4 URL), render duration, cost/credits, audio defaults, raw dispatch behavior, edit-via-refVideo semantics, resolution fallback, and long-clip stitching via plan_ad/render_ad. It is unusually complete for a video-generation tool, leaving little for an agent to guess.

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 still adds real decision-making value beyond the schema: it tells agents that durationSeconds must come from hermoso_capabilities and not a generic cap, that naming the model is the only way to reach the longest-clip models, and that audio:false is the only way to decline the charged music bed. That pushes it 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: 'Render a RAW video clip from your own prompt and return its served mp4 URL.' It explicitly distinguishes itself from render_ad for finished brand ads, so an agent can immediately tell this is the raw/experimental generation path rather than the polished ad 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 gives explicit when-to-use guidance: prefer render_ad for finished brand ads, use this for raw clips or precise manual control. It also explains when to pass refVideo for editing instead of generating, when to name a model, and when to use raw:true, with clear routing intent throughout.

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) — a name that engine does not have is REFUSED for free with its real list, and a few engines generate their own voice and take no preset at all (the reply says which voice actually spoke). 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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations are minimal (all hints false), so the description carries the full burden and excels: it reveals refusal behavior for invalid voice names, engines that ignore the voice parameter, that the response reports which voice actually spoke, and the paid cost structure. These are exactly the behavioral traits an agent needs to predict outcomes.

Agents need to know what a tool does to the world before 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 dense paragraph with no filler. The first clause states the core function, the second routes to alternatives, and the remainder unpacks parameter behavior. Every sentence (and most clauses) 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 no output schema, the description must convey what the call returns — it does (MP3 URL, actual voice spoken). It also covers required input, default engine, voice selection nuances, cost, and the 900-character limit. An agent has everything needed 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?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful extra nuance beyond the schema: the engine-voice dependency, engine defaults, the refusal mechanism, and the pointer to hermoso_capabilities for valid presets. This elevates it above baseline, though the schema already does substantial 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 a precise verb-resource-output statement: 'RAW text-to-speech from the voice-model catalog: speak a script in a chosen voice and return the served MP3 URL.' It then explicitly names sibling tools it is not — render_ad, generate_video, change_voice — making differentiation immediate 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?

States the exact use case ('standalone voiceover / narration clip') and clearly says 'NOT for adding audio to a video,' then names the three alternatives and what they do. No room for an agent to confuse this with a sibling.

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 it when you need to know whether a brand is on file: if hasBrand is true you can omit brand everywhere; if false, onboard with draft_brand. Not a required first step before a render: the create tools read the saved brand by themselves. 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint and non-destructive annotations, the description adds meaningful behavior: it returns a brand profile plus learned memory, exposes a hasBrand flag, is scoped to the current account/workspace, and costs 0 credits. No hidden side effects are implied.

Agents need to know what a tool does to the world before 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: what the tool returns, when to call it, and when it is unnecessary. The '0 credits' note is useful and compact, and the guidance 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 zero-parameter, read-only tool with no output schema, the description gives enough context: the agent learns what data is returned, how to interpret hasBrand, what follow-up action to take, and that a prior call is not required for renders. 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?

The input schema has zero properties, so there are no parameters requiring explanation. The description correctly avoids inventing parameter details and instead focuses on the output/decision value, which is appropriate for a zero-parameter tool.

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

Purpose5/5

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

The description identifies a specific resource (the saved brand profile plus learned memory) and a clear purpose: checking whether a brand is on file. It also distinguishes itself from draft_brand and the create tools by explaining this is not a required first step.

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 call the tool ('when you need to know whether a brand is on file'), what to do based on hasBrand, and when not to call it because create tools read the saved brand themselves. This gives the agent clear routing guidance.

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)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description independently confirms 'Read-only.' It adds value by listing the returned metadata fields, which is especially useful because there is no output schema. It does not cover auth or error behavior, but the read-only safety profile is adequately disclosed.

Agents need to know what a tool does to the world before 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-load the operation and return fields, then give the required parameter and a safety note. There is no filler or redundant explanation.

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

Completeness5/5

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

For a one-parameter read-only getter, the description covers what it does, what it returns, where fileId comes from, and that it is safe. Listing the returned fields compensates fully for the absence of an 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 fileId parameter is 100% documented in the schema as 'the Drive file id (from list_drive_files)', and the description repeats that provenance without adding format, constraints, or validation details. Since schema coverage is high, this meets the baseline but adds little beyond 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 opens with the verb 'Fetch' and the resource 'one Drive file's metadata', then enumerates the exact returned fields (name, type, size, modified time, webViewLink, webContentLink). This clearly distinguishes it from list_drive_files, update_drive_file, delete_drive_file, and get_onedrive_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 instruction 'Pass fileId (from list_drive_files)' anchors the intended workflow: first list Drive files, then fetch details for one ID. It does not explicitly name alternative tools or exclusions, but for a single-ID metadata read the usage context is clear.

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

get_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. An id that does not exist on this account answers status "not_found" — that is FINAL: stop polling it, and do not re-fire the render (that double-charges).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesthe job id, e.g. job_xxx

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint and destructiveHint annotations, the description discloses important non-obvious behaviors: renders can take 1–3 minutes, repeated calls are normal, not_found is a final terminal state, and re-firing the render double-charges. This is exactly the kind of behavioral context an agent needs to avoid costly mistakes.

Agents need to know what a tool does to the world before 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, each earning its place. The description front-loads the core purpose and return values, then provides crucial polling and terminal-state guidance without any 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 single-parameter read-only polling tool with no output schema, the description fully covers what the agent needs: return values, expected duration, polling behavior, terminal states, and the consequence of re-firing. 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 input schema already fully documents the sole required parameter 'id' with an example format. The description adds no additional parameter-specific semantics beyond restating 'by id,' 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 states a specific verb and resource: 'Poll a render job by id.' It clearly defines the tool's output (status, progress, media URL) and, by focusing on polling a single job by id, distinguishes itself from the sibling list_jobs that lists jobs generally.

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: keep polling every 1–3 minutes until done/error without asking the user, and treat not_found as final. It does not explicitly name alternatives or state when not to use this tool, but the polling 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.

get_linkedin_leadRead one LinkedIn leadA
Read-onlyIdempotent
Inspect

One LinkedIn lead by id (from list_linkedin_leads), with every answer named by field. Personal data — show, never republish. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
leadIdYes
pageIdNothe company Page that owns the form — from list_linkedin_pages; omit when one Page is shared
adAccountIdNoread forms owned by an AD ACCOUNT instead of a Page

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds meaningful behavioral context beyond annotations: 'Personal data — show, never republish' and responses with every answer named by field. 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 one tight sentence that front-loads the operation and includes only value-adding details: source of id, response format, data-handling rule, and read-only/free status. No filler or repetition of schema 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?

For a simple single-resource read with strong annotations, the description covers ID source, response naming, and personal-data handling. It could add explicit not-found or error behavior, but nothing critical is missing for correct invocation.

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

Parameters4/5

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

The schema describes pageId and adAccountId with specific guidance, while the description supplies the missing semantics for leadId by pointing to list_linkedin_leads as the source. At 67% schema coverage, this is adequate compensation for the undocumented required 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 'One LinkedIn lead by id,' identifying a specific read-by-id operation and even names the source listing tool, list_linkedin_leads. This distinguishes it from list_linkedin_leads, list_linkedin_lead_events, and other 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 Guidelines4/5

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

The description tells the agent that the lead id comes from list_linkedin_leads, providing a clear acquisition path. It does not explicitly name alternatives or exclusions, but the singular-by-id framing and source reference give clear usage context.

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)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds value beyond annotations by disclosing exactly what the returned metadata includes, including the two links. This gives the agent a concrete expectation of behavior without contradicting 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 concise sentences with no filler. The core purpose and output fields are front-loaded, and the fileId source is stated at the end. 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 single-parameter read-only tool with no output schema, the description provides everything needed: what the tool returns, where the required parameter comes from, and the safety profile. Nothing essential is missing for correct invocation and 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?

Schema description coverage is 100%, with fileId already described as 'the OneDrive item id (from list_onedrive_files)'. The description repeats this provenance rather than adding new semantic detail, so it meets the baseline but does not exceed 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 and resource: 'Fetch one OneDrive item’s metadata', and lists the exact return fields (name, type, size, modified time, webViewLink, webContentLink). This clearly distinguishes it from list_onedrive_files (which lists many items) and get_drive_file (which is not 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?

The description gives clear usage context by telling the agent to pass fileId from list_onedrive_files, which establishes the prerequisite and source of the identifier. It does not explicitly state when not to use this tool or name alternatives like get_drive_file, but the read-only framing and 'from list_onedrive_files' hint are sufficient for most selection scenarios.

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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false; the description reinforces this with 'Read-only' and adds non-obvious behavior details: dry-run mode, render budget, next-run timing, queued count, and blocked channels with reasons. 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 front-loaded sentences cover the full status surface without filler. 'Read-only, free' earns its place because it affects tool selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 output schema, the description must stand in for return values, and it does so by listing on/off, dry-run, fill-ahead days, budget, next run, queued posts, and blocked channels. This is complete for a zero-parameter read-only status 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 has zero parameters, so there is no parameter burden for the description. It still clarifies that the tool operates on 'this brand,' which is enough context given no input is 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?

States a specific verb and resource: 'Show the automatic posting refill for this brand' and enumerates the exact status fields. It is clearly differentiated from siblings like set_post_refill and run_post_refill by focusing on status inspection.

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 'Show' framing and explicit 'Read-only, free' signal that this is an inspection tool, giving clear context for when to call it. It does not explicitly name set_post_refill or run_post_refill as alternatives, but the context makes the distinction clear.

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

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only'. It adds context that the settings match the web app's Settings pane and that the operation is free, but it does not go beyond annotations in describing side effects or behaviors.

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

Conciseness5/5

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

Three short sentences, each earning its place: the first states the resource and contents, the second anchors it to the web app, and the third confirms safety and cost. 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 parameterless read-only settings tool, the description is complete enough. It enumerates the settings an agent would receive and gives the scope ('this account'), so an agent can invoke it correctly without an output schema.

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 largely irrelevant. Baseline 4 applies because the description still clarifies what data the tool exposes, which is more than the empty schema does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 a specific resource ('this account's app settings'), then enumerates exactly what the settings contain: language, theme, and the competitor-watch email toggle. This clearly distinguishes it from write-oriented siblings like update_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 gives clear context: it is the read-only counterpart to the web app's Settings pane, so an agent knows when to call it for inspection. It does not explicitly name update_settings as the alternative for changes, but 'Read-only' and the enumerated settings make the usage boundary clear.

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only, free.' It adds useful behavioral context by explaining what the tool returns (full SKILL.md instructions) and how those instructions should be used afterward. Failure modes are not covered, which is acceptable for a read-only loader.

Agents need to know what a tool does to the world before 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 the core purpose, the source of valid inputs, the next step, and the read-only/free nature. There is no filler 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 one-parameter, read-only tool without an output schema, the description sufficiently explains what the tool returns and how to use it in a broader workflow. Nothing critical for invoking it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% for the single required parameter, including a type, requirement, and example value. The description adds no new parameter semantics beyond restating that loading is by name, 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 uses a specific verb ('Load') and a clear resource ('bundled skill's full SKILL.md workflow instructions by name'), and it references list_skills as the source of valid names. This differentiates it from siblings like list_skills, save_skill, and delete_skill without needing to open schemas.

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 states the intended workflow: get the name from list_skills, load the SKILL.md, then follow those instructions with other tools. It does not explicitly spell out when not to use the tool, but the sequencing and source constraint are clear enough for an agent.

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

hermoso_capabilitiesStart here: what Hermoso can do and what it costsA
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 flags. Call it when you need a specific model id, an exact cost, or a capability you are not sure of. It is NOT a prerequisite for rendering: generate_image, generate_video and render_ad all run with model omitted and route to the server’s own default. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only, free.' It adds meaningful behavioral context beyond the annotations: the operation is a live probe of current account capabilities, lists the specific response contents, and clarifies that it carries no credit cost and is not a required precondition for rendering.

Agents need to know what a tool does to the world before 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 tightly packed sentences with no filler: it front-loads what the tool returns, then gives when to call it, then explicitly addresses a common false assumption about rendering prerequisites, then closes with safety/cost signal. 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 has no parameters and no output schema, the description carries the full burden of explaining what comes back, and it does: model ids, credit costs, aspect ratios, video durations, recipe ids, and capability flags. It also covers cost, safety, and relationship to sibling generators, making the tool fully actionable without additional lookup.

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 accepts zero parameters and schema description coverage is 100%, so there is no parameter documentation burden. The description accurately treats it as a no-input probe, and any parameter semantics would be irrelevant 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 opens with a specific verb ('Probe') and a clear resource: what the Hermoso account can do right now, enumerating exactly the data returned (model ids, credit costs, aspect ratios, durations, recipe ids, flags). It also distinguishes itself from rendering siblings by explicitly stating it is not a prerequisite for generate_image, 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 Guidelines5/5

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

It gives explicit trigger conditions: 'Call it when you need a specific model id, an exact cost, or a capability you are not sure of.' It also provides an exclusion and names the alternatives: rendering tools run fine with model omitted and route to the server's default, so agents know not to call this as a prerequisite.

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, the credits this account has spent on the calls listed, those recent priced calls, and costModel — the one-sentence rule of what costs credits. THE RULE: only AI model runs and Ad Spy research spend credits; publishing, scheduling, ads management, analytics, comments, DMs and connectors are FREE on every plan (X is the single per-call exception). Check before kicking off paid generation; answer "does posting cost credits?" with NO.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the tool as read-only and non-destructive, so no side-effect warning is needed. The description adds value by disclosing the exact data returned, including balance, spent credits, recent priced calls, and the cost model, which is otherwise undocumented since there is no 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.

Conciseness4/5

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

The core behavior is front-loaded in the first sentence, and the cost rule is presented as a compact block. The phrasing around 'the calls listed, those recent priced calls' is slightly awkward, but every sentence carries meaningful 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 zero-parameter read-only tool with no output schema, the description fully covers what the agent needs: what is returned, which operations consume credits, and the canonical answer to a common question. No critical context 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 and schema coverage is effectively 100%, so there is no parameter documentation gap. The description appropriately focuses on the tool's output and cost rule rather than fabricating parameter 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?

Description opens with 'Return the account credit balance...' a specific verb and clear resource. It also states what else is returned (spent credits, recent priced calls, costModel), making it easy to distinguish from generic billing or purchase tools like billing_status and buy_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?

Explicitly instructs agents to check this tool 'before kicking off paid generation' and tells them to answer 'does posting cost credits?' with 'NO'. It does not name alternative tools, but the cost rule effectively defines when and when not to rely on this tool.

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

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations by explicitly warning that this 'SENDS a real email invite / share link — an account change' and requires confirm:true. It discloses the irreversible, real-world side effect and instructs the agent to verify the exact email and role with the user, which is critical for safe invocation.

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

Conciseness5/5

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

Three tight sentences with no wasted words. The core purpose is front-loaded, the side-effect warning follows immediately, and the confirmation instruction is placed last as the action gating. 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 side-effectful invite tool with no output schema, the description covers all essentials: what the tool does, role meaning, the real-world action, and the confirmation requirement. There is enough information for an agent to call 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?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema by explaining the role values ('member = read-only on billing, admin = full') and reinforcing the confirm parameter's requirement. This helps the agent choose the right role and understand the user-facing impact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 ('Invite someone to this brand workspace by email') and distinguishes this from sibling tools like remove_member and set_role by focusing on adding a teammate with a side-effectful invite. The role semantics are explicitly defined, 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?

The description gives clear context for use: invite by email, choose member vs admin, and confirm with the user before calling. It does not explicitly name alternatives or exclusion conditions, but the context makes it clear this is the tool for inviting new teammates, distinct from set_role or remove_member.

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

leave_connectorRemove my own account from a shared connectionA
DestructiveIdempotent
Inspect

On a connector that several teammates can contribute their OWN account to (see list_connectors — the row reports multiContributor), remove YOURS from this brand: your stored credential is dropped and the accounts you shared stop being shared. Your teammates' accounts on the same connection keep working, and nothing changes at the provider — reconnecting in a browser shares again. Use this instead of disconnect_connector when the connection is not yours to remove: disconnect_connector revokes the grant at the provider and only the person who created the connection may call it.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYesprovider id exactly as list_connectors reports it, e.g. "linkedin", "tiktok_ads", "meta"

TDQS

A4.9/5.0
Behavior5/5

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

The description goes well beyond the annotations by detailing exactly what happens: stored credential dropped, shared accounts stop being shared, teammates' accounts keep working, provider unchanged, and reconnecting shares again. This gives the agent a precise model of side effects and reversibility, which is essential for a destructive 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 dense but every sentence contributes: the multiContributor precondition, concrete effects, teammate/provider behavior, and explicit comparison to disconnect_connector. There is no filler or repetition of schema/annotation 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 destructive single-parameter tool with no output schema, the description covers the full decision surface: when to use, what gets removed, what does not get removed, provider-side behavior, and how to recover by reconnecting. An agent has everything needed 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?

The schema already documents the provider parameter with 100% coverage, so the baseline is 3. The description adds extra value by specifying that the provider id must match exactly what list_connectors reports and gives concrete examples, reducing the risk of incorrect 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 states a specific action — remove your own account from a shared connector — and clearly distinguishes it from disconnect_connector, which revokes the provider grant. The scope ('remove YOURS', not the whole connection) is explicit and prevents confusion with 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 tells the agent when to use this tool instead of disconnect_connector, and explains why: disconnect_connector is only callable by the connection creator and revokes the grant at the provider. It also tells the agent to check list_connectors for multiContributor status before using, giving clear decision criteria.

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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only, free.' It also adds behavior beyond annotations: it reports the currently active brand, includes shared team workspaces, and warns about the empty-brand illusion caused by acting on the wrong workspace. 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 purpose, then efficiently covers usage flow and troubleshooting in a few sentences. Every sentence adds value, 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?

For a zero-parameter, read-only list tool, the description is complete: it states what is returned (id and name plus active brand and shared workspaces), how to use the results with use_brand, and when to call it diagnostically. No output schema exists, but the description sufficiently explains the return contents.

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 input schema fully covers the invocation surface. The description correctly adds no parameter details because none are needed, and the baseline for zero-parameter tools 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 uses a specific verb ('List') and precisely defines the resource scope: every brand on the account, the brand the connection currently acts on, and shared team workspaces. This clearly distinguishes list_brands from related tools like get_brand, use_brand, create_brand, and delete_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?

It explicitly tells agents to call this tool first in multi-brand accounts and then use_brand to switch, including how shared workspaces are handled. It also gives a concrete diagnostic rule: if a brand looks empty despite the app showing it full, call this tool to verify which workspace is active.

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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and non-destructive behavior, and the description reinforces this with 'Read-only, 0 credits.' It adds valuable operational context: the results are scoped to the brand, multiple businesses may share one Google login, and the agent must ask the user rather than guess the right listing.

Agents need to know what a tool does to the world before 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: scope, output fields, usage rule, user-selection requirement, fallback procedure, safety note, and prerequisite. It is front-loaded with the core purpose and reads naturally 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?

Even without an output schema, the description fully explains what the tool returns, when to call it, what to do when multiple listings are shared, what to do when none are shared, and the connector prerequisite. An agent has everything needed to 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 parameter count is 0 and schema coverage is 100%, so there are no parameter semantics to document. The baseline for zero-parameter tools is 4, and the description appropriately focuses on output fields and selection behavior instead.

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

Purpose5/5

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

The description names a specific verb and resource: listing Google Business Profile listings shared with the current brand, including exact output fields. It clearly distinguishes this from other list_* tools by emphasizing the brand-scoping, which is essential for avoiding posting to the wrong storefront.

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 to call this before posting when more than one listing is shared and to let the user pick. It also provides the exact fallback path when nothing is shared: use list_connector_accounts('google_business') and set_connector_accounts, and never guess a listing.

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: tiktok, x, youtube, threads, bluesky, telegram, reddit, pinterest, instagram, meta, google_ads, linkedin, pinterest_ads, linkedin_ads, reddit_ads, apple_ads, microsoft_ads, google_business, google_analytics, snapchat_ads, x_ads, tiktok_ads, google_tag_manager, google_search_console, bing_webmaster. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYeswhich connector’s accounts to list

TDQS

A4.4/5.0
Behavior5/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces and expands on this by stating 'Read-only, free' and explaining that only the ticked accounts can be posted to or spent from. This gives useful behavioral context beyond the annotations, 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 core purpose and usage guidance are front-loaded in the first sentences, and the additional context about user selection and read-only behavior earns its place. However, the long provider list duplicates the schema enum, adding redundancy that keeps it from a perfect score.

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

Completeness5/5

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

For a one-parameter, read-only listing tool, the description covers purpose, output concept (available identities and brand permissions), provider scope, usage ordering, and safety. Even without an output schema, an agent has enough to call and interpret the tool appropriately.

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 single provider parameter with an enum and 'which connector’s accounts to list'. The description repeats the provider list but adds no deeper semantic meaning 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 uses a specific verb ('Show') and resource (connector accounts/identities) and goes beyond a generic list by explaining it reveals both every identity a connected account can act as and which ones the current BRAND is allowed to use. This clearly distinguishes it from sibling tools like list_connectors or platform-specific list_meta_pages.

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 context for when to use the tool: 'Call this before set_connector_accounts' and instructs the agent to let the USER pick and never guess. It provides clear when-to-use guidance, though it does not explicitly enumerate when not to use it or compare it to alternative list tools beyond set_connector_accounts.

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. IT ALSO FLAGS A CONNECTION WHOSE PERMISSIONS ARE OUT OF DATE: a provider writes its granted permission set into the token at consent time, so a connection authorized before a permission was approved does not carry it and never will — those calls are refused by the provider and no retry or wait can change it. Check this FIRST when a connected provider starts refusing things. The fix is a browser: the user reconnects under Workspace ▸ Connectors. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior5/5

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

Adds substantial behavioral context beyond the readOnlyHint/destructiveHint annotations: the permission set is frozen into the token at consent time, an outdated connection never carries newly approved permissions, provider calls will be refused, and no retry or wait can fix it. This discloses an irreversibility trap that annotations and schema cannot express. The 'Read-only, free' note is consistent with the annotations; no contradiction.

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

Conciseness4/5

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

The description is longer than average but front-loaded with the core purpose before the diagnostic deep-dive. Every sentence earns its place — the stale-permission explanation is high-value operational knowledge, not filler. The ALL-CAPS emphasis is a stylistic choice that aids scanning rather than harming 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?

For a zero-parameter, read-only diagnostic tool with no output schema, this is complete: it states what is returned, the meaning of the stale-permission flag, when to invoke the tool, and what action resolves the flagged condition. An agent can select, call, and interpret results without ambiguity.

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 100% schema coverage, the schema has nothing to document. The description compensates by specifying what the result contains (provider, status, label, available providers, stale-permission flag), which helps an agent interpret the response even though no output schema exists.

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

Purpose4/5

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

The description names a specific verb (List) and resource (third-party accounts connected to this workspace) and enumerates the output fields: provider, status, connected account label, plus available-to-connect providers. It is clearly distinguishable from siblings by its stale-permission flagging feature, though it does not explicitly name a sibling like list_connector_accounts to draw the contrast.

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

Usage Guidelines4/5

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

Gives an explicit trigger condition: 'Check this FIRST when a connected provider starts refusing things.' It also explains why waiting/retrying is futile and directs the remediation path (browser reconnect under Workspace ▸ Connectors). It lacks an explicit when-not-to-use or named alternative tool, but the guidance is concrete and actionable.

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)

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only, FREE.' It goes further by disclosing the exact shape of each returned entry, the cost/continuity implications of recasting, and the honest-empty-result behavior. No annotation 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?

Though long, the description is densely packed with actionable information and every sentence earns its place. The core 'what' is front-loaded, followed by reuse handles and workflow guidance. Nothing is redundant 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 read-only listing tool with no output schema, the description fully compensates: it enumerates return fields, explains empty-result semantics, warns against inventing data, and maps the returned portrait/creator info to downstream tool parameters. An agent can use this tool correctly with no missing 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 description coverage is 100% for the single parameter, and the schema already documents 'limit' with its default. The description adds no parameter-specific meaning, but given complete schema coverage, it does not need to. 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 and resource: 'List this workspace’s SAVED CREATORS — the reusable on-camera cast.' It clearly distinguishes saved creators from other creator-related tools like find_creators by defining what counts as a creator here and what the call returns.

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 the agent when to call this tool ('CALL THIS BEFORE OFFERING TO GENERATE A NEW PERSON'), what to do on an empty result (offer generate_avatar / save_creator, never invent a roster), and how to feed results into render_ad, generate_avatar, generate_video, recast_motion, and generate_image. This is model usage guidance.

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)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: the drive.file scope limitation, that it never exposes the user's entire Drive, and that it only lists files Hermoso created or the user handed over. This is valuable but not exhaustive; 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 carry a lot of signal: scope, use case, filter patterns, pagination, and read-only nature. The most important scoping constraint is front-loaded, 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?

For a read-only listing tool with no output schema and six optional parameters, the description provides enough context to call it correctly: what is listed, what is not, how to filter, and how to paginate. The remaining parameter details are already fully documented in the input schema.

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 summarizing filtering intent ('Filter by query ... folderId ... or onlyFolders:true') and highlighting pagination with pageToken, which helps an agent choose parameter combinations even though the schema already documents each parameter individually.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 Google Drive files & folders') and clarifies the exact scope Hermoso can reach, which distinguishes it from sibling tools like list_onedrive_files and get_drive_file. It also gives a concrete use case: finding the id of a user-picked 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 explicitly says when to use the tool ('This is how you find the id of a file the user picked') and gives useful filtering patterns. It does not explicitly name an alternative tool or 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.

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)

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare read-only and non-destructive behavior. The description adds much more: grouping by fingerprint, hit count and first/last seen, defects-first sorting, the ours/user/unknown classification policy with 'never guessed', redaction of free text/tokens/emails/creative, input echoes showing shape not content, and scope behavior. This is far 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 dense but every sentence earns its place: core grouping and row semantics, classification values, redaction behavior, filter options, and access scope. It front-loads the main purpose and uses no filler. The one long sentence is still well-structured and immediately informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 output schema, the description compensates by explaining the row model (fingerprint groups, hit count, first/last seen), sort order, classification meanings, redaction effects, filter opportunities, credit cost, and permissions. An agent has enough to call the tool correctly and interpret the result 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?

The input schema already has 100% description coverage, so the baseline is 3. The tool description enriches the `kind` enum with concrete examples ('not-connected or out-of-credits', 'vendor 4xx') and the 'never guessed' caveat, and it explicitly names the filterable surfaces. It does not add meaning for `limit` or `since`, so a modest boost to 4 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 precise definition: 'errors actually recorded against this workspace, GROUPED by fingerprint' and explains the grouping unit, row contents, and sort order. It clearly distinguishes itself from sibling `error_detail` by describing an aggregate, classified list rather than a single error's detail. The verb and resource are 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 gives clear context: read-only, 0 credits, scoped to the current workspace, with optional filtering by surface or kind. It also notes the admin-key expansion to all accounts. However, it never explicitly contrasts with the sibling `error_detail` or states when not to use this tool, so it falls short of full routing guidance.

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

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 our 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

TDQS

A4.3/5.0
Behavior5/5

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

The description goes far beyond the readOnly/destructive annotations by disclosing suppression rules below 5 posts, the refusal to compare across channels, the distinction between untried-hook facts and recommendations, and why unusable hooks are marked so. This gives an agent accurate expectations about output reliability 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 dense and front-loaded with purpose, then usage, then limitations. It is longer than average, but most sentences carry important behavioral caveats, so the length is 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?

With no output schema, the description carries the burden of explaining return content, and it does: hooks, settings, traction per hook, suppressed verdicts, and unusable-hook reasons. It stops short of specifying the exact output shape, but it is sufficiently complete for an agent to call and interpret 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 already has a substantive description. The tool description adds some relational context, especially around authentic renders and on-screen-text hooks, but it does not meaningfully extend the schema's parameter docs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 resource and scope: a curated menu of visual scroll-stop hooks and settings accepted by plan_ad and render_ad, plus measured traction per hook. It clearly distinguishes this from generation/planning tools by its role as the underlying library and performance record.

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: call before planning an ad to choose a hook deliberately, and after publishing to see what is landing. It does not name or contrast alternative list/research tools, but the when-to-use 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.

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

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds the behavioral scope of recency and the running-count aggregation, but it does not disclose fields, ordering, or limits, so it is useful but not rich.

Agents need to know what a tool does to the world before 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, front-loaded sentence with no filler; every clause adds information about scope, output, or intended use.

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 zero-parameter read-only list, the description reveals the key outputs: recent jobs and currently running count, plus a purpose. It could be more precise about result fields or limits, but nothing critical is missing for basic 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 has nothing to document. The description clarifies that the tool returns recent jobs plus a running count, which is the only semantic content an agent needs for 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 names a specific verb ('list'), a concrete resource ('render jobs'), and the precise scope ('most recent' + running count). This differentiates it from sibling get_job and other list_* tools without needing the schema.

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

Usage Guidelines4/5

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

It gives a clear use context: reporting on or resuming in-flight work, with no explicit exclusions or alternative tools. A sibling such as get_job exists for detailed lookups, but the description does not explicitly route between them.

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)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare this as read-only, idempotent, and non-destructive. The description adds genuinely useful behavioral context: the result set is newest-first, matches the web app's Library, returns served URLs, and includes each asset's kind, model, and age. It also notes the operation is free, which is useful cost-related 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?

Two tightly written sentences, with the most important scope information ('workspace Library', 'newest first') front-loaded. Returns, downstream usage, and cost/read-only status are conveyed 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?

Despite having no output schema, the description clearly explains what the tool returns: served URLs, asset kind, model, and age. It also covers ordering, scope, and how to connect to fetch_asset. For a simple list operation with well-covered parameters and rich annotations, 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 description coverage is 100%, so both parameters (kind and limit) are already documented in the input schema. The description adds light semantic context by mentioning images/videos and asset kinds, but it does not meaningfully extend 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 uses a specific verb ('Browse') and identifies the exact resource: this workspace's Library, containing every image/video generated in the Studio, newest first. It also clarifies the tool's scope with 'the same Library the web app shows,' making it easy to distinguish from generic list_* 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 clear context for when to use the tool: browsing generated assets in the workspace Library. It also points the agent to a concrete follow-up path by saying served URLs can be handed to fetch_asset for a download link. It does not explicitly enumerate when not to use it versus other listing tools, but the context is strong enough.

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

list_linkedin_lead_eventsLinkedIn lead events received in real timeA
Read-onlyIdempotent
Inspect

The lead events LinkedIn has PUSHED to Hermoso for this brand (new lead / deleted lead, with the form and the lead id), newest first. Empty means none have arrived, not that none exist — list_linkedin_leads reads every lead regardless, and subscribe_linkedin_leads is what starts delivery. Read a lead’s answers with get_linkedin_lead. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnlyHint and idempotentHint annotations, the description adds meaningful behavioral context: events are pushed by LinkedIn, the list is newest first, an empty result means no events have arrived rather than no leads exist, and the operation is read-only and free. 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 part earns its place: purpose, event contents, ordering, empty-list semantics, sibling tool differentiation, and a read-only/free note. It front-loads the core behavior and does not waste 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 listing tool with no output schema, the description covers the event contents, ordering, empty result meaning, and related tools. The only notable gap is the undocumented limit parameter, which is minor given the tool's low complexity.

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 only parameter, limit, has no schema description and 0% schema coverage, and the tool description does not explain it either. While the name is somewhat self-explanatory, the description fails to state whether it caps the number of returned events or how it interacts with the newest-first ordering.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 lead events pushed to Hermoso for the brand, including new/deleted lead events with form and lead id, sorted newest first. It also differentiates itself from list_linkedin_leads, making 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?

The description explicitly explains when this tool is appropriate versus alternatives: list_linkedin_leads reads every lead regardless of events, subscribe_linkedin_leads starts delivery, and get_linkedin_lead reads a lead's answers. This gives the agent clear routing guidance.

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

list_linkedin_lead_formsList LinkedIn lead gen formsA
Read-onlyIdempotent
Inspect

The LEAD GEN FORMS a LinkedIn company Page or ad account owns — id, name, state, version and the fields each one asks for (firstName, email, company …). Forms are created in Campaign Manager or on the Page; this API reads them and cannot create one. If it answers that the connection must be reconnected, say exactly that: the lead-sync permission is granted at authorise time. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdNothe company Page that owns the form — from list_linkedin_pages; omit when one Page is shared
adAccountIdNoread forms owned by an AD ACCOUNT instead of a Page

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds useful behavioral context beyond that: it notes the API cannot create forms, explains the lead-sync permission is granted at authorize time, and flags the reconnection messaging behavior. It does not contradict the annotations. Slight deduction because it does not detail output shape or pagination, but with read-only/idempotent annotations the bar is lower.

Agents need to know what a tool does to the world before 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 core resource and scope are front-loaded, the read-only boundary is stated next, and the reconnection instruction is a practical, necessary addition. 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 read-only list tool with zero required params and full schema coverage, the description is nearly complete. It could add a bit more about output/pagination, but the annotations cover safety, the schema covers parameters, and the description covers scope and the key edge case of permission/reconnection. The sibling tool set is large, but the description is sufficient to avoid confusion with lead events, lead subscriptions, or page listings.

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 schema already documents pageId and adAccountId. The description adds context that pageId comes from list_linkedin_pages and that omitting it is valid when one Page is shared, but the description itself does not go into deep param-specific semantics 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 states a specific verb ('List'), resource ('LEAD GEN FORMS'), and scope ('a LinkedIn company Page or ad account owns'), and distinguishes itself by clarifying it is a read-only API that cannot create forms. It clearly differentiates from siblings like list_linkedin_leads, list_linkedin_lead_events, and delete_linkedin_lead_subscription.

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 what the tool returns, how forms are created (Campaign Manager or Page), and that the API only reads them. It also provides a conditional instruction: if the tool answers that the connection must be reconnected, say exactly that, because the lead-sync permission is granted at authorize time. This gives clear when-to-use guidance and behavioral context.

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

list_linkedin_leadsList LinkedIn leads (form responses)A
Read-onlyIdempotent
Inspect

The LEADS a LinkedIn lead gen form collected — every response with its answers keyed by field (firstName, lastName, email, company, …), the campaign and creative that produced it, the consents ticked, and whether it was a test lead. Newest first. Filter by formId, a since/until window (ISO date or epoch ms — LinkedIn takes epoch), or testLeadsOnly. THIS IS PERSONAL DATA: show it to the user, hand it to the CRM they name, never repeat it into a post or an unrelated tool. Pass start for the next page. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoper page, max 100
sinceNoISO date or epoch milliseconds
startNooffset for the next page
untilNo
formIdNoonly this form (from list_linkedin_lead_forms)
pageIdNothe company Page that owns the form — from list_linkedin_pages; omit when one Page is shared
leadTypeNodefaults by owner: SPONSORED for an ad account, COMPANY (organic Page form) for a Page; EVENT for event forms. LinkedIn refuses SPONSORED on a Page owner
adAccountIdNoread forms owned by an AD ACCOUNT instead of a Page
formVersionNodefault 1
testLeadsOnlyNotrue returns ONLY test submissions

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint/idempotentHint annotations, the description adds meaningful behavioral detail: personal-data handling instructions, newest-first ordering, pagination via start, the epoch-vs-ISO nuance, and a read-only confirmation. It also discloses that the data is personal and should not be repeated into posts or unrelated tools.

Agents need to know what a tool does to the world before 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, each earning its place: return payload and ordering, filter options, then privacy warning plus pagination. There is no filler and the most differentiating 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 read-only list tool with 10 parameters and no output schema, the description covers the essential invocation details: what is returned, how to filter, how to paginate, and how to handle sensitive data. Remaining parameter nuances are left to the high-coverage schema.

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 90%, so the baseline is 3. The description adds real value by explaining the since/until window format and that LinkedIn expects epoch milliseconds, which is especially useful since the until parameter lacks a schema description. It also frames formId and testLeadsOnly as primary filters.

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

Purpose5/5

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

The description names a clear verb and resource ('The LEADS a LinkedIn lead gen form collected') and enumerates exactly what is returned: answers by field, campaign/creative, consents, test lead flag. This distinguishes it from sibling tools such as list_linkedin_lead_forms and get_linkedin_lead.

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 concrete usage context: filter by formId, since/until window, or testLeadsOnly, and pass start for the next page. However, it never explicitly names alternatives or states when-not-to-use, so the guidance is clear but lacks explicit exclusions.

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

list_linkedin_lead_subscriptionsList LinkedIn lead webhooksA
Read-onlyIdempotent
Inspect

The lead notification webhooks registered on a LinkedIn Page or ad account, with the id delete_linkedin_lead_subscription takes. Read-only, free.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdNothe company Page that owns the form — from list_linkedin_pages; omit when one Page is shared
leadTypeNo
adAccountIdNoread forms owned by an AD ACCOUNT instead of a Page

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds useful context by noting the operation is free and by connecting the returned webhook ids to delete_linkedin_lead_subscription. 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.

Conciseness3/5

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

The description is short and front-loaded with the resource, but the clause 'with the id delete_linkedin_lead_subscription takes' is grammatically awkward and makes the intended meaning harder to parse. It is compact but not fully clear.

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?

For a read-only list tool with zero required parameters and safety annotations, it is close to sufficient. However, there is no output schema, the leadType parameter is unexplained, and the description provides only a weak hint about the return value, so an agent may not fully understand the result or filtering options.

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 documents pageId and adAccountId, and the description reinforces the Page-versus-ad-account scope. However, leadType has no schema description and the tool description does not clarify its meaning or optional behavior, leaving a real 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 names a specific resource—'lead notification webhooks'—and the action is listing them, scoped to a LinkedIn Page or ad account. This clearly distinguishes it from sibling tools like list_linkedin_lead_forms and list_linkedin_lead_events.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus alternatives. It does not mention related tools such as list_linkedin_lead_forms, list_linkedin_lead_events, or subscribe_linkedin_leads, so an agent must infer routing from the name alone.

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

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

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint and destructiveHint annotations, the description adds meaningful behavioral detail: it lists the returned fields, explains the empty-result meaning (no admin role OR missing organization scopes), and instructs the agent not to guess an id. It also explicitly says 'Read-only, free,' reinforcing the 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 compact and front-loaded: it opens with the core purpose, then the critical usage warning, then edge-case handling, and closes with read-only/free status. Every sentence contributes useful 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?

For a simple parameterless list tool, the description fully covers what is returned, when to call it, how to interpret an empty result, and the behavioral guardrail about not guessing an id. The annotations already cover safety, and no output schema exists, so the description carries the needed context well.

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 explain. The schema coverage is effectively complete and the description adds no parameter-related detail, which is appropriate for a parameterless tool. Baseline of 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 states a specific verb and resource: 'List the LinkedIn COMPANY PAGES the connected account administers' with the exact returned fields (id, name, role). It clearly stands apart from sibling posting tools like post_to_linkedin_page and list_meta_pages by scoping to LinkedIn company Pages under the connected 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 an explicit when-to-use rule: 'ALWAYS call this before post_to_linkedin_page when there is more than one Page' and explains the risk. It does not explicitly state when not to use it or compare with alternative listing tools, but it provides a clear operational context and a condition for calling it.

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)

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description need not restate safety; 'Read-only, free' reinforces this without contradiction. The description adds valuable behavioral context beyond annotations: facts are 'durable,' scoped to 'this workspace,' and identical to what the web app displays, clarifying the source of truth and persistence semantics.

Agents need to know what a tool does to the world before 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. It front-loads the action and resource ('List the durable facts & preferences saved in this workspace's Memory'), then adds purpose and safety context. Every clause earns its place, and the length is appropriate for a simple tool.

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 tool with two optional parameters and no output schema, the description is largely complete: it explains what is listed, the scope, the relationship to the web app, and the relevance to future ads. It could explicitly note that the result is a list of individual memory entries or mention the 'Preference' category, but these are minor gaps given the explicit verb and 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%, with both limit and category fully described in the input schema. The description itself does not add parameter-level semantics, but that is acceptable because the schema already carries the burden. The category values in the schema align with the categories named in the description, which helps but is not additional parameter guidance.

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 a specific verb and resource: list the durable facts and preferences saved in the workspace's Memory. It also distinguishes the content scope (brand, audience, taste, do/don't rules) and links it to the web app, making the tool's function unmistakable. However, it does not explicitly differentiate it from related sibling tools like remember, forget, or tidy_memory.

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

Usage Guidelines3/5

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

The phrase 'These shape every future ad' implies this tool is useful when an agent needs to know the studio's stored memory before making ad-related decisions. It also signals the tool is safe by saying 'Read-only, free.' However, there is no explicit guidance about when to use this instead of remembering, forgetting, or tidying memory, nor any exclusion conditions.

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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark this as read-only and non-destructive. The description adds useful behavioral context: it requires a connected Meta account, and it returns a connect hint when the account is not connected. This is meaningful beyond what annotations provide, though it does not describe the return format or empty-state 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?

Two sentences with no wasted words. The action and scope are front-loaded, followed by the usage context and prerequisite. 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 zero-parameter, read-only list tool, the description is complete: it states what is listed, when to use it, what prerequisite must be met, and what happens if that prerequisite is not satisfied. No important operational detail 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 the baseline is 4. The description confirms data comes from the connected Meta account, which is sufficient since there is nothing else to explain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 ('List') and precise resource ('Facebook Pages with any linked Instagram business account and ad accounts on the connected Meta account'). It clarifies scope well and is easily distinguishable from sibling tools like list_meta_posts or 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 explicitly says to use it before post_to_meta / create_meta_campaign to pick the target, which is strong when-to-use guidance. It also states the prerequisite of having connected Meta. It does not explicitly mention when not to use it or compare it to alternative listing tools, so it misses the full exclusion guidance.

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
accountNowhich Instagram account — an @handle or id from list_connector_accounts("instagram"). Needed when several are linked, and the way an Instagram Login (standalone) account is reached; omit for the one Page-linked account.
includeUnpublishedNoFacebook only — also return unpublished drafts (hidden by default)

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already provide readOnlyHint=true and destructiveHint=false, and the description reinforces and extends this with 'Read-only, 0 credits' and 'Only ever reads a Page the brand has connected.' It also discloses important edge behaviors not in annotations: Instagram Stories are excluded, Facebook hides unpublished drafts unless requested, and the tool can surface postIds for later reads. This goes well beyond the structured data.

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

Conciseness4/5

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

The description packs a lot into a single paragraph and front-loads the core purpose and scope. The all-caps sentence and the historical aside about the only previous way to obtain a postId are slightly verbose, but each sentence contributes distinct value: scope, purpose, use cases, parameter quirks, constraints, and cost.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 6 optional parameters, no output schema, and multiple edge cases, this description is complete: it lists the returned fields, names the dependent tools, covers Stories exclusion, unpublished drafts, credit cost, and the account target behavior. An agent has enough to call it correctly and to explain its result to a user.

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 has 100% description coverage, so the baseline is 3. The description adds practical meaning beyond the schema: 'Pass target:'instagram' for the linked IG account' clarifies the enum option, and 'Facebook hides unpublished drafts unless you ask for them' explains the real-world effect of includeUnpublished. It doesn't add much for limit/cursor/pageId, 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 starts with a specific verb and resource: 'List the connected Facebook Page's or Instagram account's OWN existing posts' with an explicit field list (id, caption, permalink, publish date, format). It strongly differentiates from siblings by emphasizing 'OWN' posts and positioning itself as 'THE TOOL THAT GETS YOU THE postId every other Meta read needs' — an agent can immediately tell it apart from list_published_posts, post_performance, and 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 Guidelines5/5

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

The description gives explicit use cases: 'Use it for "how did our last few posts do", to find a post the user describes loosely, or before backfill_posts.' It also names dependent tools (meta_post_insights, list_meta_comments, manage_meta_post) and the previous fallback (post_to_meta), which tells the agent exactly when this tool is the right route rather than a sibling.

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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only.' It adds useful behavioral context: default root listing, search fallback, folder-only filtering, and pagination via a previous cursor, all 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.

Conciseness5/5

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

The description is compact and front-loaded: the first sentence gives the core purpose and modes, the second covers the onlyFolders filter, and the third covers pagination and read-only nature. 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 read-only list tool with fully documented parameters and safety annotations, the description covers all invocation paths (root, folder, search, folders-only) and pagination. No output schema exists, but the return shape is evident from 'List files & folders' plus the parameter descriptions.

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 meaning by defining the root default, the relationship between query and name search, and how pageToken carries pagination state from a previous call. This goes beyond simply restating the schema.

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

Purpose5/5

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

States a specific verb ('List') and resource ('files & folders in the user's OneDrive') with clear scope variations: root, folderId, query, and onlyFolders. This distinguishes it from sibling list_drive_files via the OneDrive resource and from get_onedrive_file via the list-vs-get verb.

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 by explaining the root-by-default behavior, folder listing via folderId, name search via query, folder-only filtering, and pagination with pageToken. It does not explicitly name alternatives or exclusions, but the operational modes are unambiguous.

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

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds important non-obvious behavior: it reports 0 credits, requires Pinterest to be connected, and states Hermoso must never auto-select a board. This gives the agent actionable 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?

Three tight sentences, each earning its place: purpose and return fields, mandatory usage order and user-decision policy, then credits and prerequisite. Information is front-loaded and there is 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?

For a simple read-only list tool with one optional parameter and no output schema, the description fully covers return contents, prerequisites, invocation ordering, user involvement, and cost. 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?

Schema description coverage is 100%, and the only parameter, privacy, is fully documented in the schema with its enum and default behavior. The description does not add extra parameter-level meaning, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource: 'List the boards on the user’s connected Pinterest account' and enumerates the returned fields (id, name, privacy, pin count). It clearly distinguishes itself from post_to_pinterest and other connector 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 Guidelines5/5

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

Explicitly instructs when to use it: 'ALWAYS call this before post_to_pinterest' and requires the USER to pick a board. It also names the prerequisite ('Needs Pinterest connected') and the relevant settings location, leaving no ambiguity.

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)

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only, free.' It adds useful context about the source of the playbooks (from teardowns, angle mining, and creatives) and that it mirrors the web app's Playbooks tab. It does not add details like pagination or rate limits, but these are not critical for a simple read-only listing.

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 and front-loads the core action. The definition of playbooks and the usage guidance each add value. The 'Read-only, free' clause is slightly redundant with the annotations, but it does not bloat the description significantly.

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 tool with two optional parameters and no output schema, the description sufficiently explains what is listed, where the data comes from, and when to use it. It does not describe return values, but the schema already covers the 'full' and 'limit' behavior, so an agent can call the tool correctly without additional detail.

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 'full' and 'limit' have descriptive comments explaining their behavior. The tool description itself adds no parameter-specific meaning, 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 states a specific action and resource: 'List the PLAYBOOKS saved in this workspace'. It further defines what playbooks are (reusable strategy cards with hooks, angles, formats, plays) and anchors them to the web app's Playbooks tab, which clearly distinguishes this tool from sibling list tools like list_hooks and list_swipefile.

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 usage context: 'Read one before planning an ad so you re-run what already worked instead of starting cold.' This tells the agent when to call the tool. It does not explicitly name alternative tools or 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.

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

TDQS

A4.6/5.0
Behavior5/5

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

Annotations mark readOnlyHint=true and destructiveHint=false, and the description adds valuable context: the call is FREE, returns each photo's url + label, reads the saved brand, and brandId switches the active brand. It also discloses the non-obvious shared-library behavior where photos from other creations surface.

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 information-dense sentences with the core purpose front-loaded and no filler. The parentheticals add useful detail but make the structure 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?

For a simple read-only list tool with one optional parameter and no output schema, this description is complete: it specifies the return shape, brand selection behavior, when to call it, and the unusual visibility across creations. 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 coverage is 100%, but the description goes beyond the schema by explaining the omit-vs-pass distinction for brandId and the active-brand switching side effect. This adds meaningful semantics that the schema alone does not convey.

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

Purpose5/5

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

States a precise operation: listing product photos already saved in the workspace, and further delimits the contents (brand product library, app-store screens, and photos from other creations). This clearly distinguishes it from related tools like set_product_image and list_library.

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 instructs the agent to call this before set_product_image to see reusable photos, and explains when to pass brandId versus omitting it to use the active brand. It does not name when-not-to-use conditions or alternatives, 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.

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

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnlyHint=true, destructiveHint=false), so the description carries the interpretation burden and delivers richly: the captured-vs-backfilled provenance distinction and what each implies about hook reliability, the 'dash means no number — NOT zero engagement' missing-data semantics, and the 0-credit cost note. These materially change how an agent should interpret rows.

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

Conciseness4/5

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

The core function and return fields are front-loaded in the first sentence, with provenance and dash semantics following in decreasing order of importance. There is slight redundancy between 'every post Hermoso has recorded publishing for this brand' and 'the brand's own publishing history,' but each sentence otherwise carries distinct, necessary information.

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

Completeness4/5

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

With no output schema, the description carries the full burden of explaining results and does so well: field list, provenance marker, dash semantics, and cost are all covered. The one blemish is calling it 'all nine channels' while the channel schema enumerates ten values — a small inconsistency an agent could trip on.

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 schema already documents limit (max posts, default 50, max 200, newest first) and channel (full enumeration of ten values). The description adds no parameter-level detail beyond the schema, so it correctly sits at the high-coverage baseline 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 names a specific verb and resource — listing every post Hermoso has recorded publishing for this brand — and enumerates the exact return fields (channel, permalink, caption, format, HOOK, SUBJECT, engagement). The 'brand's own publishing history' framing clearly distinguishes it from platform-fetch tools like list_meta_posts and from upcoming-post tools like list_scheduled.

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 context for use: it is the brand's memory that makes 'which hook worked?' answerable, telling an agent when this tool is the right call. However, it never explicitly names alternatives or when-not-to-use conditions, despite close siblings like list_meta_posts, list_scheduled, and backfill_posts that would benefit from routing guidance.

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

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only, 0 credits.' More importantly, it adds a non-obvious behavioral trait: per-channel outcomes per fired item, preventing a single misleading verdict. This is valuable context beyond the 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?

Two tight sentences. The first front-loads the core purpose, the second adds the key distinguishing behavioral detail, and the final phrase handles safety and cost. 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, zero-parameter list tool without an output schema, the description fully covers what the tool does, what makes it special (per-channel outcomes), and its safety/cost profile. No gaps that would prevent correct selection or 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 takes zero parameters, so the description carries no parameter burden. The baseline of 4 for a no-parameter tool applies; nothing is missing, and the description doesn't need to explain parameter meanings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 ('Show') and a precise resource: 'what is queued to post and what already went out.' It clearly distinguishes this from siblings like list_published_posts by covering both scheduled and past/fired items, and adds the per-channel outcome angle that makes its domain unmistakable.

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: to inspect queued and past posts. However, it does not explicitly name alternatives or state when not to use it, and there are several nearby siblings (list_published_posts, list_meta_posts, diagnose_posts). The context is clear but the routing guidance is left to inference.

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

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)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only and non-destructive behavior; the description adds the output shape (name, sheetId, row/column count, position) and explicitly notes it is free. This adds useful context beyond the structured annotations, though it does not discuss failure modes or 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.

Conciseness5/5

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

Three tightly-written sentences earn their place: the first defines the output, the second gives precise usage timing, and the third confirms safety and cost. Information is front-loaded and there is 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?

For a read-only listing tool with no output schema, the description provides the return fields in prose, the exact triggering conditions, and the associated sibling tools. Combined with a fully documented input schema, 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?

Schema coverage is 100%, so the schema already documents both parameters fully. The description does not add guidance on choosing between sheetUrl and spreadsheetId or explain precedence, so it stays at 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?

Clearly identifies the resource (tabs in a Google Spreadsheet) and what is returned: name, numeric sheetId, row/column count, and position. It also differentiates from related sheet-mutation tools by positioning itself as the discovery step that precedes them.

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 BEFORE naming a tab in update_sheet, clear_sheet_range, manage_sheet_tabs, or format_sheet, and before deleting a tab. It frames the tool as the way to learn actual file contents instead of guessing, which is actionable and unambiguous.

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

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description largely repeats that with 'Read-only'. It adds useful extras like 'free' and specifies the scope (bundled plus in-app strategy skills and creative recipes), but it does not disclose return format, ordering, or whether the listing is exhaustive. The read-only behavior is covered by annotations, so the description adds modest value beyond 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 compact passage with the core action front-loaded. Every clause adds value: what skills are, examples, scope, routing to get_skill, and cost/safety. There is no filler or redundant restatement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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-style tool with strong safety annotations, the description is complete. It explains what the tool returns conceptually, gives the domain context needed to interpret the list, names the related loading tool, and notes cost. No output schema exists, but the return value of a skill listing is obvious from the 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?

The tool has zero parameters and schema description coverage is 100%, so there is no parameter meaning for the description to clarify. Baseline 4 applies for parameterless tools; the description appropriately spends no space on parameters.

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

Purpose5/5

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

The description states a specific verb ('List') and resource ('bundled Hermoso SKILLS'), then defines what a skill is with concrete examples ('research an ad space, plan+render a finished ad'). It also distinguishes itself from related tools by naming get_skill, which prevents confusion with load/delete/save skill 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 explicitly tells the agent to 'Call get_skill to load a bundle', making the boundary between listing and loading clear. It frames the tool's purpose as discovery/orientation, and the added 'Read-only, free' note reinforces when this is a safe, low-cost choice.

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

TDQS

A4.3/5.0
Behavior4/5

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

The description adds context beyond the readOnlyHint and destructiveHint annotations by explicitly stating 'Read-only, free' and enumerating every returned data field (advertiser, headline, body copy, media URL, platform, saved date, taste tags). It also clarifies that the data mirrors the web app's Swipefile tab, which is useful behavioral context. 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 compact yet information-dense. It front-loads the core purpose, then adds a clarifying equivalence to the web app, then practical use cases, and ends with a one-sentence safety note. 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?

There is no output schema, so the description carries the burden of explaining return values, and it does so thoroughly by listing the fields returned for each ad. The limit and collection semantics are covered by the input schema, and the read-only/free status is stated. For a simple listing tool, 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?

Schema description coverage is 100%, so the baseline is 3. The description does not add meaning beyond the schema for 'limit' or 'collection'; it only reinforces the schema's own field descriptions. Since the schema handles parameter documentation completely, a 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 and resource ('List this workspace's SWIPEFILE') and immediately explains what the board contains with an explicit list of fields. It distinguishes itself from siblings like save_to_swipefile and export_swipefile_deck by framing it as the read-only research board mirroring the web app's Swipefile tab.

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 context and three concrete use cases: answering 'what have we saved?', mining the user's taste before planning an ad, and finding a reference to remix. It does not explicitly name alternatives or say when not to use this tool, so it misses the 'when-not/alternatives' criterion for a 5.

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

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds useful context about workspace scoping and output fields. It does not disclose potential limitations such as pagination or workspace-switching behavior, but for a zero-parameter read-only list the annotations carry most of the safety 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?

A single, information-dense sentence that front-loads the action and resource, then adds scope and output fields. No filler, no repetition of the title, and every phrase contributes to understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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, non-destructive list tool, the description is complete: it identifies the resource, scope, output fields, and cost/safety profile. No output schema exists, but the description sufficiently conveys what the agent should expect.

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 and schema coverage is 100%, so the schema already fully documents the input surface. The description adds contextual meaning about what is being listed and the fields returned, which is appropriate for a no-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious 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 states a specific verb ('List'), specific resource ('members of the current brand workspace'), and expected output fields (email, role, status). It clearly differentiates from sibling tools like invite_member, remove_member, and set_role, which perform different team-management 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 clearly frames this as a read-only listing operation scoped to the current brand workspace, and the 'free' note implies no cost or side effects. It does not explicitly list exclusions or alternatives, but the context makes the intended usage evident against siblings that modify membership.

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

list_telegram_chatsFind Telegram chat idsA
Read-onlyIdempotent
Inspect

Find the chat ids this Telegram bot can be addressed by. STATE THE LIMIT WHENEVER YOU USE IT: this is NOT the list of chats the bot belongs to — the Bot API publishes no such method — it is every chat that SENT the bot an update in the last 24 hours, which is as long as Telegram keeps an update. A channel the bot posts to every day but nobody messages will NOT appear here, and its absence means nothing at all: post to it by @username or numeric id anyway. If the bot has an outgoing WEBHOOK configured the list is empty for that reason alone (Telegram: getUpdates "will not work if an outgoing webhook is set up"), and the reply says so rather than reading as an empty account. Nothing is consumed — no update offset is confirmed, so this cannot eat the bot’s pending updates. Free, 0 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many recent updates to scan, 1–100 (default 100)

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description deepens all of these: 'Nothing is consumed — no update offset is confirmed, so this cannot eat the bot's pending updates' explains the idempotency mechanism, and 'Free, 0 credits' adds cost behavior. The 24-hour retention window and webhook caveat are non-obvious behavioral traits disclosed 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 nearly every clause earns its place by preventing a real misinterpretation: membership vs. senders, the 24-hour window, the webhook empty-list trap, and the no-consumption guarantee. It is front-loaded with purpose and scoping before caveats. Minor verbosity such as the inline Telegram quote and 'whose absence means nothing at all' 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?

With no output schema, the description must convey return semantics, and it does: the result is chat ids addressable by the bot. It covers the data source (updates in last 24h), the edge case (webhook configured → empty with explanation), side effects (none), and cost (free). For a one-parameter list tool with tricky domain semantics, nothing needed for correct invocation is missing.

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

Parameters3/5

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

Schema coverage is 100% — the single 'limit' parameter is fully described as 'how many recent updates to scan, 1–100 (default 100)'. The description references the limit ('STATE THE LIMIT') and ties it to the 24-hour recency window, adding mild context, but the schema already carries the semantic load. 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 opening sentence states a specific verb and resource: 'Find the chat ids this Telegram bot can be addressed by.' This clearly distinguishes the tool from siblings like post_to_telegram and the other list_* tools, and the title reinforces the same purpose without contradiction.

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 operational guidance: 'STATE THE LIMIT WHENEVER YOU USE IT,' explains what the tool is NOT ('NOT the list of chats the bot belongs to'), and tells the agent what to do in the channel case ('post to it by @username or numeric id anyway'). It also explains how to interpret the webhook empty-list case, which is direct when-to-trust guidance.

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

list_watch_findingsRead the competitor watchA
Read-only
Inspect

Read what the standing COMPETITOR WATCH has found — the new ads each watched brand has launched since the last check, plus the watch's own state (who is watched, when it last ran, when it runs next, and whether the last run actually succeeded). The same board the web app's Ad Spy ▸ Watching tab renders. Use it to answer "what are our competitors running that's new?", to feed a teardown, or to save something worth keeping with save_to_swipefile. Findings marked seed:true are NOT new launches — the first check of a brand has nothing to diff against, so it seeds the board with what that brand is running right now; only later runs surface genuine changes. Read-only and free — it returns the stored results of past runs and never triggers a check (set_competitor_watch({runNow:true}) is what runs one).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax findings to return (default 25, max 75 — the server keeps at most 75, and at most 15 per brand)
competitorNoonly findings for this watched brand (exact name as returned in `watching`) — omit for all of them

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already set readOnlyHint=true and destructiveHint=false, and the description reinforces this by stating it is 'Read-only and free' and 'returns the stored results of past runs.' It adds the crucial behavioral caveat that seed:true findings are not new launches, explaining the first-check seeding behavior. 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 detailed but every sentence adds value: core purpose, equivalent web UI, use cases, seed semantics, and the distinction from set_competitor_watch. It is front-loaded with the main action and places caveats after the core message. 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?

Even though there is no output schema, the description explains what the return includes: new ads, watch state, last-run status, and next-run timing. It also explains the meaning of seed:true findings, which is essential for correct interpretation. For a read-only list tool with two optional parameters, this 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 description coverage is 100%, so the limit and competitor parameters are already fully documented in the schema. The description does not add parameter-level detail beyond what the schema provides. This meets the baseline for full schema coverage.

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

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 what the standing COMPETITOR WATCH has found.' It clearly distinguishes the tool from the sibling that actually runs a check, set_competitor_watch, by explicitly saying this tool 'never triggers a check.' The scope is concrete: new ads since last check plus watch state.

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 use cases: answering 'what are our competitors running that's new?', feeding a teardown, or saving items with save_to_swipefile. It also names the alternative for triggering a run: set_competitor_watch({runNow:true}). This gives an agent 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.

list_whatsapp_accountsWhatsApp Business accounts and numbersA
Read-only
Inspect

The WhatsApp Business Accounts SHARED WITH THIS BRAND and the phone numbers registered on each — the ids every other WhatsApp tool needs, plus each number’s QUALITY RATING, which is what decides how many messages Meta will let it send. Start here. A WABA with no number cannot send anything and the reply says so: Hermoso does not register or verify numbers, that is WhatsApp Manager. A business portfolio that could not be read is REPORTED rather than dropped — an account missing from this list would read as "the brand has no WhatsApp", which is a claim about their business and not about our read. TWO ACCOUNTS CAN CARRY THE SAME DISPLAY NAME — always quote the display field or the id when naming one to a user, never the bare name. ONLY THE ACCOUNTS SHARED WITH THIS BRAND ARE REACHABLE. One Meta login often administers WhatsApp for several businesses, so a human ticks which belong to this brand under Settings ▸ Connectors ▸ Meta ▸ Manage accounts (or set_connector_accounts(provider:"meta")); nothing else here can see or touch the rest. With none ticked every WhatsApp tool refuses and names that as the way out. With exactly ONE ticked, wabaId is optional — pass it only to disambiguate. Read-only, 0 credits (WhatsApp conversations are billed by META to the business directly, never in Hermoso credits). Needs Meta connected.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, it discloses account-sharing scoping, quality-rating semantics, the duplicate display-name pitfall, failure behavior (unread portfolios are reported rather than silently dropped), and billing/credit implications. It also states the read-only nature and Meta connection requirement, all consistent with 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 long but every sentence adds a necessary caveat, and the primary purpose plus key output fields are front-loaded. Important warnings are highlighted with capitals, making them 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?

Even without an output schema, it tells the agent what the response contains (account ids, phone numbers, quality ratings, a display field), how failures manifest, and what prerequisites must hold. For a zero-parameter read-only list tool, 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?

This tool has zero parameters and schema coverage is 100%, so there is nothing for the description to document. The discussion of wabaId being optional refers to downstream WhatsApp tools, not this list call, which avoids inventing parameters that do not exist.

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 verb ('List') and the resource: WhatsApp Business Accounts shared with this brand, plus their phone numbers and quality ratings. It also frames itself as the entry point ('Start here') for the IDs other WhatsApp tools need, but it does not explicitly name a sibling tool to contrast itself with.

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 ('Start here'), explains the ID's role for other WhatsApp tools, and provides routing context through alternatives like WhatsApp Manager and set_connector_accounts. It does not explicitly say 'use tool X instead when...', but the account-sharing scope and connector management path effectively steer the agent.

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 — 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 a stills film needs to read as a film rather than a slideshow; '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

TDQS

A4.9/5.0
Behavior5/5

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

While annotations are minimal (readOnlyHint: false, etc.), the description is exceptionally transparent about behavior. It discloses that the tool takes "SEVERAL minutes — one image render per frame; independent frames are painted concurrently, so it is far faster than the frame count suggests." It explains the internal motion mechanism ("the motion is the CUT RATE — a slow move on a still shimmers"), the compositing engine ("Chrome+ffmpeg engine the ads use"), text rendering ("text is never model-painted, so it never garbles"), the styled-look locking behavior, cost implications, and the fact that it needs "the writing model and a narration voice engine connected." It also reveals the default off behavior for burned text. 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.

Conciseness4/5

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

The description is long but every sentence earns its place; it covers a high-complexity tool with 13 parameters. It front-loads the core behavior in the first clause and then layers details. The occasional use of CAPS and dash-separated asides helps skimming. It is dense but not bloated; a slight deduction because some sections (e.g. captions/subtitles) are verbose and could be tightened, but overall it is well-structured for an AI agent's decision-making.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 13-parameter complexity and the rich input schema, the description is remarkably complete. It covers costs, engine used, runtime expectations, concurrency, prerequisite connections, defaults, user-consent expectations, and explicit non-use cases. There is no output schema, but the description compensates by describing the finished output (narrated explainer video with script, pictures, TTS, end card) and cost reporting via hermoso_capabilities. An agent has everything needed to select, invoke, and appropriately set parameters.

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 covers 100% of parameters, so the baseline is 3. The description adds substantial meaning: for each parameter, it gives context on its behavioral effects, defaults, costs, and when to use it. For example, `frameDensity` is explained in terms of visual film-reading quality, cost percentages, and default behavior. `captions` and `subtitles` are distinguished with default rules and user expectations. `music` gets a detailed explanation of sidechain ducking, channel-specific defaults, cost reporting via hermoso_capabilities, and mood-based composition. `upscale` is heavily contextualized with cost warnings. `style` explains the photoreal vs. non-photoreal split, style-key locking, and the cost note. This adds meaning far 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 is explicit and specific: "Turn a TOPIC into a finished narrated explainer video." It clearly differentiates this from siblings like render_ad, generate_video, and make_template_ad by 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." It names the resource (topic), the action (make), and the unique output characteristics.

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 versus alternatives: "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." It also provides clear guidance on when to use parameters like captions, subtitles, style, frameDensity, and upscale — e.g., "Never turn it on unasked: quote the number and let the user choose." 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.

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

TDQS

A4.4/5.0
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, destructiveHint=false): it discloses cost ('Spends a couple of credits'), latency ('~30 seconds'), the music-bed nuance ('library ships empty — no track means no bed, never a paid generation', 'config.music:off silences the bed but never the SFX'), the VO charge for myth-vs-fact, and hard content constraints ('Real product truths only — NEVER invent stats', 'a finished thought, NEVER a clipped clause'). No contradiction with annotations — the non-read-only hint aligns with 'spends credits' and creating an asset.

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

Conciseness2/5

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

The content is all necessary, but the structure is a single ~1,500-word run-on paragraph with multiple levels of nested parentheses — e.g., the kinetic-type entry is one ~200-word parenthetical with four nested asides. It is front-loaded with the core purpose, but the lack of line breaks, per-template separation, or bullet structure makes it genuinely hard to parse. This is dense to the point of being unwieldy rather than concise.

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?

Remarkably complete on inputs and behavior: every template's config, constraints, output medium (VIDEO vs IMAGE vs MULTI-IMAGE), duration, and audio treatment are specified. With no output schema, the main gap is the return contract — only 'carousel' explicitly states its return ('returns an images[] array, one PNG per slide'); the video formats imply a rendered asset but never state the response shape or whether this returns synchronously or via a job. Minor, but the cost/latency mention makes the absence noticeable.

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 is nearly empty (a single opaque 'config' object with no properties), so the description carries the entire parameter-documentation burden. It delivers: template IDs, per-template config shapes ('config: { thread: { contactName, messages: [{from:'them'|'me', text?, product?:{image,title,domain}}] }, ... }'), character/quantity limits ('3-5 COMPLETE phrases, ≤6 words / ≤34 chars each'), and enum-like options ('theme?:'dark'|'light''). This is exhaustive added 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 first sentence states a precise verb+resource+method: 'Render a NATIVE-STYLE TEMPLATE ad from pure HTML — no AI video/image model in the loop'. It differentiates from siblings like generate_video and make_explainer by explicit scope ('template ad' vs generic video generation) and cost/behavior ('~30 seconds for a couple of credits'). The 13 named template variants with per-format purposes make the tool's identity 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?

Gives clear usage context: 'Perfect for native-feel social ads at volume' and per-template guidance ('app-ui-tour for APP brands', 'myth-vs-fact ... the family's ONE paid-audio format', 'carousel for Meta/LinkedIn/IG carousels'). It also sets authoring expectations ('YOU author the content ... never marketing-speak'). However, it never explicitly names sibling tools as alternatives (e.g., when to pick generate_video or make_explainer instead), leaving the contrast implicit in 'no AI video/image model in the loop'.

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

TDQS

A4.8/5.0
Behavior5/5

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

Even though annotations are sparse (all false hints), the description discloses important behavioral traits: approximate credit cost, free headline overlay, refusal-without-charge when an identity gate fails, garbled-text leakage from bakeText, automatic identity lock, chaining of tweaks, and the English-only rendering language rule. It also warns that the reference image is never sent to the model. This goes far beyond what annotations provide and contains 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 long, but appropriately so for a 32-parameter tool. It is organized into clear sections (CONCEPT, THREE GATES, IDENTITY LOCK, PROMPT LANGUAGE) and front-loads the core purpose in the first sentence. There is minor redundancy around 'free, always legible' and the length could intimidate, but nearly every sentence carries operational 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?

For a complex tool with no output schema, the description covers workflow, gates, costs, defaults, language rules, and tweak behavior. It mentions the returned postRenderCheck and instructs the agent to check it, but it does not describe the output structure (e.g., where image URLs, variant arrays, or postRenderCheck details are returned). Given the complexity, this is a notable but not crippling 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?

Schema coverage is 100%, but the description adds substantial meaning beyond the schema: it enumerates the framework list, explains that framework has a default, defines emotion as the biggest CTR lever, clarifies that headline is typeset rather than baked, describes the reference extraction contract fields, and explains the variants × emotions × takes multiplication. This is rich semantic guidance on top of already-detailed 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: 'Render a click-driving YOUTUBE / Shorts / Instagram THUMBNAIL or video cover.' It explicitly contrasts itself with 'a bare image prompt' and names the sibling alternative generate_image, making the boundary unmistakable. This is a clear, distinct 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 Guidelines5/5

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

The description says explicitly 'Use this for any thumbnail, video cover, video preview or MrBeast-style packaging ask INSTEAD of generate_image.' It also provides concrete gate conditions: ask about identity when no face photo is attached, only set bakeText:true on explicit user request, ask once about one vs. a set, and use tweak for finished-thumbnail fixes. These are direct, actionable 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.

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

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description discloses that deleting a tab destroys its contents, that an unknown tab returns the real list instead of an opaque Google error, that the last tab is refused, and that actions are verified by reading back the spreadsheet. 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 every sentence earns its place: action recipes, tab identification, deletion safety, the last-tab edge case, and read-back verification. It is front-loaded with the purpose, and the compact '·' notation keeps the action recipes 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 destructive, three-action tool with no output schema, the description is remarkably complete: it covers parameter usage, error behavior, confirmation flow, edge cases, and the fallback alternative. The only minor gap is spreadsheet identifier semantics, which is slight given the context signals.

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 substantial meaning to the schema's under-documented parameters: it explains how action combines with title, tab, newTitle, confirm, and confirmCells. However, sheetUrl and spreadsheetId are left entirely implicit, and with schema coverage at only 38%, those two identifiers deserved at least a mention.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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, rename or delete a tab in a Google Spreadsheet' — and then enumerates the exact action combinations. It clearly distinguishes the tool's scope from the many sibling file/sheet tools by naming the relevant helpers list_sheet_tabs and delete_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 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: action-specific parameter recipes for add, rename, and delete, plus a two-step confirmation workflow for destructive deletes. It also tells the agent what to do when the last tab cannot be removed and points to delete_drive_file as the alternative.

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 credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
brandIdNoa brand id/name from list_brands to mine for; omit to use the active brand

TDQS

A4/5.0
Behavior1/5

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

The annotations declare readOnlyHint=true, but the description states that passing brandId 'switches this key's active brand like use_brand,' which is a state-changing side effect that contradicts the read-only hint. The credit cost is disclosed, but the contradiction with annotations overrides that positive.

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, starting with the core purpose and then enumerating output components, brand behavior, competitor alternative, and cost. Every sentence carries useful information, though it is somewhat long.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 output schema, the description carries the full burden of explaining return values, and it does so thoroughly: ranked angle bank, tag categories, verbatim quote counts, 0-100 score with breakdown, and ready-to-run hook. Input behavior, sibling routing, and cost are all 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 100%, so the parameter is already documented. The description adds meaningful context beyond the schema by explaining that passing brandId targets a specific brand and switches the active brand, which the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 ('Mine') and resource ('ad ANGLES from real customer language'), then details the returned artifact: ranked angle bank, tags, verbatim quotes, score, and hook. It also clearly separates itself from competitor_teardown, distinguishing this tool from a close sibling.

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 (mine angles from real customer language for a saved brand), how to target a specific brand via brandId, and provides an explicit alternative: 'To tear down a COMPETITOR use competitor_teardown instead.' It also explains the active-brand switch behavior.

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

multiply_adMultiply an adAInspect

MULTIPLY a winning video ad into N variants: each gets a NEW character, outfit, location and/or objects while the cut, the camera motion, the pacing and the ORIGINAL AUDIO stay exactly as they were (that is what made the ad work), and any burned-in captions are removed. Pass the source video URL (a previous render, a job result, list_library, or the top performer from post_performance / meta_insights). HOW: the source video itself DRIVES each variant (motion transfer from one image-edited opening frame), so every variant comes back the SAME LENGTH as the source with the same cut, the same performance and the original audio — only the person, outfit, set and props change. Sources up to 30 seconds work as they are; longer ones are refused for free with the way out (trim it first: post_edit with ops [{op:'trim', start:0, end:30}] — clip_video is the AI highlight clipper, not a trim). Returns the plan and ONE JOB PER VARIANT — call get_job on each until it reports done; do not describe a variant before its URL arrives. Cost is quoted per variant in the reply (use dryRun:true to see the plan and the quote without rendering). Regions: pass regions:['Berlin','Tokyo'] to restyle variants per market; translation is a separate, explicit step — dub_video on a finished variant.

ParametersJSON Schema
NameRequiredDescriptionDefault
axesNowhich axes to vary (default: all four)
countNohow many variants, 1-12 (default 6)
notesNoanything the variants must respect, e.g. "keep it women 25-40", "no gyms"
videoYesthe source video URL
dryRunNotrue = return the plan and the quote, render nothing
regionsNomarkets to restyle for, one or more variants each, e.g. ["Berlin","Tokyo","São Paulo"] — visuals only; audio is never translated here

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only carry basic flags (readOnly false, destructive false), but the description discloses async job-per-variant behavior, the need to poll get_job, cost quoting, dryRun behavior, same-length output, caption removal, and refusal of long sources. This is far beyond what annotations provide and sets accurate expectations.

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

Conciseness3/5

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

The description is rich and front-loads the core purpose, but it repeats the preservation guarantees ('cut, camera motion, pacing, original audio' then 'same cut, same performance, original audio') and uses caps-heavy editorial emphasis. Each section is informative, yet a few sentences could be merged 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?

Despite having no output schema, the description covers the full call lifecycle: source selection, length constraint, job creation, polling via get_job, dryRun, per-variant cost, regions, and the adjacent translation step. An agent has everything needed to invoke the tool and handle its asynchronous response.

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 meaning for video (accepted sources, 30-second cap), axes (what changes), regions (visual-only restyling per market), and dryRun (plan and quote without rendering), though count and notes are left to the schema.

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

Purpose5/5

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

States a specific action (MULTIPLY into N variants), the resource (a winning video ad), and the exact dimensions of variation (character, outfit, location, objects) while preserving cut, camera motion, pacing, and audio. This makes the tool's purpose unmistakable and clearly distinct from generic render/edit 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 tells the agent what source URLs are acceptable, imposes a 30-second source limit, and prescribes post_edit with a trim op for longer sources while warning that clip_video is not a trimmer. It also routes translation to dub_video and dryRun to previewing cost, which are clear when-to/alternatives signals.

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 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). A length that fits ONE clip of the render model renders as a single continuous pass; anything longer is STITCHED from acts filled to that model’s clip maximum with the remainder last (on a 15s-clip model, 40 → 15+15+10 and 17 → 13+4) — never time-compressed. The maximum is the model’s own: 15s on most, 30s on the longest-clip model, so a 30s ad can be one unbroken take rather than two acts. Omit when the user named no length; do NOT pass a guess, an omitted value keeps the recipe-aware default.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare readOnlyHint/idempotentHint/destructiveHint all false, so the description carries the burden and it delivers: 'Spends credits' discloses the cost consequence, 'Renders nothing' clarifies it is a planning-only step, and the duration-authoring rule reveals how the planner behaves (scenes authored to sum, stitching, silent default fallback). No contradiction with annotations — 'Spends credits' is consistent with readOnlyHint=false. Slightly more autonomous-decision disclosure (format auto, hook auto, neutral setting) lives in the schema rather than the description, keeping this from a 5.

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

Conciseness4/5

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

The description is dense but every sentence carries operational weight: deliverable, pipeline routing, the critical duration rule, and cost disclosure. The front-loaded 'Creative director: turn...' opening immediately establishes role and purpose. The ALL-CAPS 'THE USER'S EXPLICIT LENGTH IS SOVEREIGN' is emphatic to the point of shouting, and the authoring clause partially repeats the durationSeconds schema text, but given this is the highest-risk failure mode (silently producing a 15s spot against an explicit ask), the emphasis is defensible.

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, mutative, credit-spending tool with no output schema, the description covers the deliverable shape, the downstream pipeline, the cost, and the highest-risk parameter behavior — compensating well for the missing output schema by enumerating what comes back (copy variants, prompt/storyboard, recipe, model ids). The gap is sibling differentiation among planning tools (plan_variations, multiply_ad, make_template_ad, fix_beat all exist) and no mention of the language/copy-output dimension, but the rich parameter documentation fills most remaining holes.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3 — and the schema's parameter descriptions are exceptionally rich (clamping, stitching math, hook-drop caveats, the UGC on-screen-text trap). The main description adds genuine cross-cutting value beyond the schema: the 'explicit length is sovereign / pass verbatim / never guess' rule that governs how the durationSeconds parameter must be populated, and the warning that omission silently defaults to a 15s spot. That additive operational guidance lifts it 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 names a specific verb ('turn...into a finished ad CONCEPT') and resource ('brand + product/brief'), then enumerates the concrete deliverable: copy variants (headline/primary/cta) plus an image_concept.prompt OR video_storyboard, with resolved recipe and model ids. It explicitly disambiguates from render/generation siblings with 'Renders nothing; chain its output into generate_image / generate_video,' so an agent can distinguish it from generate_image, generate_video, and render_ad without opening their schemas.

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 pipeline context ('chain its output into generate_image / generate_video') and a when-not signal ('Renders nothing'), plus the operative rule that an explicit user duration must be passed verbatim while an absent one must be left omitted. However, it does not explicitly differentiate from the concept-making siblings (plan_variations, multiply_ad, make_template_ad, fix_beat), so an agent must infer when to prefer this planner over those alternatives.

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

TDQS

A4.3/5.0
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 a planning-only operation, it produces multiple variants, and it does not render output itself. The 'renders nothing itself' clause prevents a common misinvocation where the agent expects image/video output from this 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?

A single dense sentence conveys the core operation, output structure, downstream tool usage, and a key behavioral caveat without wasted words. The most important differentiator ('LLM planning only; renders nothing itself') is placed at the end but still 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 planning tool with no output schema, the description provides enough to understand what the tool returns conceptually: N variants, each with headline and visual brief. The schema covers all parameters, and the description covers behavior, output shape, and downstream workflow, so 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 description coverage is 100%, so the schema already documents all four parameters. The description adds the 'N' semantics tied to count and the notion of 'brief' tied to product, but it does not elaborate on brand or language. This meets the baseline for full schema coverage without adding significant new 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 names a specific verb ('Fan'), a resource ('a brief'), and a precise output ('N DISTINCT ad angles... each with its own headline + visual brief'). It also differentiates from rendering tools by stating 'LLM planning only; renders nothing itself' and explicitly routes output to generate_image and 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 Guidelines3/5

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

The description implies the tool is for generating multiple distinct ad angles rather than a single ad, but it never explicitly states when to choose this over closely related siblings like plan_ad, mine_angles, or multiply_ad. It does clarify that this tool does not render anything, which is a useful exclusion, but alternative-selection guidance is left to inference.

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

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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only mark the tool as non-read-only, non-idempotent, etc., but the description supplies the important behaviors: it never modifies the original, costs ~2 credits flat, runs no AI model, executes up to 6 ops in a deterministic order, and append_card 'ADDS its seconds, never re-renders.' No contradiction with 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 every clause carries information, with the core distinction front-loaded. The heavy use of all-caps and a single long paragraph make it less scannable than a bulleted structure, but it contains very little 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 tool with no output schema, the description still explains enough to invoke it successfully: video input, ordered op plan, limits, brand defaults/overrides, cost, non-destructiveness, and exclusions. Edge cases like custom end-card HTML and user color precedence are covered, so an agent has the full call contract.

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 the operation-level semantics an agent needs to compose a plan: op ranges, 'applied in order', the max plan size, the append-card special behavior, and automatic brand loading with per-call overrides. It goes well beyond the raw property names and enum 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 names an exact action ('mechanical post-production on an EXISTING rendered video'), identifies the input (served mp4 URL), and enumerates the concrete primitive operations. It explicitly distinguishes itself from AI-generation tools by saying 'NO AI model' and from re-rendering by saying 'original untouched (returns a NEW 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?

It gives a direct 'lane for' list (end card, trim, speed, mute, audio_gain, fade_out, watermark, grain) and an explicit negative routing instruction: 'NEVER use generate_video/render_ad for these mechanical asks.' This tells an agent exactly when to select post_edit over the main alternatives.

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

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark it read-only and non-destructive, but the description adds substantial behavioral context: never summing across channels, suppressing verdicts below 5 posts, and excluding unmapped hooks from hook voting. It also discloses the 0-credit cost and instructs how to present findings, far 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 dense but well organized: purpose first, then grouping behavior, then a numbered list of critical limitations, then output handling. Every sentence carries operational meaning, and the front-loaded structure helps an agent extract the key intent 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?

Despite having no output schema, the description explains what the tool returns conceptually: within-channel engagement rates, a finding if one exists, and a reason if not. It also covers edge cases around small samples and posts without hooks, making the tool safe and predictable for an agent to invoke without additional clarification.

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 both parameters at 100% coverage, so a baseline of 3 applies. The description adds value by clarifying axis semantics: 'media' means media format, 'hour' means posting hour, hook is the default, and channel comparisons are always within one channel. This is useful beyond the schema's brief 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 names a specific verb and resource: aggregate this brand's published posts to determine which hooks and subjects work. It also clarifies the grouping axes and the within-channel engagement-rate framing, making the tool's identity unmistakable even among many siblings. The explicit non-behaviors further distinguish it from generic aggregation or cross-channel 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 clearly implies when to use it: when an agent needs an aggregate read-only answer about hook/subject traction, with caveats to relay. However, it does not explicitly name alternatives such as collect_post_metrics or diagnose_posts, nor does it say 'use X for raw metrics,' so the routing-to-sibling guidance is inferred rather than explicit.

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

post_to_blueskyPost to BlueskyAInspect

Publish a post to Bluesky as the connected account. Text up to 300 characters — Bluesky ALSO caps a post at 3000 UTF-8 bytes, so an emoji-heavy post can be under 300 characters and still be refused; Hermoso checks both before spending the round trip and says which limit and by how much. MEDIA: either up to 4 images (imageUrls + altText) OR one MP4 video (videoUrl + videoAlt), never both — a Bluesky post record carries a single embed and images and video are two different embed types. Video is MP4 only, up to 300MB at Bluesky's end (Hermoso can fetch up to 150MB from a URL), with optional WebVTT caption tracks; the aspect ratio is measured from the file. Bluesky requires a CONFIRMED EMAIL on the account before it will process any video — if it is unconfirmed you get a refusal saying so, and reconnecting will not help. Links in the text are made clickable automatically. LINK CARDS: Bluesky does NOT scrape links, so a URL posted bare renders as plain blue text — the client composing the post has to build the card. Hermoso builds one AUTOMATICALLY when the post has a URL and NO media: it fetches the page, uses its title/description and uploads its image as the card thumbnail. Pass linkCard:false to suppress it, or linkCard:{uri,title,description,thumbUrl} to control it (give both title and description and the page is not fetched at all). A POST CARRIES ONE EMBED, so a card and images/video cannot both ride: if you pass linkCard explicitly ALONGSIDE media the call is REFUSED by name rather than silently dropping one, and if the URL was merely in the text the MEDIA WINS and the reply says the card was skipped (the link stays clickable either way). Returns the post's public bsky.app URL. Connect at Settings ▸ Connectors ▸ Bluesky with a handle and an APP PASSWORD.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe post, up to 300 characters / 3000 UTF-8 bytes.
langsNoBCP-47 language tags, e.g. ['en'].
accountNoWHICH connected account of this channel to post as — its @handle or id from list_connector_accounts. Needed only when the brand has more than one bluesky account connected (several and none named is refused by name, never guessed); omit when there is one.
altTextNoAlt text — an ARRAY, one per image in the same order, or a single STRING to describe every image with it. WRITE ONE: Bluesky’s own lexicon makes `alt` a REQUIRED property of every image, so a post without it is undescribed by design rather than by omission, and Bluesky users expect it. No maximum length is published, so nothing is truncated.
captionsNoUp to 20 WebVTT caption tracks: [{lang:'en', url:'https://…/en.vtt'}] or [{lang:'en', content:'WEBVTT\n\n00:00…'}]. Each file is capped at 20000 bytes.
linkCardNoRich link card (`app.bsky.embed.external`). OMIT for the default (a card is built automatically when the post has a URL and no media). `false` never builds one. `true` builds one from the first URL in the text. An object {uri,title,description,thumbUrl} overrides any field — supply BOTH title and description and the page is never fetched. Cannot be combined with imageUrls/videoUrl: a post has ONE embed, so an explicit linkCard beside media is refused.
videoAltNoAlt text describing the video, for accessibility.
videoUrlNoOne public MP4 URL. Cannot be combined with imageUrls. Bluesky transcodes it, which takes a minute or two.
imageUrlsNoUp to 4 public image URLs to attach. Cannot be combined with videoUrl.

TDQS

A4.6/5.0
Behavior5/5

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

Far beyond the annotations (readOnlyHint=false, idempotentHint=false), the description discloses refusal behaviors and the exact reasons, the 300-character PLUS 3000-byte dual limit with which-limit-and-by-how-much reporting, the video confirmed-email requirement, the media-wins card-skipping rule, explicit-refusal rather than silent-drop semantics for linkCard+media, and the returned public URL. No contradiction with annotations; the write nature is consistent 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.

Conciseness4/5

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

The description is long but densely packed with Bluesky-specific gotchas an agent could not infer (byte caps, embed exclusivity, email confirmation, card auto-build behavior). It is front-loaded: purpose first, text limits second, media rules, then link cards. Minor redundancy exists — the 'one embed' constraint is restated multiple times — but it is arguably deliberate reinforcement of the most commonly violated rule.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 output schema, the description supplies the return value (public bsky.app URL). It covers all nine parameters' interplay, the connection prerequisite (Settings ▸ Connectors ▸ Bluesky), the async transcoding behavior, all refusal conditions, and both character and byte limits. Nothing an agent needs to invoke the tool correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the schema's own descriptions are already rich (altText, linkCard, videoUrl). The description adds genuine cross-parameter semantics the schema cannot express alone: imageUrls/videoUrl mutual exclusion, the linkCard+media refusal rule, the byte-vs-character interaction with text, and the account selection rule for multi-account brands. This exceeds the baseline of 3 for full 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 opening sentence 'Publish a post to Bluesky as the connected account' states a specific verb, resource, and scope, fully distinguishing it from the many sibling posting tools (post_to_x, post_to_linkedin, post_to_meta, etc.). The title and name reinforce the same signal without 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 extensive context on when to use the tool and its options: when video is allowed versus images, when link cards are auto-built versus suppressed, when account disambiguation is needed, and when calls are refused (unconfirmed email, linkCard beside media). It does not explicitly name alternative tools or state 'when not to use this tool,' but platform-specificity in the name makes tool selection nearly unambiguous.

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

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the annotations by warning that the tool PUBLISHES immediately and publicly and by requiring explicit user confirmation. It also discloses platform-specific behaviors Google imposes: no video, EVENT and OFFER requiring a title and start date, OFFER ignoring the button link, and CALL taking no link.

Agents need to know what a tool does to the world before 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 packs only high-value safety and platform constraints into concise sentences. The capitalized warnings draw attention to the behaviors that matter most without adding 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?

For a 15-parameter, immediately public publish operation with no output schema, the description covers the critical prerequisites, side effects, consent step, and Google-specific rules. The only minor omission is the absence of any statement about the expected response or error behavior, but that is secondary for this kind of 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 documents all 15 parameters at 100% coverage, so the description is not required to re-describe each field. It adds useful cross-parameter meaning by tying EVENT/OFFER to title and startDate, explaining the ONE PHOTO rule, and clarifying that locationId comes from list_business_locations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 exact action and target: publish a Post to the brand's Google Business Profile, and it explains what the post contains and where it appears (Google Search and Maps). This clear verb-plus-resource framing separates it from the other post_to_* 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 Guidelines4/5

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

It gives explicit preconditions: show the user the full post and get consent before publishing, call list_business_locations first when several listings exist, and have the Google Business Profile connector connected. It does not explicitly enumerate alternatives or when not to use this tool, but the Google-specific context makes 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.

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.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false and idempotentHint=false; the description adds the critical behavioral facts beyond that: the post PUBLISHES immediately and PUBLICLY, is irreversible in practice, requires explicit user consent before calling, and refuses non-Hermoso-hosted image URLs. It also states the connected-account prerequisite. This is exactly the kind of context annotations cannot convey, and 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?

Three sentences, all load-bearing: purpose first, then the image-hosting constraint that prevents a common misuse, then the safety-critical approval warning. It is slightly dense but every sentence earns its place, and the front-loading of purpose is correct.

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 an 8-parameter publish tool with no output schema, the description plus the extremely detailed schema cover the essentials: what it does, the prerequisite, the safety workflow, and the retry/idempotency behavior via the schema. The main gap is that the description itself never states the return value (post id), though the idempotencyKey parameter description partially covers it. Otherwise the agent has everything needed 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?

Schema description coverage is 100%, and the schema entries are unusually rich (imageUrl hosting rules, idempotencyKey retry semantics, hook grouping behavior, carousel refusal). The description adds only a marginal clarification for imageUrl and text — the 'does NOT have to be Hermoso generated' nuance is already present in the schema. The schema carries the heavy lifting, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (Publish), a precise resource (the user's connected LinkedIn profile, as opposed to a company page), and the scope (text plus optional image). The 'user's connected... profile' phrasing distinguishes it from sibling post_to_linkedin_page without needing to open either schema.

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

Usage Guidelines4/5

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

Gives clear context: it is for the user's personal LinkedIn profile, publishes immediately (implying not for scheduling), and requires a connected LinkedIn account with a navigation path. The schema's imageUrls parameter explicitly routes carousels to post_to_linkedin_page, and the description adds the mandatory approval-before-call workflow. It does not explicitly enumerate when-not-to-use cases, but the context is strong enough to avoid sibling confusion.

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, a 2–20 image CAROUSEL (LinkedIn calls it a MultiImage post; pass the slides in order as imageUrls[]), or a LINK POST with a real preview card (linkUrl). USE linkUrl WHENEVER THE POINT OF THE POST IS A LINK: LinkedIn disables URL scraping for API partners, so a url sitting in the text renders as plain text with no card, and the card’s title, description and image only exist if you pass linkTitle / linkDescription / linkThumbnailUrl — read them off the page and supply them. 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. A VIDEO POST CAN CARRY CAPTIONS AND ITS OWN COVER, and both are attached only during the upload: pass captionsSrt (SubRip content — LinkedIn is watched with the sound off) and videoThumbnailUrl (otherwise LinkedIn picks a frame for you). LinkedIn does NOT allow the image, video, captions or thumbnail of a published post to be swapped afterwards, so get all of that 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
altTextNoaccessibility alt text (max 4086 characters, ~120 recommended). A STRING describes every image; an ARRAY describes each slide of a multi-image post separately, in slide order — LinkedIn stores altText per image, and their own sample request carries a different one on each. Not available on a PERSONAL-profile post: LinkedIn’s member posting API has no alt-text field at all.
linkUrlNopublish a LINK POST — LinkedIn renders a real preview card for this URL instead of leaving a bare link in the text. Mutually exclusive with imageUrl / videoUrl / imageUrls: LinkedIn’s content field is a union, so combining them is refused by name rather than one being dropped.
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.
linkTitleNothe headline ON the preview card. LINKEDIN NEVER SCRAPES THE PAGE — their Posts API disables URL scraping for API partners outright — so if you do not pass this the card renders UNLABELLED. Fetch the page’s own title and pass it.
visibilityNodefault PUBLIC
captionsSrtNoCLOSED CAPTIONS for a videoUrl post — the SubRip (.srt) CONTENT itself, cue numbers and `00:00:00,000 --> 00:00:02,000` timing lines included, NOT a URL and NOT the plain script (a file with no timings is refused, because LinkedIn would accept it and then silently never show it). Most of LinkedIn is watched with the sound off, so an uncaptioned video is one most of the feed never hears. LinkedIn allows ONE caption file per video and ENGLISH ONLY; it can be attached only WHILE the video is uploaded, never added to a published post; and it is processed asynchronously, so the reply confirms it was UPLOADED and never that it is visible yet. Requires videoUrl — passing it on an image, carousel or link post is refused by name.
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
linkDescriptionNothe sub-line on the preview card. Same rule as linkTitle: absent means blank, because LinkedIn will not fetch it.
linkThumbnailUrlNoa Hermoso-hosted image used as the card’s picture (uploaded to LinkedIn for you). Without it the card has no image.
videoThumbnailUrlNothe COVER IMAGE for a videoUrl post — a Hermoso-hosted image (a render, or any picture of the user’s via upload_file). Without it LinkedIn adds a system-generated thumbnail, which on an ad is usually whatever the first frame happens to be. Like captions this can only be set WHILE the video is uploaded, never afterwards. Requires videoUrl. This is NOT linkThumbnailUrl, which is the picture on a link-preview card.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only carry readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description adds decisive behavioral context beyond these: 'This PUBLISHES immediately and PUBLICLY — ALWAYS show the user the exact text and get an explicit yes BEFORE calling,' the fact that media cannot be swapped after publishing, asynchronous caption processing, and a minute-long video processing delay. No contradiction with annotations; the description carries nearly the entire behavioral burden.

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 front-loaded, opening with the core purpose and the highest-value warning (link posts need manual card metadata). For an 18-parameter tool with multiple post-type branches, the length is justified and nearly every sentence earns its place. Minor repetition with the parameter-level descriptions (Hermoso-hosted requirement, LinkedIn sound-off) keeps 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 high complexity (18 params), no output schema, and sparse annotations, the description covers everything an agent needs to invoke correctly: hosting prerequisites via upload_file, organizationId sourcing via list_linkedin_pages, the pre-publish user-confirmation requirement, post-publish immutability, per-media-type constraints, and idempotent retry behavior. The only omission — an explicit normal success return shape — is minor given the idempotencyKey section already reveals the post id.

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 the baseline is 3, but the description adds semantics the schema cannot: linkUrl requires linkTitle/linkDescription/linkThumbnailUrl because LinkedIn disables URL scraping; captionsSrt must be raw SubRip content with timing lines, not a URL; idempotencyKey's safe-retry contract ('never posts twice'); the hook/subject grouping behavior for post_performance; and the imageUrls warning that a carousel is one post, not several. This far exceeds what the parameter descriptions alone 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 a specific verb+resource statement — 'Publish a post to one of the user's LinkedIn COMPANY PAGES' — and reinforces scope by contrasting with the sibling: 'This is a DIFFERENT thing from post_to_linkedin, which publishes to the person's own profile.' An agent can immediately distinguish company-page publishing from personal-profile 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?

The description explicitly names the alternative (post_to_linkedin), states the selection rule ('pick the one the user actually asked for and never substitute'), explains the company-page-only carousel restriction, and routes prerequisites to list_linkedin_pages and upload_file. It also gives operational guidance like using linkUrl whenever the point of the post is a link. When/when-not guidance is fully explicit.

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. INSTAGRAM COLLAB: pass collaborators (up to 3 usernames) to invite other accounts to CO-AUTHOR the post — it then shows on their profile too once they accept, which is the reach play behind every creator partnership. 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
accountNoWHICH Instagram account when target is instagram and the brand has several — Page-linked and Instagram Login accounts alike; an @username or id from list_connector_accounts("instagram"). Several and none named is refused by name; omit when there is one.
altTextNoACCESSIBILITY — the description screen readers announce, and what the platform otherwise auto-generates badly or not at all. Describe what is actually IN the picture, never the caption. ONE STRING describes the picture; on a CAROUSEL it describes EVERY slide. Pass an ARRAY of strings instead to describe each slide separately, aligned to the slide order — that is strictly better on a multi-slide post, because one sentence read out over six different pictures is wrong for five of them. More descriptions than pictures is refused rather than dropped. WHERE IT LANDS, per Meta’s own docs: INSTAGRAM image posts and the IMAGE slides of an Instagram carousel (up to 1000 characters; dropped rather than sent on a Reel or a video slide, which Meta do not support); FACEBOOK Page photos including every photo of an album, via alt_text_custom (Meta publish no length for it, so nothing is truncated); THREADS on a single-image or single-video post ONLY — Meta document no way to attach alt text to a Threads CAROUSEL slide, so a Threads carousel publishes undescribed and the reply says so rather than risking the whole post on a guess. (Meta’s AI disclosure defaults from PROVENANCE: a Hermoso render is declared is_ai_generated; media that came through upload_file or an external URL, i.e. the user’s own photos or footage, is NOT. Pass `aiGenerated` to force it either way.)
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)
topicTagNoTHREADS ONLY — one topic tag for discovery, 1–50 characters. A leading # is stripped for you; Threads refuses "." and "&".
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.
trialReelNoINSTAGRAM TRIAL REEL — publish this Reel to NON-FOLLOWERS ONLY at first, so a hook can be tested on a cold audience without spending it on the people who already follow the brand. Instagram then shows it to followers only if it graduates. MANUAL = the creator graduates it by hand in the Instagram app; SS_PERFORMANCE = Instagram graduates it automatically if it performs well. REELS ONLY and INSTAGRAM ONLY: an image, a carousel, a Facebook post or a Threads post is REFUSED BY NAME rather than quietly published as an ordinary post — a trial that silently goes to every follower is the exact opposite of what was asked for. Omit it for a normal Reel.
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.
aiGeneratedNoINSTAGRAM / FACEBOOK REEL — Meta’s is_ai_generated self-disclosure. OMIT IT and Hermoso decides from provenance: a Hermoso render is declared, media that came through upload_file or from an external URL (the user’s own photographs or footage) is NOT — a real photo must never carry Instagram’s “AI info” label. Pass true or false only to override: false strips the label from something Hermoso would otherwise declare, true declares a render the user uploaded themselves.
productTagsNoINSTAGRAM SHOPPING — make the post SHOPPABLE by tagging products from the brand’s own catalog; tapping a tag opens the product’s price sheet inside Instagram. Instagram only. ON A PHOTO each tag is {product_id, x, y}, where x and y are FRACTIONS of the image from 0.0 (left/top) to 1.0 (right/bottom) — 0.5,0.5 is the middle — and BOTH are required, max 20. ON A REEL it is {product_id} ALONE with no coordinates, max 30. ON A CAROUSEL it is an array PER SLIDE ([[{…}], [], [{…}]]) because Instagram tags each slide’s own container, max 5 per slide and 20 across the post. Ids come from search_instagram_shopping_products; call list_instagram_shopping_catalogs FIRST, because tagging needs an APPROVED Instagram Shop and without one this fails after the media is already uploaded. A tag whose product is not “approved” is stored and shown to nobody.
quotePostIdNoTHREADS ONLY — the id of a post to QUOTE. A quote post is a distinct post type, not a formatting option.
countryCodesNoTHREADS ONLY — restrict the post to these ISO 3166-1 alpha-2 countries. ⚠ This is an ALLOWLIST, so the post becomes INVISIBLE in every country not named — it narrows reach, it does not target.
replyControlNoTHREADS ONLY — who may reply. Default is everyone.
collaboratorsNoINSTAGRAM COLLAB — up to 3 Instagram usernames invited to CO-AUTHOR this post. Once one accepts, the post appears on THEIR profile too, with both handles in the header and the likes and comments shared — it is how a brand reaches a creator’s audience without paying for placement, and it is the single most-asked thing a scheduler normally cannot do. Pass handles only ("hermosoai"), not profile links; a leading @ is fine. INSTAGRAM ONLY — Facebook and Threads have no collab post at all and are refused BY NAME rather than silently dropping the co-authors — and never on a Story. AN INVITE IS NOT A CO-POST: publishing SENDS a request the other account must accept in their Instagram notifications, and until they do the post is on this brand’s profile ALONE; they may also decline, and Instagram sends no notification either way. So never report the post as live on both accounts — read the invite status back out of the reply, and use instagram_collaborators later to find out whether they accepted.
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.
linkAttachmentNoTHREADS TEXT POSTS ONLY — a full http(s) URL rendered as a clickable link card. This is how a Threads post carries a destination at all; without it a link is just text. Meta allows at most 5 links per post and refuses a link attachment on a post that also carries an image or video, so Hermoso refuses that combination up front rather than letting Meta silently drop it.
crossreshareToIgNoTHREADS ONLY — ALSO share this Threads post to the linked Instagram account AS A STORY (not a feed post), in the same publish. NOT available on a Threads CAROUSEL, which is refused by name rather than silently dropped. THERE IS NO CONFIRMATION: Threads returns no field saying whether the Story was created, so report it as REQUESTED and tell the user to check their Instagram Stories — never that it is live.
crossreshareDarkModeNoTHREADS ONLY — render that Instagram Story in dark mode. Only meaningful alongside crossreshareToIg; on its own it is refused rather than silently ignored, because a parameter that never reaches the wire must not look accepted.

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses far more than the annotations convey: publishing happens immediately, async returns a pollable job id, idempotencyKey enables safe retries, collaborator invites are not co-posts until accepted, crossreshare gives no confirmation, and unsupported combinations are refused by name rather than silently downgraded. Nothing contradicts the annotations, and the openWorldHint is consistent with the described external 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, front-loaded, and every section conveys real constraints, which is appropriate for a 27-parameter multi-channel publishing tool. However, some guidance is repeated between the main description and the parameter descriptions, such as the accepted URL formats and the carousel warning, so it is not maximally concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 no output schema, the description covers what is essential: immediate publish behavior, expected return artifacts like job ids and post ids, per-channel limits and refusals, prerequisites, scheduling constraints, duplicate handling, and post-publish follow-up actions such as reading collaborator invite status. An agent has enough context to invoke the tool safely and understand outcomes.

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 already 100%, the description massively extends each parameter's meaning beyond the schema: hook explains grouping and reuse rules, imageUrls explains per-channel slide limits and ordering importance, collaborators explains invite-vs-accept semantics, aiGenerated explains provenance-based defaults, and countryCodes warns it is an allowlist. Every parameter gets practical, non-obvious semantics rather than just a type label.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 ('Publish') and the exact destinations: a connected Facebook Page, its linked Instagram, or the brand's Threads account. It goes further to distinguish media types (text/link/image/video/carousel) and explains that a multi-slide creative is one carousel post, not several. This makes it unambiguous among the many post_to_* 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 Guidelines4/5

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

The description gives strong contextual guidance: it requires a connected Meta account with posting permission, tells the agent to confirm copy and media before publishing because the tool publishes immediately, and directs local files through upload_file first. It also recommends async:true for video to avoid transport timeouts. It does not explicitly say 'for non-Meta platforms use post_to_linkedin/post_to_tiktok/etc.', so exclusions are implied by the Meta-scoped targets rather than named.

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
accountNoWHICH connected account of this channel to post as — its @handle or id from list_connector_accounts. Needed only when the brand has more than one pinterest account connected (several and none named is refused by name, never guessed); omit when there is one.
altTextNoaccessibility alt text, max 500 characters. PIN-LEVEL: Pinterest’s API has no per-item alt text at all, so on a CAROUSEL the FIRST description is used for the whole Pin and the reply states that the others were not sent.
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.
slideTextNoPINTEREST CAROUSEL ONLY — per-slide title, description and destination LINK, one object per slide in slide order. This is the ONLY genuine per-slide caption on any channel Hermoso publishes to: slide 4 can send people to the product ON slide 4, where every other platform gives a carousel one shared caption. Omit any field to leave it unset; the Pin’s own title/description/link still describe the Pin as a whole. Pinterest publishes no length limit on these, so nothing is truncated. More entries than slides is refused rather than dropped.
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.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint false, idempotentHint false), the description explicitly warns 'This PUBLISHES to their public profile' and tells the agent to confirm before calling. It also discloses the 1–2 minute video ingest latency and the requirement that Pinterest be connected. This goes well beyond what annotations already 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 dense but every sentence carries purpose: creation, media types, metadata, board selection, public-profile warning, video latency, and connection prerequisite. It is longer than average, but the tool has 16 parameters and nontrivial carousel behavior, so this length is justified and well-organized.

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 lack of an output schema, the description covers the critical context: media types, carousel mechanics, board selection flow, connectivity requirement, and a safety warning about publishing publicly. It does not describe return values, but the schema's idempotencyKey field hints at response behavior, and the absence of an output schema lowers the burden.

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 all 16 parameters with detailed descriptions, so the baseline is 3. The tool description adds extra semantics for key parameters: it elevates the link as the main traffic driver ('ask for it rather than omitting it'), explains that the description is what Pinterest search reads, and frames boardId as a required prerequisite obtained via list_pinterest_boards. This adds value over 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 names a specific verb and resource: 'Create a Pin' on Pinterest boards, and immediately distinguishes the tool from other post_to_* siblings by platform. It also clarifies media types (image, video, carousel) and the boardId requirement, so an agent can identify this tool confidently.

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 concrete workflow guidance: call list_pinterest_boards first to obtain boardId, request the destination link rather than omitting it, and confirm the board/title/link before publishing. It also states the Pinterest connection prerequisite. It does not explicitly explain when to choose this over another post_to_* tool, but the sibling names and the platform-specific focus make that choose clear.

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

post_to_telegramPost to TelegramAInspect

Publish to a Telegram channel, group or chat as the brand's own bot. WHICH CHAT IS ALWAYS REQUIRED AND IS NEVER GUESSED: pass chatId as the public channel's @username (e.g. @hermosoai) or its numeric id (a group is negative; a supergroup or channel starts with -100). There is no default and there cannot be one — the Telegram Bot API publishes no method that lists the chats a bot belongs to, so Hermoso genuinely cannot know them. list_telegram_chats reports the chats that have MESSAGED the bot in the last 24 hours, which is a shortcut for finding an id and is NOT a roster: a chat missing from it can still be posted to. TEXT: up to 4096 characters on a text-only message, but only 1024 the moment ANY photo or video is attached — a caption is not a message, and Hermoso refuses the over-long one before spending the round trip and says which budget applied. MEDIA: one image (imageUrl), one video (videoUrl), or an ALBUM of 2–10 (imageUrls, in order) in which photos and videos may be MIXED — pass a videoUrl alongside imageUrls and it joins the album as one more item. Hermoso uploads the bytes rather than handing Telegram a link, which is what buys the larger ceilings: 10MB per photo and 50MB per video, where a link would be 5MB and 20MB. THE BOT MUST BE IN THE CHAT — an administrator with Post Messages for a channel, an unrestricted member for a group; if it is not, Telegram refuses and the error says to add it rather than to reconnect. Returns the message id and, for a PUBLIC chat, its t.me link — a private group has no public web link, so url comes back null rather than as a link that would 404 for whoever you hand it to. 0 credits. Connect at Settings ▸ Connectors ▸ Telegram by pasting a bot token from @BotFather.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNothe message. ≤4096 characters on its own; ≤1024 once any image or video is attached.
chatIdYesREQUIRED — the destination: a public channel's @username, or the numeric chat id. Never guessed; ask the user, or use list_telegram_chats.
silentNodeliver without a notification sound (Telegram’s disable_notification). This is NOT a visibility setting — the message is just as visible.
accountNoWHICH connected account of this channel to post as — its @handle or id from list_connector_accounts. Needed only when the brand has more than one telegram account connected (several and none named is refused by name, never guessed); omit when there is one.
imageUrlNoone image (≤10MB after upload)
videoUrlNoone video (≤50MB). Passed alongside imageUrls it joins the album as one more item.
imageUrlsNoan ALBUM of 2–10 media, in order. Photos and videos may be mixed — Telegram allows it.
disablePreviewNosuppress the link-preview card on a text-only post. Default is Telegram’s own behaviour (previews on).

TDQS

A4.9/5.0
Behavior5/5

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

Annotations are minimal (readOnly=false, idempotent=false, destructive=false), leaving the prose to carry behavioral disclosure, and it does so comprehensively: the API-level reason no chatId default can exist, the 4096/1024 character budgets with pre-round-trip refusal, the byte-upload vs link tradeoff that buys 10MB/50MB ceilings, the bot-must-be-in-chat prerequisite with its specific error behavior, and the url-comes-back-null semantics for private groups. Zero contradictions with annotations, which all align with a write operation that cannot guess its target.

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 earned: the critical never-guess rule is front-loaded, and labeled sections (TEXT, MEDIA, THE BOT MUST BE IN THE CHAT) make it scannable. It misses a 5 because some content is redundant with the schema (size limits, mixing rules appear in both) and the heavy ALL-CAPS formatting adds visual 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?

With no output schema, the description correctly covers the return shape (message id; url null for private groups rather than a 404 link). It also covers prerequisites (bot in chat with Post Messages, connection via BotFather token), error behavior (refuses over-long captions before the round trip, Telegram's add-the-bot error), cost (0 credits), and edge cases for all 8 parameters. Nothing an agent needs to invoke the tool correctly 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?

Schema coverage is 100%, so the baseline is 3, but the prose adds substantial meaning per parameter: chatId format rules (negative group ids, -100 prefix, @username) plus the reasoning for why it is never defaulted, the album-mixing behavior for imageUrls/videoUrl, the 1024-character caption budget for text, and silent's "NOT a visibility setting" clarification. This genuinely enriches the schema rather than 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 opening line, "Publish to a Telegram channel, group or chat as the brand's own bot," uses a specific verb (Publish), a specific resource (Telegram channel/group/chat), and a clear scope (as the brand's own bot). This immediately distinguishes it from the many post_to_* siblings (post_to_x, post_to_meta, post_to_linkedin) by platform, and from list_telegram_chats by 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 explicitly names list_telegram_chats as the alternative for finding a chatId and clarifies its limitation: "a shortcut for finding an id and is NOT a roster: a chat missing from it can still be posted to." It also states the exact condition for the account parameter ("Needed only when the brand has more than one telegram account connected"), the never-guess rule, and the setup path. Sibling post_to_* tools need no further differentiation since the target platform is in the tool name itself.

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)
accountNoWHICH connected account of this channel to post as — its @handle or id from list_connector_accounts. Needed only when the brand has more than one tiktok account connected (several and none named is refused by name, never guessed); omit when there is one.
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.
aiGeneratedNoTikTok’s is_aigc AI-generated-content label (video posts). OMIT IT and Hermoso decides from provenance: a Hermoso render is declared, a video that came through upload_file or an external URL (the user’s own footage) is NOT. true/false overrides.
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

TDQS

A4.8/5.0
Behavior5/5

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

Annotations are minimal (non-readonly, non-idempotent, not destructive), so the description carries the burden of behavior. It discloses that 'post' publishes live, 'draft' is the safer default, TikTok must be connected, and live posting requires an explicit user yes. It also reveals the no-mixed-post constraint and image-count limits, adding value 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 dense but every sentence earns its place: post types, counts, mutual exclusion, destination behavior, consent requirement, URL sourcing, and connector prerequisite. Key constraints are front-loaded and emphasized without 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?

For an 18-parameter tool with no output schema, the description captures the essential decision tree: video vs. photo, live vs. draft, privacy and consent for live posts, and connector requirements. It doesn't cover every conditional rule (e.g., duet/stitch video-only, brandedContent restrictions), but the schema descriptions fill those gaps, so the definition is nearly 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 94%, so the baseline is 3, but the description adds important cross-parameter semantics: imageUrls and videoUrl are mutually exclusive, coverIndex controls slide order, privacy is required for destination:'post', and URLs can be Hermoso renders or upload_file URLs. It doesn't re-explain every parameter, but it clarifies the relationships that the schema alone doesn't fully convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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: 'Publish to the user's connected TikTok account.' It clearly distinguishes the two post types (video vs. photo post) and explains the photo-post format in concrete terms. This makes the tool's purpose unambiguous and separates it from other post_to_* siblings 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?

The description gives explicit usage conditions: when to pass imageUrls vs videoUrl, never both, and how the two destinations ('post' vs 'draft') change behavior and prerequisites. It even instructs the agent to call tiktok_creator_info and obtain explicit consent before live posting, which is critical routing guidance.

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. LENGTH IS THE POSTING ACCOUNT’S, NOT A FLAT 280: 280 characters on an ordinary account, but UP TO 25,000 if that account has X Premium. Hermoso reads the account’s own subscription from X and sends the post rather than refusing something it may be entitled to; if X declines it on length, the reply says so and names the subscription X reported. Over 25,000 is refused for free — that is X’s own ceiling on every account. Text is NEVER truncated. AND A LONG POST IS CHEAPER THAN A THREAD: it is ONE billed X call where the same words split across five posts are five, so prefer one long post over threading when the account has Premium. Only the first ~280 characters show in the timeline; the rest sits behind “Show more”. 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. Each brand also has a rolling 24-hour ceiling on what it can spend at X, and a request that would cross it is refused WHOLE before anything publishes, so a batch of posts is bounded rather than open-ended. THIS TOOL POSTS ORGANICALLY — it does not create an ad campaign. X ads are built with create_x_ads_campaign → create_x_ads_line_item → create_x_ads_promoted_tweet, and a promoted post needs a post id, so publish here first and promote that post. 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 without X Premium, up to 25,000 with it — write the full thing, it is never truncated. Use this OR thread, not both.
threadNoa thread: each string is one post, published in order, each replying to the previous. Max 25. Each part follows the same length rule as `text`, and on an X Premium account ONE long post is usually both better reading and cheaper than a thread.
accountNoWHICH connected account of this channel to post as — its @handle or id from list_connector_accounts. Needed only when the brand has more than one x account connected (several and none named is refused by name, never guessed); omit when there is one.
altTextNoaccessibility description of the attached media, max 1000 characters — write one whenever you attach a render. Costs a small extra amount: X bills one metadata write PER media. With SEVERAL media, pass an ARRAY aligned to their order — X attaches alt text per media id, and a single string describes only the FIRST one (X renders up to four media as a GRID, not a carousel, so one sentence would be wrong for the other three).
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
mediaUrlsNoUP TO FOUR Hermoso-hosted media attached to ONE post — X’s own schema caps media_ids at 4. X renders them as a GRID: every image visible at once, nothing to swipe to. That is NOT a carousel, and a numbered "1/6 · SWIPE" slide deck must still not be sent here — it would publish as a grid and the "swipe" instruction would make no sense. Order decides the layout. On a thread the media rides the FIRST post; give each later part its own post to attach more. Mutually exclusive with mediaUrl, and more than 4 is refused before anything is uploaded.
replyToIdNonumeric id of an existing X post to reply to
communityIdNopublish into an X COMMUNITY instead of the main timeline — the number in the community’s own URL (x.com/i/communities/<id>). The connected account must be a MEMBER of it; X answers a non-member and a non-existent id with the same refusal and does not separate them.
quotePostIdNonumeric id of a post to QUOTE — X renders the quoted post inside yours. This is NOT replyToId: a reply sits under the original in its thread, a quote stands alone on your own timeline with the original embedded, which is the one you want for commentary. X makes a quote mutually exclusive with media and with a poll (their own schema), and a quote is billed at the higher LINK rate because X appends the quoted post’s t.co URL whatever your text says.
replySettingsNorestrict who can reply — omit for everyone, which is the right default for a brand post
paidPartnershipNolabel the post a PAID PARTNERSHIP on X — the same disclosure Hermoso already ships for TikTok. OPT-IN ONLY: set it when the post is sponsored, gifted or otherwise paid for, and never assume it on the user’s behalf.

TDQS

A4.3/5.0
Behavior5/5

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

Goes far beyond the sparse annotations (readOnlyHint=false, openWorldHint=true): it discloses immediate and public publishing, that text is never truncated, that length limits depend on the account's own X subscription (280 vs 25,000), that only the first ~280 characters show in the timeline, and that a batch is refused WHOLE if it would cross the 24-hour spend ceiling. It also surfaces the cost model (per-request billing, ~13× for links) and names the subscription X reported on a length refusal. 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.

Conciseness3/5

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

The description is logically organized — core action, length behavior, cost, organic-vs-ads, prerequisite — and front-loaded with the safety-critical instruction to show exact text and get explicit yes before calling. However, it is roughly 450 words and repeats details already fully covered in the schema (poll constraints, media/poll/quote exclusions, alt text), so not every sentence earns its place. The heavy all-caps emphasis adds 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 14-parameter, zero-required, high-stakes publishing tool with billing consequences and no output schema, the description covers everything an agent needs: modes, exclusions, safety confirmation, account-specific length rules, per-post cost, whole-batch ceiling refusal, and error behavior ('if X declines it on length, the reply says so'). The return shape is implied by the promotion flow (a post id is needed for ads). Nothing material 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% with unusually rich per-parameter explanations (hook, subject, mediaUrls grid behavior, quotePostId exclusions, altText arrays), so the baseline of 3 applies. The description adds contextual semantics around account-specific length limits affecting text/thread and the cost difference between one long post and several thread posts, but the schema carries the parameter-level 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 opens with a specific verb and resource — 'Publish to the user's connected X (Twitter) account' — and enumerates the exact modes: single post, post with media, reply, thread, poll, and restricted replies. It also separates itself from ad creation by stating 'THIS TOOL POSTS ORGANICALLY — it does not create an ad campaign,' and its X-specificity distinguishes it from sibling channel tools like post_to_bluesky and post_to_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?

Routing to the closest alternative is explicit: promoted posts belong to create_x_ads_campaign → create_x_ads_line_item → create_x_ads_promoted_tweet, and this tool should be called first to produce the post id. It also prescribes when to prefer one long post over a thread ('prefer one long post over threading when the account has Premium') and requires X to be connected. It does not explicitly contrast with schedule_post or post_x_article, though immediate publishing is emphasized.

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. SCHEDULE it with publishAt, FILE it under the right categoryId (the default 22 "People & Blogs" is wrong for most ads), SUBSCRIBER NOTIFICATIONS FOLLOW PRIVACY — a public publish announces the video to the channel’s subscribers (YouTube’s own default), while unlisted/private uploads stay quiet; pass notifySubscribers explicitly to override either way. 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
titleNoREQUIRED in practice — the headline every search result and the Shorts feed shows (≤100 chars); an upload with no title is refused
accountNoWHICH connected account of this channel to post as — its @handle or id from list_connector_accounts. Needed only when the brand has more than one youtube account connected (several and none named is refused by name, never guessed); omit when there is one.
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
publishAtNoSCHEDULE the publish — ISO 8601, e.g. "2026-09-01T15:00:00Z", and it must be in the future. YouTube only allows this on a PRIVATE video and makes it PUBLIC at that moment, so pass privacy:"private" (or leave privacy unset) — asking for a scheduled "unlisted" or "public" post is refused rather than half-honoured.
categoryIdNoYouTube category id, NUMERIC — default "22" (People & Blogs), which is wrong for most ads. 1 Film & Animation · 2 Autos & Vehicles · 10 Music · 15 Pets & Animals · 17 Sports · 19 Travel & Events · 20 Gaming · 22 People & Blogs · 23 Comedy · 24 Entertainment · 25 News & Politics · 26 Howto & Style · 27 Education · 28 Science & Technology · 29 Nonprofits & Activism. The assignable set is region-specific, so the value is forwarded as given and YouTube has the last word.
aiGeneratedNoYouTube’s “altered or synthetic content” declaration (containsSyntheticMedia). OMIT IT and Hermoso decides from provenance: a Hermoso render is declared, a video the user uploaded through upload_file or from an external URL is NOT — real footage must not carry the label. true/false overrides.
descriptionNoREQUIRED in practice — what the video shows, a line about the brand, a link and a few #hashtags (≤5000 chars); YouTube search, suggested videos and the Shorts feed rank on it, so an upload with no description (and no caption) is refused
notifySubscribersNoTHE DEFAULT FOLLOWS PRIVACY. privacy:"public" NOTIFIES the channel's subscribers — that is YouTube's own default and normally what someone publishing publicly wants. privacy:"unlisted" and "private" do NOT: the video is not on the channel, so announcing it is nonsense, and a blast to somebody's whole subscriber list cannot be undone. A scheduled publish (publishAt) is PRIVATE at upload, so it does not notify either — pass true to announce one. An explicit value ALWAYS wins in both directions: true announces an unlisted/private upload, false publishes publicly and quietly. The reply reports which way it went and why.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations are minimal (readOnlyHint=false, idempotentHint=false, destructiveHint=false) and the description carries the real behavioral weight. It discloses defaults with consequences (unlisted means shareable-by-link and ad-usable; private videos cannot be ads), YouTube's scheduling constraint that a private video is made public at publishAt, the subscriber-notification default that follows privacy (including the warning that a subscriber blast cannot be undone), and the fact that categoryId is forwarded as given with YouTube having the last word. This goes far beyond what the annotations state 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.

Conciseness3/5

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

Every sentence carries load-bearing information and nothing is filler, but the whole description is one dense wall of text with heavy parenthetical asides ('(link-only — not on the channel, not searchable, but shareable by link AND usable as a YouTube/Google ad)', '(the default 22 "People & Blogs" is wrong for most ads)'). Critical operating guidance — confirm-before-public, private-fails-as-ad, schedule-requires-private — is embedded mid-sentence instead of being front-loaded or segmented into scannable rules.

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 12-parameter, no-output-schema tool, the description covers nearly everything needed to invoke correctly: input source, all privacy modes and their ad implications, scheduling constraints, notification behavior, category guidance, and the connector prerequisite. The one gap is that the reply/confirmation format is never described in the main description (only a passing mention in the schema's notifySubscribers note), so an agent does not know what response to expect after a successful publish.

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%, setting the baseline at 3. The description earns a 4 by adding cross-parameter semantics the individual schema entries lack: the interaction between privacy, publishAt, and notifySubscribers, the ad-readiness meaning of 'unlisted' versus 'private', and the rule that scheduling an unlisted/public post is refused. It synthesizes consequences rather than just restating field 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?

Opens with a specific verb+resource: 'Publish a finished video to the brand's connected YouTube channel.' The scope is sharpened by naming the acceptable input sources (Hermoso render URL or upload_file url) and by the early statement of the default privacy behavior. The platform target distinguishes it from the many sibling post_to_* tools without any 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?

Provides strong conditional guidance: unlisted is the default ad-ready mode, public requires user confirmation, private cannot be used as an ad, scheduling only works via private uploads, and a connected YouTube channel is a stated prerequisite. It does not explicitly name alternative sibling tools (e.g., 'use post_to_tiktok for TikTok'), but the per-mode when-to-use rules and refusal behaviors give an 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.

post_x_articlePublish a long-form Article to XAInspect

Publish a long-form ARTICLE to the user’s connected X (Twitter) account — X’s own long-form format, which is a different thing from a long POST. Give it a title and a body written in MARKDOWN (or plain prose) and Hermoso converts it into the DraftJS content_state structure X requires: headings, paragraphs, bulleted and numbered lists, blockquotes, bold / italic / strikethrough, links, horizontal rules, fenced code blocks and pipe tables all carry across. FORMATTING IS NEVER SILENTLY DROPPED — anything X Articles cannot represent (inline code, an inline image) REFUSES the article for free and names exactly what and why, and allowLossy: true is the explicit way to publish it as plain text anyway. THE HARD LIMIT TO PLAN AROUND: X allows only about 10 Article DRAFTS and 5 Article PUBLISHES per account per DAY, it publishes that cap nowhere, and it counts a FAILED attempt against them — so never iterate on an article by republishing it, and use publish: false to save a draft for the user to read in X’s own composer when they want to review before it goes out. This PUBLISHES immediately and PUBLICLY: show the user the full text and get an explicit yes first, because a published Article can NEVER be edited (X’s own rule — edit_x_post will refuse it) and the only remedy is to delete and republish, which costs another of the five. An Article appears in the timeline as a title card, not as body text; readers open it. Costs credits (X bills per API request, and this is three of them). Needs X connected (Settings ▸ Connectors ▸ X).

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesthe article body, as markdown or plain prose. Markdown headings, lists, quotes, links, emphasis, ``` code fences and | pipe | tables | are all converted to X’s own Article structure.
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.
titleYesthe Article title — X requires one and refuses a draft without it. This is what shows on the timeline card.
publishNodefault true. Pass false to save it as a DRAFT in the account’s X Articles composer instead — nothing becomes public, the user can review and publish it from X, and it does not spend one of the five daily publishes.
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.
headingsNohow headings are rendered. “blocks” (default) uses X’s own heading block types, which is the faithful conversion. “text” renders each heading as a BOLD standalone paragraph instead: the words survive and the heading structure does not, the reply says so, and it is the documented fallback if X’s Articles service rejects heading blocks.
allowLossyNopublish even though part of the source cannot be represented on X, rendering those parts as plain text. OFF by default and it should usually stay off — silently publishing a user’s copy with formatting missing is worse than refusing and telling them.
coverImageUrlNooptional cover picture for the Article — a Hermoso render URL or an upload_file url. Must be a STILL image; X Article covers are not videos.

TDQS

A4.7/5.0
Behavior5/5

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

The description carries a heavy disclosure burden and meets it: publishing is 'immediate and PUBLIC,' articles can 'NEVER be edited,' X's unpublished daily caps (10 drafts, 5 publishes) and the fact that failed attempts count against them are surfaced, cost is quantified (three API requests), and the formatting-refusal behavior is spelled out. None of this is recoverable from the sparse annotations, and nothing contradicts 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 a single very long paragraph, which hurts scannability, but every sentence carries operational weight: quota limits, irreversibility, cost, prerequisites, formatting guarantees, and safety protocol. The purpose is front-loaded and the density is justified for a tool with this many hard constraints; paragraph breaks would make it a 5.

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 high-complexity, quota-limited, irreversible publishing tool, the description is nearly exhaustive: it covers prerequisites (X connected), rate limits, failure semantics, cost, timeline display behavior, and the confirmation protocol. The one real gap is return value — there is no output schema, and the description never says what the tool returns (article ID/URL), which an agent would need to confirm success or report back to the user.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds operational meaning beyond the schema: it explains publish: false as the review-before-publication path, connects allowLossy to the refusal behavior ('the explicit way to publish it as plain text anyway'), and frames the title as a timeline-card element. These are workflow semantics, not just restated field 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 opens with a specific verb and resource: 'Publish a long-form ARTICLE to the user's connected X (Twitter) account.' It immediately carves out the distinction from a long POST, which directly separates it from the sibling post_to_x. The purpose is unmistakable even before reading the schema.

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

Usage Guidelines5/5

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

The description explicitly distinguishes ARTICLE from POST, names edit_x_post as a related tool that will refuse to edit a published article, and gives concrete workflow directives: 'use publish: false to save a draft for the user to read in X's own composer' and 'never iterate on an article by republishing it.' It also tells the agent when not to use allowLossy ('it should usually stay off'). This is explicit when/why guidance, not implied.

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

TDQS

A4.8/5.0
Behavior5/5

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

Annotations are sparse (only generic false hints), so the description carries the burden. It discloses the cost in credits per resolution, that the paid hero clip is always 15s regardless of total length, that dicing/cards are free and the music bed is included, and that the user must approve the spend. It also explains the faceless design as a deliberate way to avoid video-model spelling errors. 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?

Long but dense: every sentence carries operational signal, including length, composition, no-people constraint, refImage prerequisite, credit costs, approval requirement, and sibling alternatives. It repeats some schema cost details, but that repetition aids quick decision-making, and 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 high-complexity, costly 9-parameter tool with no output schema, the description leaves little ambiguity about what is produced, at what cost, under which constraints, and when not to use it. It even points to hermoso_capabilities for live Seedance pricing numbers, closing the remaining factual gap.

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

Parameters4/5

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

Schema coverage is 100% and the schema descriptions already carry cost, resolution, and seconds meanings, so the baseline is 3. The description adds consequential guidance beyond the schema, especially 'Pass a real packshot as refImage or the label will not be yours' and the clarification that seconds only repacks the cuts while the paid leg stays 15s, so it earns 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?

States a precise verb and resource: 'Render an 18-30s music-led PRODUCT SIZZLE', then details the exact composition (15s Seedance 2.0 hero clip, diced fast cuts, typeset spec/CTA cards, music bed). It explicitly contrasts with render_ad, generate_avatar, and make_template_ad, so an agent can distinguish it from siblings without inspecting schemas.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance: product sizzles that are faceless, music-led, and text-card-driven. It names alternatives and the conditions that select them ('For a talking/UGC ad use render_ad or generate_avatar; for a cheap deterministic format use make_template_ad'), plus the prerequisite of a real packshot and the requirement to confirm 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.

publish_to_shopify_productPublish an image onto a Shopify productAInspect

Attach a finished image to one of the merchant's Shopify product listings, as product media. Pass productId (from list_shopify_products — the gid://shopify/Product/… form) and a PUBLIC https imageUrl, which is what every Hermoso render returns. Shopify fetches the image server-side and processes it asynchronously, so the media can come back status PROCESSING and appear on the listing a moment later — that is success, not a failure. Only works for accounts created by installing Hermoso from the Shopify App Store. Free — the render was already paid for.

ParametersJSON Schema
NameRequiredDescriptionDefault
altNoalt text for accessibility and SEO; defaults to a generic credit
imageUrlYesany public https image URL — a Hermoso render works, and so does ANY file of your own brought in with upload_file
productIdYesgid://shopify/Product/… from list_shopify_products

TDQS

A4.4/5.0
Behavior5/5

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

This description goes well beyond the annotations by explaining the asynchronous Shopify fetch-and-process behavior, explicitly warning that a PROCESSING status is success rather than failure, and noting the account-installation prerequisite. These are non-obvious behavioral traits that an agent could easily misinterpret without this 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?

Every sentence earns its place: purpose, required parameters, asynchronous success semantics, and a hard prerequisite. The most important operational warning (PROCESSING means success) is front-and-center, and the description stays compact despite covering a lot of useful ground.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 schema already documents alt, imageUrl, and productId, the description supplies all missing contextual essentials: where to get productId, what imageUrl should point to, the async outcome to expect, the account restriction, and cost behavior. No output schema exists, but the description effectively tells the agent what success looks like after 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, but the description adds real value by clarifying that productId must take the gid://shopify/Product/... form and come from list_shopify_products, and by emphasizing that imageUrl must be public and is typically a Hermoso render. This reinforces and extends the schema descriptions without repeating them verbatim.

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 uses a specific verb ('Attach') and names the exact resource ('one of the merchant's Shopify product listings, as product media'), so the core purpose is unmistakable. However, it never directly differentiates itself from the sibling set_product_image, leaving the agent to infer the distinction between publishing onto Shopify and setting a product image elsewhere.

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 operational guidance: use productId from list_shopify_products, use a PUBLIC https imageUrl, and only attempt this for accounts installed via the Shopify App Store. It does not explicitly contrast this tool with alternatives or say when not to use it, so it misses the 'when-not' element, but the context provided is strong.

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

THE FAST PATH for "show me the ads is running" — one named brand’s real live ads from the META (Facebook/Instagram) ad library, deduped, sorted, with the right page resolved. A single call, back in a few seconds. Prefer this over research_ads whenever the brand is named. Meta only, deliberately: it has by far the richest creative and is what people mean by "their ads". For Google or LinkedIn specifically, use search_google_ads or search_linkedin_ads. Spends credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNo'longest_running' (default) etc.
limitNomax ads per platform (default 30)
domainNothe advertiser domain
countryNo2-letter, default 'US'
companyNameNothe advertiser name

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already mark this as read-only and non-destructive, and the description adds meaningful behavioral context: the call spends credits, returns deduped and sorted results, and resolves the correct page. This goes beyond the structured safety hints 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 longer than the minimum but every sentence earns its place: it states the use case, scope, alternatives, and credit cost. The opening phrase is front-loaded and scannable, though the tone is slightly promotional.

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 no output schema, the description still communicates what the agent should expect conceptually: real live ads, deduped, sorted, and with the page resolved. It also covers scope, alternatives, and side effects, leaving only fine-grained return-field details unspecified.

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 heavy lifting is done by the input schema. The description reinforces that the tool targets a 'named brand' and mentions sorting, but it does not add substantial parameter-level meaning 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 a clear, specific statement: it is the fast path for showing one named brand's real live ads from the Meta ad library, deduped, sorted, and with the right page resolved. It names concrete alternatives like research_ads and search_google_ads, making the tool's niche 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 says to prefer this tool over research_ads whenever the brand is named, and directs users to search_google_ads or search_linkedin_ads for Google or LinkedIn. This gives an agent clear routing rules with no need for inference.

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)

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark read-only and non-destructive, but the description adds meaningful behavioral context beyond that: the drive.file scope boundary, the create-or-pick prerequisite, and the specific Google error semantics. This is exactly the kind of operational detail an agent needs.

Agents need to know what a tool does to the world before 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 core purpose. Every sentence earns its place: access scope, parameter options, error handling, return value, and the read-only/free status. 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?

With only two optional parameters, no output schema, and read-only annotations, the description covers everything needed: input alternatives, access model, failure handling, and the plain-text return value. An agent can correctly select and invoke this tool without consulting other definitions.

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 both parameters at 100% coverage, so the baseline is 3. The description adds the otherwise-unstated relationship that the caller should pass either documentId or docUrl, while clarifying where each comes from, which is meaningful added 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 leads with a specific verb and resource ('Read the text of a Google Doc') and immediately scopes what 'reachable' means, distinguishing discovery via list_drive_files from reading. This clearly separates read_doc from update_doc and drive management siblings without requiring them to be named.

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 a doc is readable only if Hermoso created it or the user handed it over via the picker, and tells agents to find existing docs with list_drive_files. It also gives actionable handling for a 'file not found' response: ask the user to pick it rather than retrying, which is explicit 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.

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)

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description adds meaningful behavioral context: access is limited to sheets Hermoso owns or the user explicitly picked, and a 'file not found' response is diagnosed as a permission/picker issue rather than a retryable error. This tells the agent what actually happens in a key failure scenario. No contradiction with the readOnlyHint/openWorldHint/destructiveHint 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 serves a purpose: access model, parameter guidance, error handling, and return type. The description is dense but not bloated, with no filler or repetition of the 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?

For a read-only tool with no output schema, the description covers enough to call it correctly: how to identify the sheet, how to pass it, what happens on failure, and what the response looks like. Combined with the complete input schema, 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 coverage is 100%, so the schema already documents each parameter. The description adds value by clarifying the relationship between spreadsheetId and sheetUrl (pass one OR the other) and by reinforcing where each identifier comes from. This goes beyond the schema's individual parameter descriptions, though it does not explain behaviors when both are supplied.

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

Purpose5/5

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

The description names a specific operation (read cells), a specific resource (a Google Sheet), and a precise scope (sheets Hermoso created or the user handed over via the file picker). This clearly differentiates it from sheet-writing siblings like update_sheet, append_to_sheet, and clear_sheet_range, and the return shape is even stated.

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

Usage Guidelines4/5

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

It gives concrete invocation guidance: use spreadsheetId from create_sheet or a Google Sheets URL as sheetUrl, and explains how existing spreadsheets become readable, including finding the id via list_drive_files. It also provides an explicit error-handling rule (do not retry; ask the user to pick the file). It does not explicitly name write-tool alternatives or state when not to use this tool, but the context is otherwise clear.

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

TDQS

A4.2/5.0
Behavior3/5

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

Annotations are all false, so the description carries the burden of behavioral disclosure. It adds one meaningful trait: 'Paid render.' However, it does not disclose output format, expected duration, or whether this is asynchronous, which would be useful for a paid generation 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?

Three short sentences with no wasted words. The core concept is front-loaded ('Motion transfer'), the input relationship is explained succinctly, and the paid nature is called out separately. Everything present 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 tool with two required parameters and only two optional ones, the description provides enough to select and invoke it correctly. The paid-render note adds operational context. There is no output schema, so a note on return value would improve completeness, but it is not essential 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 schema already documents all parameters. The description adds conceptual value by clarifying the functional roles: the reference clip drives motion while the image supplies identity, which reinforces the meaning of the video and image parameters beyond their 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 names a specific operation (re-perform motion from a reference video) and clearly separates the two inputs' roles: the video drives movement, the image supplies identity. This distinguishes it from related video siblings like generate_video, edit_video, or reframe_video without needing to open their schemas.

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 intended usage scenario is explicit: motion transfer between a reference video and a different person/character supplied as an image. It does not mention when-not-to-use or name alternatives, but the context is clear enough that an agent can infer 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.

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

TDQS

A3.8/5.0
Behavior4/5

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

The description adds useful behavioral context beyond the annotations: it discloses that this is a paid render and that the return value is the served URL of the reframed video. This is meaningful because readOnlyHint is false, and the cost implication is important for an agent deciding to invoke 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 two sentences, front-loads the core purpose, and includes the essential cost and return information with no filler. Every clause 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 no output schema, the description appropriately states what is returned (served URL). It also covers cost, the main input-output relationship, and a concrete use-case example. Minor gaps remain around render time or credit requirements, but these are not critical for tool selection.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents both parameters. The description reinforces the aspect-ratio semantics with an example but does not add new parameter-level details beyond what the schema's enum and descriptions already provide.

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 reframes a video to a different aspect ratio, with a concrete example (16:9 → 9:16) and a distinguishing feature (smart subject tracking). It does not explicitly name sibling tools like clip_video or edit_video, so it does not fully satisfy the 'distinguishes from siblings' bar.

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 a video needs aspect ratio conversion. However, it offers no explicit guidance on when not to use it or which sibling tools (e.g., clip_video, upscale_video) might be more appropriate for other video edits.

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. NEVER how Hermoso, a tool, a connector or a platform API behaves (what a call returns, errors, permissions, limits, ids) and never a phone number or email — those are refused.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesthe fact/preference, concise
categoryNoshort bucket: Brand, Audience, Taste, Do, Don’t, or Preference (default General)

TDQS

A4.7/5.0
Behavior5/5

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

The description adds meaningful behavioral detail beyond the annotations: it merges into existing memory, never overwrites, de-dupes identical text, and refuses certain content types. These are non-obvious effects an agent needs to predict the outcome of a call, and they do not contradict the readOnlyHint or destructiveHint values.

Agents need to know what a tool does to the world before 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 core purpose is front-loaded, followed by examples and then merge/refusal semantics. Every sentence contributes a distinct piece of guidance, and there is no filler or redundant restatement of 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 simple two-parameter write tool with no output schema, the description covers what to save, what never to save, how duplicates are handled, and why the memory matters. An agent has enough context to invoke the tool correctly without needing more 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 100%, so the baseline is 3, but the description enriches the `text` parameter with concrete examples and explicit exclusions (tool behavior, phone numbers, emails). It does not add much about `category`, but the schema already enumerates the category options and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 durable fact or PREFERENCE... into the workspace Memory'. It gives concrete examples and clearly differentiates from sibling tools like list_memory, forget, and tidy_memory by emphasizing persistence and influence on future 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?

It clearly says when to use the tool ('For lasting things, not one-off requests') and gives strong negative guidance about what must never be stored. It does not explicitly name alternative tools for one-off or retrieval scenarios, so it stops just short of full alternative routing.

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

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate this is a non-read-only, non-idempotent operation. The description adds valuable behavioral context: it bills as one image generation, removes all traces of the source brand, and switching brandId changes the key's active brand like use_brand. This goes beyond the generic annotation flags and gives the agent meaningful operational 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 well-organized: purpose first, then usage instruction, then exclusions and billing. Every sentence earns its place, and the key routing information ('IMAGES ONLY — for video ads use render_ad') is front-loaded enough to guide quick selection.

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

Completeness4/5

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

For a two-parameter tool with no output schema, the description covers the core selection and invocation needs: what to pass, how brand selection works, the side effect on the active brand, the image-only boundary, and billing cost. It does not describe the return value or asynchronous behavior, but that is not essential 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?

Schema coverage is 100%, so both parameters are already documented in the schema. The description adds extra meaning by specifying that imageUrl is the static ad to remix and that brandId not only targets a brand but switches the active brand for the key, a side effect not stated 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 names a specific verb ('remix') and resource ('static ad image'), and specifies exactly what the output is: an on-brand version with the same layout and composition but the user's product, colors, logo, and voice. It clearly distinguishes itself from render_ad by stating it is for images only, so an agent can tell it apart 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 gives explicit guidance: pass imageUrl for the static ad, use brandId to target a specific brand, omit brandId to use the active brand, and use render_ad for video ads. This is direct when-to-use and when-not-to-use instruction with a named alternative.

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

TDQS

A4/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: 'they lose access' explains the destructive consequence, and '(you can re-invite them later)' clarifies reversibility. It also specifies the confirmation requirement. This goes beyond the bare destructiveHint and readOnlyHint flags, 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?

Two tightly written sentences. The first delivers the core action and consequence; the second provides the required confirmation workflow. No filler, 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.

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 destructive tool, the description covers the action, effect, reversibility, and the confirm requirement. With annotations already conveying destructiveness and idempotency, the only minor gap is what happens for a non-existent email or error cases, but this is not critical for a tool this straightforward.

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 email and confirm thoroughly. The description does reinforce that email identifies the member and that confirm must be true, but it does not add significant new parameter semantics beyond the structured 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: 'Remove a member from this brand workspace by email'. It clearly distinguishes from sibling tools like invite_member and set_role by emphasizing removal and the loss of access, 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 Guidelines3/5

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

The description gives useful context for when to use the tool (removing a member, with reversibility noted) and a clear workflow: confirm the person with the user, then pass confirm:true. However, it does not explicitly name alternatives or state when not to use this tool versus siblings like set_role or invite_member.

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 storyboard that FITS ONE CLIP OF THE RENDER MODEL renders as a single continuous pass; anything longer automatically renders as STITCHED ACTS (the fewest balanced clips, each at most one model clip) — never time-compressed into one clip. That threshold is the render model’s own maximum, not a fixed number: most models cap a clip at 15s and the longest-clip one goes to 30s, so use dryRun:true to see the act split this plan will actually get, for free, before spending. 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)
captionsNoburn the plan's per-scene on-screen words as caption pills. DEFAULT FALSE — leave it off unless the user asks for on-screen text (no captions, or true subtitles of what is said; never scene or emphasis labels); a recipe whose format IS on-screen text keeps its text either way
creativeYesthe FULL structured output of plan_ad (must contain video_storyboard)
ttsVoiceNovoiceover voice name (e.g. Rachel / George) when the plan voices over
resolutionNo'1080p' default (what we ship and bill for); '480p'/'720p' = cheaper draft passes, '4k' = premium final delivery (more credits). NOT EVERY MODEL OFFERS EVERY TIER — this enum is what the tool accepts, and each model's OWN `resolutions` list in hermoso_capabilities is what it can actually render (the longest-clip 30s model, for one, tops out at 720p). Ask for a tier the chosen model does not list and it is rendered at that model's best available tier instead, with nothing in the reply saying so — so check `resolutions` before promising anyone 1080p or 4k.
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. A length that fits ONE clip of the render model renders as one continuous pass; longer is stitched from acts filled to that model’s clip maximum with the remainder last — the maximum is 15s on most models and 30s on the longest-clip one, so 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

TDQS

A4.5/5.0
Behavior5/5

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

With all four annotations false, the description carries the full burden and delivers unusually well: it discloses 'Spends credits,' 1–3 min latency with get_job polling, automatic STITCHED ACTS routing, silent resolution fallback ('rendered at that model's best available tier instead, with nothing in the reply saying so'), and explicit creator-refusal conditions. None of this contradicts the annotations; readOnlyHint=false is consistent with a credit-spending mutation.

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 ~230-word body is dense with genuine information and front-loads the core purpose before behavioral detail; nearly every sentence earns its place. However, the heavy ALL-CAPS emphasis (RECOMMENDED, SAME, STITCHED ACTS, DELIBERATE) and stream-of-thought structure reduce scannability for an agent trying to extract key facts quickly.

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 13-parameter, credit-spending tool with no output schema, the description is remarkably complete on behavior: defaults, fallbacks, refusals, latency, routing, and cost are all covered. The main gap is the return payload of a submitted render — it implies a job via 'keep polling get_job if it returns still-rendering' but never states what render_ad itself returns.

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 workflow-level semantics the schema cannot, such as linking `creative` to plan_ad's output, `creator` to the list_creators roster, `dryRun` to a free act-split preview, and `resolution`/`model` to hermoso_capabilities. Since the schema already documents each parameter in exceptional detail, the incremental value is real but moderate.

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

Purpose5/5

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

States a specific verb and resource — 'render a plan_ad concept through the SAME quality pipeline' — and opens with the routing signal 'RECOMMENDED for finished video ADS.' It distinguishes itself from plan_ad (which produces the creative input) and from generic video-generation siblings by requiring plan_ad's full structured output as `creative`.

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

Usage Guidelines4/5

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

Gives clear context and chains the surrounding workflow: plan_ad produces `creative`, list_creators is the casting roster, hermoso_capabilities lists models/resolutions, and get_job is polled while rendering. It does not explicitly name sibling rendering alternatives (generate_video, make_template_ad, multiply_ad) or state when not to use them, so it falls short of a full when/when-not routing.

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

TDQS

A4.5/5.0
Behavior4/5

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

The description adds useful behavioral context beyond the annotations: it explicitly states the action has no credit cost ('Free, no credits') and clarifies that it reports to the team rather than fixing the issue. The annotations already indicate non-read-only, non-destructive, non-idempotent behavior, and the description 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?

The description is compact and every sentence earns its place: a clear opening statement, concrete use-case examples, explicit submission guidance, exclusions with the alternative, and a cost note. It is front-loaded with the core purpose and then narrows to conditions and constraints.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 reporting tool with two required string parameters and one optional enum, the description covers when to use it, what to include, what not to include, and the cost implication. No output schema is needed for a submit-style tool, and the annotations plus schema fully cover the remaining semantics.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are already well documented. The description's guidance about including what you were trying to do, the exact tool call, and what came back largely paraphrases the existing 'details' parameter description, so it adds limited new semantic value. It also does not explain the summary or severity parameters 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 action ('report a bug in Hermoso to the team') and gives a specific definition of what counts as a genuine bug: unexpected errors, wrong or malformed results, broken renders, or behavior that contradicts documentation. It also names its key sibling, request_feature, when describing what the tool is not for, helping an agent distinguish it from nearby capabilities.

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 agents when to use the tool ('when something in Hermoso genuinely misbehaves') and when NOT to use it ('out-of-credits, a policy refusal, or a missing capability'), pointing to request_feature as the alternative. This is exactly the level of routing guidance an agent needs.

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

TDQS

A4.3/5.0
Behavior4/5

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

The annotations provide a baseline (readOnlyHint=false, openWorldHint=true, idempotentHint=false) but the description adds meaningful behavioral context: submitting a request to the Hermoso team, requiring the user's goal rather than just a feature name, and being 'Free, no credits.' 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 three compact sentences, front-loaded with purpose, then usage signals, then guidance on writing the request, then the cost implication. Every sentence earns its place and there is no redundant restating of the tool 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?

For a simple two-parameter request tool with no output schema, the description fully covers what the tool does, when to use it, what to include in the request, and the fact that it costs nothing. Nothing needed for correct invocation is missing.

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

Parameters3/5

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

Schema coverage is 100%, so both 'summary' and 'details' are already documented in the input schema. The description reinforces the important semantic of 'details' by explaining what the user was trying to achieve rather than just a feature name, but it does not go far beyond the schema, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Ask the Hermoso team for a capability that doesn't exist yet') with a clear resource and scope. It identifies the exact kinds of missing capabilities (unsupported platform, missing model, export format, unavailable tool), making it easy for an agent to understand what this tool is for and distinguish it from operational siblings like report_bug or enable_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 when to use this tool: 'when you need something Hermoso genuinely can't do' and gives concrete examples. It does not explicitly name alternatives or state when not to use it (e.g., 'for bugs use report_bug'), but the usage context is clear enough that an agent can route to this tool confidently.

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
chatIdNoTELEGRAM — send it to a different chat, group or channel (@username or numeric id). It can be changed but never cleared: telegram cannot publish without one.
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 screen-reader description(s). A STRING describes every slide; an ARRAY describes them one at a time in slide order and REPLACES the whole list. "" 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
topicTagNoTHREADS ONLY — one topic tag, without the leading #.
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.
slideTextNoPINTEREST CAROUSEL ONLY — per-slide title / description / link, aligned to slide order.
topicTypeNoGOOGLE BUSINESS — the kind of Post; EVENT and OFFER both require `event`.
trialReelNoINSTAGRAM — replaces the trial-reel setting on a queued Reel (MANUAL or SS_PERFORMANCE); an explicit "" turns the trial off and it goes out as an ordinary Reel. Only takes effect while the post is still queued — a Reel already published cannot be converted into a trial.
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
aiGeneratedNoINSTAGRAM / FACEBOOK REEL — Meta’s is_ai_generated self-disclosure. OMIT IT and Hermoso decides from provenance: a Hermoso render is declared, media that came through upload_file or from an external URL (the user’s own photographs or footage) is NOT — a real photo must never carry Instagram’s “AI info” label. Pass true or false only to override: false strips the label from something Hermoso would otherwise declare, true declares a render the user uploaded themselves.
communityIdNoX — the community to publish into; an empty string goes back to the main timeline.
descriptionNoYOUTUBE — replace the video description; "" clears it. Remember the caption is the TITLE, not the description.
disableDuetNoTIKTOK VIDEO ONLY — block Duets.
quotePostIdNoTHREADS ONLY — the id of the Threads post this one quotes.
countryCodesNoTHREADS ONLY — two-letter country codes limiting who can see the post.
privacyLevelNoTIKTOK — WHICH PRIVACY LEVEL the post goes out at, in TikTok’s own vocabulary. TikTok requires the USER to choose this from the levels their own account allows: call tiktok_creator_info, show them the real options, and pass back the one they picked — never a default and never a guess, which TikTok refuses at init. Omit it and the post falls back to the coarse `visibility` (private → SELF_ONLY, otherwise PUBLIC_TO_EVERYONE), which cannot express MUTUAL_FOLLOW_FRIENDS or FOLLOWER_OF_CREATOR at all. It must agree with the TikTok visibility (SELF_ONLY is the private one) and it is refused on a TikTok DRAFT, which carries no post info.
replyControlNoTHREADS ONLY — who may reply.
xQuotePostIdNoX — the post this one QUOTES; an empty string removes the quote. Named apart from the Threads `quotePostId` on this same schedule.
collaboratorsNoINSTAGRAM — replaces the WHOLE collab list (up to 3 usernames); an explicit [] removes the co-authors and the post goes out as an ordinary single-author post. Only takes effect if the post has not fired yet — an invite already sent cannot be withdrawn from here.
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.
linkAttachmentNoTHREADS ONLY — a full http(s) URL rendered as a link card on a TEXT-ONLY post. The only way a Threads post carries a destination.
paidPartnershipNoX — the paid-partnership label; false turns it off.
coverTimestampMsNoTIKTOK VIDEO ONLY — cover frame in milliseconds.
crossreshareToIgNoTHREADS ONLY — also share to Instagram as a Story when it fires; false turns it off. Refused on a carousel.
commercialContentNoTIKTOK — the COMMERCIAL CONTENT DISCLOSURE toggle: true when this post promotes a brand, product or service at all. TikTok requires at least one of yourBrand / brandedContent once it is on, and refuses a post that declares itself commercial without naming which kind. Either disclosure already implies it.
visibilityByChannelNo
crossreshareDarkModeNoTHREADS ONLY — dark-mode that Instagram Story. Needs crossreshareToIg.
linkedinOrganizationIdNoLINKEDIN — target a different company Page, or "" to post as the connected person instead

TDQS

A4.7/5.0
Behavior5/5

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

Annotations carry the basic mutation safety profile (readOnlyHint=false, destructiveHint=false), but the description adds substantial behavior beyond that: the PATCH-like semantics ('an omitted field is left exactly as it was, and an explicit empty string CLEARS one'), the re-validation guarantee that an edit cannot slip past a create-time refusal, and the visibility/visibilityByChannel interplay warning. This is exactly the kind of context annotations cannot express.

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

Conciseness4/5

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

All five sentences earn their place: scope, partial-update rule, re-validation, id sourcing, published-post exclusion. The critical semantics are front-loaded before the schema dump. It is long, but proportionally justified by 50 parameters and channel-specific behaviors; a structured bullet list would have made it marginally easier to scan.

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 50-parameter tool with no output schema, the description covers the essentials: the partial-update contract, validation parity with create, id provenance, and the hard exclusion for published posts. The only noticeable gap is that the description never states what the tool returns after a successful edit, which the absence of an output schema leaves to inference.

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 (96%), so the baseline is 3. The description adds genuine global meaning beyond the schema with the 'PASS ONLY WHAT CHANGES / empty string clears' rule, which applies to all 50 parameters and is not derivable from individual param docs. It also groups the change dimensions in the first sentence. It does not add per-parameter detail beyond the schema, but the global semantic rule justifies one point 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+resource: 'Change a post that is still QUEUED' and enumerates the dimensions of change (time, caption, media, channels, destination). It explicitly distinguishes itself from the published-post editing path by naming manage_meta_post / manage_linkedin_post / delete_x_post as the alternatives, and the QUEUED restriction separates it from cancel/duplicate/retry 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?

States exactly when to use it (queued posts only) and routes to alternatives explicitly: 'a published post is edited or removed with manage_meta_post / manage_linkedin_post / delete_x_post, not rescheduled.' It also tells the agent where to get the required id ('Get the id from list_scheduled'). The when/when-not guidance is fully explicit.

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

Open-ended ad research that needs JUDGMENT across platforms — comparisons, "what angle is working", "who else is doing this", anything where the right sources are not known up front. It is an agentic loop (several rounds of library pulls plus a written synthesis) and typically takes 30-60 seconds, so it is the WRONG tool for a question that names its own answer. For one named brand’s live ads use pull_competitor_ads; for one keyword or one advertiser on Meta use search_meta_ads — both are a single call and return in a few seconds. Spends credits — an agentic loop, so a handful rather than the one-call cost of a targeted search.

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"

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false. The description goes well beyond that by disclosing the agentic multi-round loop, written synthesis output, 30-60 second duration, and credit cost compared to a single targeted search. This gives the agent important operational expectations 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 well-structured and front-loaded: the core purpose is in the first sentence, followed by usage boundaries and alternatives. It is slightly repetitive around 'agentic loop' and cost, appearing twice, but each sentence otherwise adds distinct 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?

For a complex, open-ended, cost-incurring tool with no output schema, the description covers the key operational facts: exploratory nature, agentic loop, timing, credit cost, and alternatives. It does not detail the exact format of the 'written synthesis' output, but the description is otherwise sufficiently complete for an agent to decide when 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%, so the schema already documents both 'query' and 'brand' parameters, including the optional brand object and the saved-brand fallback. The tool description adds some contextual flavor (e.g., 'what to research') but no new parameter-level semantics 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 states a specific verb and resource ('Open-ended ad research that needs JUDGMENT across platforms') and clearly distinguishes itself from siblings like pull_competitor_ads and search_meta_ads. It conveys the tool's unique niche: exploratory, cross-platform research where the right sources are not known up front.

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 (open-ended comparisons, 'what angle is working', 'who else is doing this') and when NOT to use it ('the WRONG tool for a question that names its own answer'). It names concrete alternatives: pull_competitor_ads for one named brand's live ads, search_meta_ads for one keyword or advertiser on Meta.

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 that goes out RIGHT AWAY — the queue picks it up on its next pass, within seconds — 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 — and you can fix it IN THIS CALL: pass boardId, pageId, linkedinOrganizationId, locationId, message or captions to correct the value that failed, and the corrected post is re-validated exactly like a fresh schedule. That matters because the commonest cause is a field, not an outage: a Pin aimed at the wrong board fails identically however many times it is re-sent. Anything you do not name is copied from the original. To send the same thing again ON PURPOSE, use duplicate_scheduled.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNohold the retry until a later time — ISO timestamp or epoch milliseconds. Leave it out to retry immediately, which is almost always what you want. A time you name here must be at least a minute from now, exactly like any other scheduled post.
idYesthe scheduled post id from list_scheduled
chatIdNoCORRECT THE TELEGRAM DESTINATION on retry — the @username or numeric id of the chat. A post aimed at a chat the bot is not in fails every time it is retried until this changes.
pageIdNoCORRECT THE PAGE on retry — which connected Facebook Page (and its linked Instagram/Threads) publishes, from list_meta_pages.
boardIdNoCORRECT THE BOARD on retry — the Pinterest board the Pin goes on, from list_pinterest_boards. A Pin aimed at a board Pinterest refuses fails the same way on every retry until this is changed.
messageNoCORRECT THE CAPTION on retry — use this when the original was refused for length or content. Anything not named here is copied from the original post.
captionsNoCORRECT ONE CHANNEL’S CAPTION on retry, e.g. { "x": "..." } when only that channel refused the text.
channelsNoretry only these channels (default: every channel that did not publish)
locationIdNoCORRECT THE LISTING on retry — which Google Business Profile location, e.g. "locations/123" from list_business_locations.
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.
linkedinOrganizationIdNoCORRECT THE LINKEDIN AUTHOR on retry — the company Page id from list_linkedin_pages. Set it to an empty string to fall back to the personal profile.

TDQS

A4.8/5.0
Behavior5/5

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

The description richly discloses behavior beyond the minimal annotations: it re-queues as a new post immediately, preserves the original failure record, refuses already-published channels, blocks double-posts with two independent safeguards, and re-validates corrected content. This is far more than 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 long, but the tool has nuanced failure semantics and 11 parameters, so the length is justified. It is well-structured: core behavior first, then refusal guarantees, then the correction workflow, then the sibling tool distinction. A few illustrative sentences could be trimmed without loss, but nearly 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 high complexity, minimal annotations, and no output schema, the description covers everything an agent needs to invoke correctly: partial failures, default channel selection, double-post protection, unresolved-outcome handling, correction parameters, and when to route to duplicate_scheduled. The lack of a stated return format is a minor gap relative to the dense operational context provided.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds strategic meaning beyond the schema: the default retry scope is 'every channel that did not publish,' uncorrected fields are copied from the original, and correction parameters trigger re-validation like a fresh schedule. This consolidates the parameters into a coherent mental model.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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,' naming a specific verb and resource, and immediately clarifies the partial-failure scope. It explicitly distinguishes itself from duplicate_scheduled, so an agent can tell them apart without opening schemas.

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

Usage Guidelines5/5

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

It gives clear when-to-use guidance: retry after fixing the cause, and you can fix the cause in the same call. It also states when not to use it — naming a channel that already published is refused, unresolved outcomes are refused, and deliberate re-sends should use duplicate_scheduled.

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.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only carry generic hints (readOnly=false, destructive=false, idempotent=false), so the description carries the real burden and delivers: dry-run-by-default semantics, no creative spending in preview mode, voice-rule screening that can drop captions (explaining why plans come back shorter), notes as the reason carrier, and a hard warning that dryRun:false posts to real public accounts. None of this is derivable from the annotations.

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

Conciseness4/5

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

The description is dense (~100 words) but every sentence earns its place: purpose, preview contract, execution trigger, safety warning, and screening edge case. It is front-loaded with the core action and uses caps-lock sparingly to highlight the two safety-critical directives. Slightly long but justified by the tool's risk profile.

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 no output schema, the description compensates by specifying the preview shape (caption, creative, channels, per-channel visibility) and the notes field. Both parameters are fully documented in the schema, and the safety/edge behaviors are disclosed. Minor gaps (exact force/dryRun interaction lives only in the schema; notes content unspecified) keep it from a 5.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description reinforces dryRun's default-true behavior and the 'actually queue them' flip, but it adds no parameter-level meaning the schema doesn't already provide. The force parameter's interaction with stored dryRun is documented only in the schema, which is acceptable at full 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 opening sentence 'Run the refill NOW instead of waiting for its daily turn' names a specific verb (run), a specific resource (the posting refill), and the distinguishing scope (immediate trigger vs scheduled daily turn). This clearly separates it from configuration/state siblings like set_post_refill and get_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 establishes a clear usage protocol: invoke for an immediate trigger, preview via the default dryRun, and only pass dryRun:false after showing the user the preview. It does not name sibling alternatives or state explicit when-not-to-use 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.

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

TDQS

A4.5/5.0
Behavior5/5

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

With annotations limited to default false flags (readOnlyHint false, destructiveHint false), the description carries the behavioral burden and delivers: it discloses the persistence side effect (creator appears in list_creators), the cost profile ('Saving is FREE and renders nothing'), and the consent policy ('never assert that on their behalf'). No contradiction with annotations — readOnlyHint false is consistent with a write operation.

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 front-loaded with the core purpose, and the 'LIKENESS —' section break organizes the parameter guidance. Every sentence carries actionable information, though the length is substantial and there is slight redundancy with the schema text for image and name.

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 7-parameter tool with no output schema and sparse annotations, the description covers purpose, prerequisites (upload_file for local files), side effects, cost, and consent constraints thoroughly. The only gap is that no direct return value is described, though 'from then on list_creators returns them' partially compensates by telling the agent how to verify the result.

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 semantics beyond the schema, particularly for source ('leave it "generated" for an AI-made person, and use "upload"/"social" ONLY for a REAL person') and consented ('only when the user has told you that person agreed to their likeness being used'). This elevates it above the schema-only 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 and resource — 'Add a portrait to this workspace's reusable CAST so the SAME person can star in future ads' — and explains the persistence effect. It distinguishes itself from siblings by naming its downstream consumers (list_creators, generate_avatar, generate_video, recast_motion) and referencing the app's picker-save flow, so an agent can tell it apart from related creator 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 clear workflow context: pass a public url, use upload_file first for local paths, and after saving use the url with the listed generation tools. It also gives strong conditional rules for source and consented. It does not explicitly name a when-not-to-use alternative, though no direct sibling substitute for saving a creator exists.

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)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already signal that this is not read-only and not idempotent, but the description adds useful context beyond that: the data lands in the same Playbooks library the web app uses, and the operation is free. It does not cover duplicate-vs-update behavior, but the annotation coverage lowers the 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 compact and front-loaded: it states what is saved, why, where it lands, and what it is not. Every sentence carries distinct information with no filler or tautology.

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 a rich schema, no output schema, and a save operation, the description covers the purpose, use cases, destination, and sibling distinctions well. The main gap is what happens on repeated saves with the same name (duplicate creation vs update), but the overall orientation is strong.

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 input schema already documents all seven parameters. The description reinforces the high-level categories (hooks, angles, formats, plays) but adds little beyond what the schema provides, making the baseline 3 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 ('Save') and resource ('reusable PLAYBOOK'), and enumerates exactly what a playbook contains: hooks, angles, formats, and concrete plays. It also explicitly differentiates itself from save_skill and the swipefile, so an agent can identify this tool among many 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 concrete triggers for use: after competitor_teardown or mine_angles, or to bank a repeatable creative. It also names alternatives and explains the distinction ('Distinct from save_skill... and from the swipefile'), giving the agent clear routing guidance.

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, a named specialist persona like “our founder-story style” or “short-form ad strategist”). 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)

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already indicate a mutating, non-idempotent write, and the description adds that the skill merges into the workspace Skills library and appears alongside built-ins in list_skills. It does not disclose important behavior such as whether saving a skill with an existing name overwrites it or creates a duplicate, which matters given idempotentHint is 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 yet efficient: it defines the resource with examples, states the required directive form, and mentions the resulting library placement. 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.

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 creation tool with no output schema, the description provides enough context for an agent to decide what to pass and why. The only notable gap is the unspecified behavior on name collisions, but overall the tool is adequately specified.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema: the directive must be distilled, imperative, self-contained, and applied to future ads, and it provides name-style examples. This elevates the parameter guidance above mere schema repetition.

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?

Clearly states the action (Save) and resource (reusable custom SKILL), and defines what counts as a skill with concrete examples like hook formula, UGC recipe, and specialist persona. It also anchors the tool in the Skills library via list_skills, but it does not explicitly contrast with the sibling save_playbook, which uses overlapping 'playbook' language.

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: to save a reusable creative directive applied to future ads, and it gives guidance on directive quality (imperative, self-contained). However, it never explicitly states when not to use it or how it differs from alternative save_* tools such as save_playbook.

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)

TDQS

A4.6/5.0
Behavior5/5

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

The description adds substantial context beyond annotations: the drive.file scope limitation ('reaches ONLY the files it created plus any the user explicitly handed over... never their whole Drive'), the folder-creation side effect, the return value (webViewLink), and that one connection covers Drive, Sheets and Docs. No contradiction with annotations — readOnlyHint=false and destructiveHint=false are consistent with a save operation.

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

Conciseness4/5

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

Front-loaded with the core purpose, then proceeds logically: input forms, upload_file workflow, options, return value, prerequisite, and scope caveat. Dense but every sentence carries unique weight; the NOTE about drive.file scope is well-placed at the end so it doesn't obscure the primary workflow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 write tool with no output schema: it covers both input modes, the upload_file prerequisite, the folder side effect, the return format (webViewLink), the connection requirement, and the access-scope limitation. The only minor ambiguity is behavior when both url and urls are supplied, a small edge case against an otherwise thorough definition.

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 workflow-level meaning beyond the schema by tying url to upload_file's return value, clarifying the url-vs-urls[] single/multiple split, and noting folder is created if new. This enriches parameter understanding without duplicating schema text.

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

Purpose5/5

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

States a specific verb ('Save') and resource ('the user's connected Google Drive'), further scoped by input type ('a Hermoso render — or ANY file'). The description clearly distinguishes from siblings: save_to_onedrive targets OneDrive, save_to_swipefile targets the Swipefile, and upload_file is positioned as a prerequisite rather than the target 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?

Provides explicit workflow guidance: 'for a local/external file, call upload_file first and pass the url it returns,' plus the Drive-connection prerequisite and the single-vs-multiple input pattern (url vs urls[]). It does not explicitly name sibling alternatives as 'when not to use' exclusions, but the destination and prerequisite information make selection unambiguous.

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)

TDQS

A4.1/5.0
Behavior4/5

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

Goes beyond the annotations by explaining that the tool creates the folder if new, returns a webViewLink, and requires OneDrive to be connected. These are useful behavioral details. It does not clarify overwrite or duplicate behavior, but the disclosed traits add 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.

Conciseness5/5

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

Three highly informative sentences with no filler. The core action, parameter usage, prerequisite, return value, and setup need are all packed efficiently. 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 tool with 4 simple parameters and no output schema, the description covers the important invocation details: what to pass, how to handle local files, return value, and auth prerequisite. The urls max count is in the schema, so no gap there. Slightly more detail about file naming or behavior on collisions would improve it, but it is largely 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 the baseline is 3. The description adds value by clarifying the relationship between url and urls (single vs several renders), explaining the upload_file workflow for local/external files, and noting the folder is created if new. This helps the agent understand the parameters beyond their schema 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 action: save a Hermoso render or any file to the user's connected OneDrive. It does not explicitly name sibling tools like save_to_drive, so it misses the top distinction point, but the verb+resource combination is 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?

Provides clear context: for local/external files, call upload_file first and pass the returned URL; for Hermoso renders, pass the render URL directly. It also notes the OneDrive connection prerequisite. It does not explicitly mention when not to use this tool versus save_to_drive or other OneDrive tools, but the guidance is strong.

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

TDQS

A4.7/5.0
Behavior5/5

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

The description adds rich behavioral detail beyond the existing annotations: it creates the collection if missing, persists to the workspace board, feeds the taste signal, and re-saving the same ad MOVES it into the named collection instead of duplicating. It also states 'Free', addressing cost. These disclosures are consistent with idempotentHint=true and destructiveHint=false, so 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.

Conciseness5/5

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

Four dense sentences, each earning its place: purpose, usage triggers, persistence/side effects, and de-dupe behavior are all covered. The description starts with the core action and front-loads the key information before the analogy and examples. 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 save tool with no output schema, the description is complete: it explains what is saved, where it goes, when to use it, side effects, idempotency behavior, and cost. The agent has enough to invoke it correctly without needing return-value details, which are unlikely to be important for this 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?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful cross-parameter semantics by explaining that de-duplication is keyed on the same key/link/media and that re-saving moves rather than duplicates, which clarifies how the key and media fields influence behavior. 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 opens with a specific verb and resource: 'Save one or more ads/creatives to a named SWIPEFILE collection'. It also clarifies the collection is created on the fly and identifies itself as the headless twin of the web app's heart button, which distinguishes it from other save_* siblings (e.g., save_creator, save_playbook) without requiring the agent to inspect schemas.

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 whenever research turns up something worth keeping', with concrete source examples like competitor ads from search_meta_ads / pull_competitor_ads, organic posts, or own renders. It does not explicitly say when not to use it or name alternatives like save_creator, but the ads/creatives scope makes the boundary clear.

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, bluesky, telegram — TEN channels, and every one of them is live. google_business is accepted by the schema too but is currently HELD BACK: Google allowlists that API per project and ours reads 0 QPM, so it is refused at enqueue rather than failing hours later). 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. INSTAGRAM takes collaborators — up to 3 usernames invited to CO-AUTHOR the post, which puts it on their profile too once they accept (the invite is sent when the post fires, and is pending until then). 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.
chatIdNoTELEGRAM — REQUIRED whenever telegram is a channel: WHICH chat, group or channel the bot posts to. A public channel’s @username (@hermosoai) or the numeric id (a group is negative; a supergroup or channel starts with -100). There is no default and there cannot be one — the Telegram Bot API publishes no method that lists a bot’s chats — so scheduling telegram without one is refused up front. list_telegram_chats finds ids for chats that have messaged the bot in the last 24 hours.
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). 280 characters per part without X Premium, up to 25,000 with it — nothing is truncated, and on a Premium account one long post is usually better AND cheaper than a thread. 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. ONE STRING describes the picture; on a CAROUSEL it describes EVERY slide. Pass an ARRAY of strings instead to describe each slide separately, aligned to the slide order — that is strictly better on a multi-slide post, because one sentence read out over six different pictures is wrong for five of them. More descriptions than pictures is refused rather than dropped. 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. CARRIED BY: X (max 1000, one per media), Pinterest (max 500 — PIN-LEVEL only, since its API has no per-item alt text, so slide 1’s description is used for the whole Pin and the result says the others were not sent), LinkedIn COMPANY PAGES (max 4086, one per slide), INSTAGRAM image posts and image slides (max 1000), FACEBOOK photos and albums, and BLUESKY, whose lexicon makes it REQUIRED on every image. The schedule is REFUSED if the LONGEST description exceeds the tightest of the channels on it, rather than truncated on the way out. NOT CARRIED, and none of these is a refusal — the post still publishes, just undescribed there, and the per-channel result says which: TikTok (its photo post has no alt field at any level), a THREADS CAROUSEL, an INSTAGRAM Reel or video slide, and a LinkedIn PERSONAL-profile post.
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.
accountsNoWHICH accounts of a multi-account channel to post to, e.g. { "tiktok": ["@a", "@b"] } or { "tiktok": "all" } — one row per account at fire time, each with its own result. Omit for channels with one account (several and none named is refused by name).
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.
topicTagNoTHREADS ONLY — one topic tag for the post, without the leading #.
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.
slideTextNoPINTEREST CAROUSEL ONLY — per-slide title / description / link, aligned to slide order. Every other platform takes ONE caption for the whole carousel.
topicTypeNoGOOGLE BUSINESS — the KIND of Post. STANDARD is the default; EVENT and OFFER both REQUIRE `event` (title + start date), and OFFER also takes `offer`.
trialReelNoINSTAGRAM TRIAL REEL — publish this Reel to NON-FOLLOWERS ONLY at first, so a hook can be tested on a cold audience without spending it on the people who already follow the brand; Instagram shows it to followers only if it graduates. MANUAL = the creator graduates it by hand in the Instagram app; SS_PERFORMANCE = Instagram graduates it automatically if it performs. REELS ONLY and INSTAGRAM ONLY: an image, a carousel, or a Facebook/Threads channel is REFUSED BY NAME rather than quietly published as an ordinary post — a trial that silently goes to every follower is the exact opposite of what was asked for, so Instagram must be one of the `channels` and the item must carry a video. Omit it for a normal Reel.
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.
aiGeneratedNoINSTAGRAM / FACEBOOK REEL — Meta’s is_ai_generated self-disclosure. OMIT IT and Hermoso decides from provenance: a Hermoso render is declared, media that came through upload_file or from an external URL (the user’s own photographs or footage) is NOT — a real photo must never carry Instagram’s “AI info” label. Pass true or false only to override: false strips the label from something Hermoso would otherwise declare, true declares a render the user uploaded themselves.
communityIdNoX — publish into an X COMMUNITY instead of the main timeline: the number in the community’s own URL (x.com/i/communities/<id>). The connected account must be a MEMBER of it; X answers a non-member and a non-existent id with the same refusal and does not separate them.
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.
quotePostIdNoTHREADS ONLY — the id of the Threads post this one quotes.
countryCodesNoTHREADS ONLY — two-letter country codes to limit who can see the post. Omit to show it everywhere.
optimizeCopyNoRECOMMENDED when one caption goes to several channels: fit the shared caption to each channel’s own rules at publish time wherever no per-channel caption was written — YouTube gets a keyword title, a structured multi-paragraph description and search tags; Instagram/TikTok hashtags; LinkedIn longer; X/Bluesky short; Pinterest keyword-rich. The angle and every claim stay the author’s; a channel with its own caption is left exactly as written. Off by default so nobody’s words are rewritten unasked.
privacyLevelNoTIKTOK — WHICH PRIVACY LEVEL the post goes out at, in TikTok’s own vocabulary. TikTok requires the USER to choose this from the levels their own account allows: call tiktok_creator_info, show them the real options, and pass back the one they picked — never a default and never a guess, which TikTok refuses at init. Omit it and the post falls back to the coarse `visibility` (private → SELF_ONLY, otherwise PUBLIC_TO_EVERYONE), which cannot express MUTUAL_FOLLOW_FRIENDS or FOLLOWER_OF_CREATOR at all. It must agree with the TikTok visibility (SELF_ONLY is the private one) and it is refused on a TikTok DRAFT, which carries no post info.
replyControlNoTHREADS ONLY — who may reply. Omit for Threads' own default (everyone).
xQuotePostIdNoX — the numeric id of an X post this one QUOTES: the last part of its URL. X renders that post inside yours and it stands alone on your own timeline, which is what makes a quote different from a reply. NAMED xQuotePostId, NOT quotePostId, because `quotePostId` on this same schedule belongs to THREADS — a schedule going to both channels would otherwise be silently ambiguous. Billed at X’s higher LINK rate, because X appends the quoted post’s t.co URL to yours.
collaboratorsNoINSTAGRAM — a COLLAB post: up to 3 Instagram usernames invited to CO-AUTHOR it, so it appears on their profile too once they accept, with both handles in the header and the engagement shared. Handles only ("hermosoai"); a leading @ is fine. Instagram must be one of the `channels` — asking for collaborators on a schedule Instagram is not on is REFUSED now rather than discovered when it fires, and the other channels in a mixed schedule simply publish without co-authors. THE INVITE IS SENT WHEN THE POST FIRES, not when you schedule it, and it is PENDING until the other account accepts in their notifications; check with instagram_collaborators afterwards rather than telling the user it is live on both profiles.
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.
linkAttachmentNoTHREADS ONLY — a full http(s) URL rendered as a link card. This is the ONLY way a Threads post carries a destination, and Threads attaches it to TEXT-ONLY posts (a post with media cannot also carry a card).
paidPartnershipNoX — label the post a PAID PARTNERSHIP, the same disclosure Hermoso already ships for TikTok. OPT-IN ONLY: set it when the post is sponsored, gifted or otherwise paid for, and never assume it on the user’s behalf.
coverTimestampMsNoTIKTOK VIDEO ONLY — which frame TikTok uses as the cover, in milliseconds from the start. Omit and TikTok uses the first frame.
crossreshareToIgNoTHREADS ONLY — when this fires, ALSO share it to the linked Instagram account as a STORY. Refused on a Threads carousel. No confirmation exists that the Story was created, so the result says it was requested.
commercialContentNoTIKTOK — the COMMERCIAL CONTENT DISCLOSURE toggle: true when the post promotes a brand, product or service at all. TikTok requires at least one of yourBrand / brandedContent alongside it, and a post declaring itself commercial without naming which kind is refused. Setting either disclosure already implies this, so it is only needed to be explicit.
visibilityByChannelNooverride visibility for one channel, e.g. { "tiktok": "draft" } to go live everywhere but stage TikTok for review
crossreshareDarkModeNoTHREADS ONLY — render that Instagram Story in dark mode. Needs crossreshareToIg.
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.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations are minimal (readOnlyHint=false, destructiveHint=false), so the description carries the full transparency burden and it does so thoroughly. It discloses the most important side effects: posts GO LIVE PUBLICLY by default, nothing is downgraded to draft/unlisted quietly, channels are attempted independently so one failure never blocks others, refusals happen at enqueue for missing account IDs rather than at publish time, and specific formats like the Pinterest title truncation change and unrecoverable empty YouTube description. These are significant behavioral traits that an agent can't infer from 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.

Conciseness4/5

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

Front-loaded with the core post sending action, multi-channel and scheduling behavior before diving into channel-specific detail. The ordering is logical: channels → channel-specific media/captions → per-channel settings → account identification requirements → visibility rules. The description is extremely long for a JSON string, and the global caps-strewn prose is harder to scan than bullet-style separators would be, but each sentence earns its place given the 55-parameter surface area.

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 55 parameters and no output schema, the description is thorough. It covers channel requirements, per-channel capabilities, rejection semantics, and the key differences among visibility levels. Gaps are minor: no explicit statement of what the return value looks like (though no output schema exists, a line about the per-channel results would be useful), no session/authentication note beyond 'the user picking a minute', and no explicit rate-limit guidance. Against the enormous parameter surface, the gaps are small.

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 schema already documents every parameter. The tool description adds substantial meaning beyond the schema: it explains the relationship between at and useQueue, the multi-slide carousel behavior of imageUrls, the 'caption becomes YouTube title, not description' semantic, the Pinterest/YouTube title fallback derivation, the default for missing pageId/linkedinOrganizationId/boardId/locationId (refused vs guessed), granular per-channel visibility behavior not visible in the schema enum, and when to use visibility vs visibilityByChannel. This is genuine added value rather than schema repetition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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: 'Queue a post to go out at a future time, to one or more connected channels at once...' This clearly distinguishes schedule_post from sibling tools like post_to_meta/post_to_x (immediate posting) and list_scheduled (reading scheduled posts). It also enumerates the ten live channels, which is precise and useful.

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?

Comprehensive usage guidance replaces any need for a separate 'when to use' section. The description explicitly contrasts 'schedule now' with not needing to be around, names the alternative to posting live immediately, and provides routing instructions for sub-cases (useQueue vs at, when to call list_pinterest_boards/list_linkedin_pages/list_meta_pages/list_business_locations, when to use post_to_x for immediate X posting). Fail-and-refuse behavior is stated as a guard against misuse.

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

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description's 'prediction' framing is fully consistent with that safety profile. The description adds useful behavioral context beyond annotations by revealing the analytical nature of the output — per-dimension scores and a single recommended fix — setting agent expectations that this is an analysis, not a mutation. 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 with zero filler. The main purpose and output breakdown are front-loaded in the first sentence, and the usage directive occupies the second. Every clause earns its place.

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

Completeness4/5

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

The tool has no output schema, so the description compensates by summarizing what is returned (score, dimension breakdown, strengths, fix). Combined with simple fully-documented params and annotations covering the safety profile, the agent has enough to invoke it correctly. Minor omissions — score scale, response format, or video processing latency — prevent a 5.

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

Parameters3/5

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

Schema coverage is 100%, so the schema fully documents url, kind, and intent. The description adds marginal linkage value by tying 'goal fit' to the intent parameter and 'image or video URL' to the kind enum, but it does not add format or syntax 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 states a specific verb-resource pair: 'Virality/performance prediction for a finished ad (image or video URL)' — clearly an evaluation tool, not a creation tool. It enumerates the exact output shape (overall score, per-dimension breakdown, strengths, biggest fix) and distinguishes itself from siblings like plan_ad, render_ad, make_template_ad, and check_ad_policy by scoping to 'finished' 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?

Provides explicit when-to-use guidance: 'Use BEFORE spending on distribution, or to rank variants.' This gives the agent a clear decision rule. It does not name alternative tools or give when-not-to-use exclusions, 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.

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

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this readOnlyHint=true and destructiveHint=false, but the description adds valuable behavioral context: it deliberately fetches the BASIC listing, sets get_ad_details=false, costs ~1 credit, and explicitly states that the 25-credit detailed variant is not exposed here. The return format is also summarized, 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?

Three dense, purposeful sentences with zero filler. The core scoping rule is front-loaded first, the alternative is named second, and the cost/return details are packed efficiently. 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?

Despite having no output schema, the description summarizes the return shape, cost behavior, and lookup modes. Combined with fully described parameters and safety annotations, an agent has everything needed to invoke this tool correctly without guessing.

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 all four parameters with useful descriptions. The description adds clarity that the tool targets ONE advertiser and that domain or advertiserId are the primary lookup keys, but this is reinforcing schema semantics rather than adding substantial new 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 states a specific verb and resource: a structured Google Ads Transparency pull for ONE advertiser, keyed by domain or advertiserId. It distinguishes itself from the sibling research_ads by explicitly contrasting targeted lookups with open-ended research, so an agent can tell them apart immediately.

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 an explicit when-to-use rule ('use when you know the brand') and names the alternative ('use research_ads for open-ended research'). It also discloses the cheap BASIC variant versus the expensive detailed variant, telling the agent exactly what behavior to expect and why this tool is the economical choice.

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 — our only IG keyword surface; profile/hashtag pulls go through fetch_social_data with a handle). Returns compact JSON {desc, author, handle, plays, likes, link, cover} per reel, ranked by plays. Spends about a credit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax reels returned (1–25, default 8)
queryYeskeyword to search reels for

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds further behavioral context: it returns reels ranked by plays, spends about a credit, and returns a compact JSON structure with specific fields. 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 compact but packs in the endpoint, scope, alternative routing, return shape, ranking behavior, and credit cost. Every clause provides actionable information, and the key differentiator 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 two-parameter read-only search tool with no output schema, the description is complete: it covers what the tool returns, how results are ordered, what it costs, and how it relates to sibling and alternative tools. Nothing necessary for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both query and limit. The description adds the useful detail that results are ranked by plays and the response shape, but it doesn't materially add to the parameter semantics themselves, 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 states a specific verb and resource: 'Organic Instagram REELS keyword search' with the exact endpoint. It also distinguishes itself from sibling tools by clarifying it is the only IG keyword surface and that profile/hashtag pulls go through fetch_social_data.

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 names the alternative path for profile/hashtag pulls, telling the agent exactly when to use this tool versus fetch_social_data. This is clear routing guidance that prevents misuse.

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 about a credit.

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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark it read-only and non-destructive, and the description adds meaningful context: it returns compact JSON with specific fields, notes that LinkedIn exposes real impression counts, and mentions the credit cost. This goes beyond the annotations and helps set expectations, though it stops short of detailing 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?

Three compact sentences deliver purpose, usage guidance, return shape, a differentiator, and cost. Every sentence earns its place and the key 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 no output schema, the description compensates by enumerating the returned JSON fields. It also covers the distinguishing impression data and credit cost, making it complete enough for an agent to invoke the tool correctly with just the schema and 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 description coverage is 100%, so the baseline is 3. The description reinforces the three search modes (company, keyword, companyId) and the impression-count highlight, but it does not significantly add param semantics beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 and resource: a structured LinkedIn Ad Library search by company name, keyword, or companyId. It also differentiates itself from the sibling tool research_ads by framing this as a targeted B2B pull rather than open-ended research.

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 versus the key alternative: use it for targeted B2B pull and research_ads for open-ended research. This gives an agent clear selection criteria without needing to inspect schemas.

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 a credit or two.

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

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable non-obvious behavioral context: the operation spends credits and returns a compact JSON object with specific fields. It could also mention rate limits or failure behavior, but it exceeds 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 short sentences, front-loaded with the core purpose, then usage guidance, return shape, alternative, and cost. Every sentence earns its place and no information is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 7 optional parameters with full schema documentation and no output schema, the description provides the key missing context: when to use it, what it returns, and that it costs credits. The only minor gap is not explicitly stating that at least one of query/companyName/pageId should be supplied, but the phrase 'use when you know exactly WHAT to fetch' strongly implies 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 the baseline is 3. The description adds useful grouping semantics by explaining the core choice between a keyword ('query') and one advertiser ('companyName / pageId'), which clarifies mutual exclusivity beyond the individual schema entries. It does not need to repeat the other field-level details already 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 names the specific resource ('Meta (Facebook/Instagram) Ad Library'), the exact verb ('pull'), and the two supported fetch modes: a keyword or one advertiser. It also explicitly distinguishes itself from research_ads, making the tool's 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?

It explicitly states when to use this tool ('when you know exactly WHAT to fetch') and when not to ('open-ended research that needs judgment across platforms'), and names the alternative (research_ads). This gives an agent unambiguous routing criteria.

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 about a credit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax posts returned (1–25, default 8)
queryYeswhat to search Reddit for

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark this as read-only and non-destructive. The description adds valuable behavioral context on top: it spends about a credit, returns compact JSON, and describes the exact per-post shape. It does not disclose rate limits or auth requirements, but the key cost and return behavior are covered.

Agents need to know what a tool does to the world before 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 tight sentences front-load the endpoint and use case, then deliver return format and cost without filler. Every element earns its place; the JSON return shape is specified compactly rather than in prose.

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 no output schema, the description compensates by describing the return object fields. It also covers the cost implication, which is important for an agent deciding whether to call the tool. It could add more detail on result ordering or ranking, but the essential operational information is present.

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 meaning by framing the query as a search for the customer's own words and objections, which goes beyond the schema's generic 'what to search Reddit for.' This helps the agent craft more effective queries.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 performs a Reddit keyword search and identifies the exact endpoint. It also explains the intended output—compact JSON with desc, subreddit, upvotes, comments, and link—and frames the use case around mining customer language, which helps distinguish it from other platform-specific search 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 clear context for when to use this tool: when you need the customer's own words, pain points, and objections for ad hooks and copy. It does not explicitly name alternatives or state when not to use it, but the intended use case is clear enough for an agent to route appropriately among sibling search tools.

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 about a credit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax posts returned (1–25, default 8)
queryYeskeyword to search Threads for

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it returns compact JSON with specific fields, and it spends about a credit. This informs the agent of cost and response shape without contradicting 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 sentences with no filler: it front-loads the purpose, then adds endpoint, use case, return format, and credit cost. Every clause earns its place and nothing needs to 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 simple 2-parameter read-only search tool, the description fully covers what the agent needs: endpoint, platform, use case, output fields, and cost. The annotations cover safety, and the schema covers parameters. 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%, with both query and limit described. The description reinforces that query is a keyword search but adds no new meaning beyond the schema. It does not explain limit bounds or default, but the schema already handles that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious 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 states a specific verb and resource ('Organic Threads keyword search'), names the exact endpoint, and clearly distinguishes it from sibling search tools by targeting Threads short-form posts for trend and voice research. The task is 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 gives clear context for when to use it: when researching trends or voice on Threads. It doesn't explicitly name alternatives like search_instagram or search_reddit or state exclusions, but the platform-specific framing makes the intended use sufficiently clear without requiring inference.

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 about a credit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax videos returned (1–25, default 8)
queryYeskeyword or hashtag (no # needed)

TDQS

A4.5/5.0
Behavior4/5

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

With no meaningful annotations provided, the description carries the disclosure burden. It reveals the output shape, sort order (ranked by plays), organic-only scope, and approximate credit cost. It does not cover rate limits or pagination, but the key behavioral traits needed to invoke it 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?

The description is two tight sentences with no filler. It front-loads the primary purpose, then covers the caveat, output shape, ranking, alternative tool, and cost. Every clause adds relevant 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 two-parameter search tool with no output schema or annotations, the description is complete: it tells the agent what to pass, what comes back, how results are ordered, what it costs, and which sibling handles a related but different use case. Nothing essential is missing for correct selection and 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 input schema already documents both parameters clearly: query is a keyword or hashtag with no # needed, and limit has a range and default. The description adds no parameter-specific meaning beyond this, and schema coverage is effectively complete, 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 names a specific action and resource ('Organic TikTok keyword search'), states the creative-mining use case, and disambiguates itself from ad research by explicitly noting there is no TikTok ad library. This distinguishes it from research_ads and other platform search 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?

It gives explicit context for when to use it: keyword-based TikTok search for hooks, trends, and remixable creative. It also points to research_ads for open-ended research, providing a clear alternative and helping an agent avoid using this tool for ad-library exploration.

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 about a credit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax videos returned (1–25, default 8)
queryYeskeyword to search videos for

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark it read-only and non-destructive, so the description adds valuable context the annotations do not: the endpoint, the exact compact JSON fields returned, ranking by views, and approximate credit cost. This exceeds what the structured 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 tight and front-loaded: first the core operation, then return shape, then ranking, then cost. Every sentence earns its place with no filler.

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

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 search tool with no output schema, the description is complete: it covers the purpose, the output structure, ordering, and resource cost. Nothing essential is missing for selecting or invoking 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%, so the schema fully documents the 'query' and 'limit' parameters. The description adds nothing about parameter behavior beyond the schema, which meets the baseline but does not exceed 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?

States a specific action ('keyword search') and resource (YouTube), plus the intended downstream use ('mine for hooks/angles/long-form structure'). This clearly differentiates it from sibling search tools targeting 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?

Clear context is given: use it for organic YouTube keyword research to find videos to mine. It does not explicitly name alternatives or state when not to use it, but the use case is specific enough that an agent can select it appropriately among the search_* siblings.

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

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, but the description adds substantial behavioral detail: the action is SERVER-SIDE and executes even with no app open, charges the card on file, requires a saved card, and gives specific guidance when no card exists. This goes far beyond structured annotation fields and matches the idempotentHint.

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

Conciseness4/5

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

The description is longer than average but every sentence carries meaningful information: purpose, permission, server-side behavior, card requirement, and member handling. It is front-loaded with the core action and does not contain 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 configuration tool with 3 params, no output schema, and no nested objects, the description is complete: it details prerequisites, permissions, execution behavior, and even what the tool tells the user when a card is missing. An agent has enough context to invoke it correctly and know what to expect.

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 three parameters with descriptions, including 'must match a credit pack size (see buy_credits)' and 'reload when the balance drops below this many credits'. The description reinforces the parameter semantics by explaining the threshold-to-charge behavior and top-up pack concept, adding value beyond 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?

Description states a specific verb and resource: 'Turn automatic credit reloads on or off' with '(admin only)' scope. It clearly distinguishes this from billing-related siblings by focusing on the auto-reload mechanism, and is not a tautology of the name.

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

Usage 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 the tool applies: requires admin role, requires a saved card, and after card setup agents can manage auto-reload. It explains members will receive an 'ask an admin' message, implying a when-not-to-use condition, though it doesn't explicitly name alternative tools like buy_credits for manual top-ups.

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

set_competitor_watchSet the competitor watchA
Idempotent
Inspect

Set (or STOP) this workspace's standing COMPETITOR WATCH — the weekly job that re-checks each named brand's ad libraries and reports what is NEW since last time. The same watch the web app's Ad Spy ▸ Watching tab manages, and the same one the weekly digest email is sent from (turn that email on/off with update_settings({watchEmail})). This REPLACES the whole watched list, it does not add to it — pass every brand you want watched, every time. Max 5 brands (the server trims past that). Pass an EMPTY list to stop the watch entirely, which also clears the findings. Give a domain wherever you know one: Google Ads Transparency is looked up BY DOMAIN and is skipped for a brand without one, and the domain is what resolves the right Meta page for a brand with an ambiguous name. The run itself spends credits against the ad libraries (roughly 3 per brand on Meta, 1 each on Google and LinkedIn) and is hard-capped per run server-side, so an oversized watch is trimmed rather than allowed to run away. Setting the list is free; only a run spends. runNow:true runs it once IMMEDIATELY (a background job — it spends now) and then keeps the weekly cadence; leave it off and the first check is a week out. The country and the platform mix are NOT settable here — a re-set inherits whatever the pending run already carried (US / Meta for a watch that has never been configured otherwise). Read the findings back with list_watch_findings.

ParametersJSON Schema
NameRequiredDescriptionDefault
runNowNotrue to run one check immediately (spends credits now) instead of waiting a week for the first one
competitorsYesthe brands to watch — the COMPLETE list, replacing whatever was set before. Empty array = stop watching.

TDQS

A4.1/5.0
Behavior1/5

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

The description is rich in behavioral detail: it reveals replacement semantics, server-side trimming, credit costs, runNow behavior, and that an empty list stops the watch. However, it also states that stopping the watch 'clears the findings', which directly contradicts the annotation destructiveHint=false. Per the scoring rule, a contradiction with annotations forces a score of 1 and flags an 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.

Conciseness4/5

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

The description is front-loaded with the main purpose and organized into logical behavioral chunks, with very little filler. It loses a point for minor redundancy: the max-5 brand limit and server-side trimming are stated twice in slightly different ways.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 two parameters and no output schema, the description covers every relevant operational area: set semantics, stop semantics, list replacement, domain importance, credit costs, immediate runs, unsupported settings, and how to read findings back. Nothing an agent needs to call it correctly is missing.

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

Parameters5/5

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

Even though the schema already documents competitors and runNow with 100% coverage, the description adds substantial operational meaning: domain lookup behavior for Google and Meta, the max-5 brand trim, the distinction between free setting and credit-spending runs, and the inheritance of country/platform settings. This goes well beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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: 'Set (or STOP) this workspace's standing COMPETITOR WATCH'. It defines the tool as managing a weekly job and explicitly differentiates it from related tools by pointing to list_watch_findings for reading results and update_settings for toggling the digest email.

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 explains when to use this tool: to set or stop the standing watch, to replace the watched list, and to trigger an immediate run with runNow. It also gives explicit exclusions ('The country and the platform mix are NOT settable here') and names the correct sibling tools for associated actions, so an agent knows how to route around 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: tiktok, x, youtube, threads, bluesky, telegram, reddit, pinterest, instagram, meta, google_ads, linkedin, pinterest_ads, linkedin_ads, reddit_ads, apple_ads, microsoft_ads, google_business, google_analytics, snapchat_ads, x_ads, tiktok_ads, google_tag_manager, google_search_console, bing_webmaster. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYeswhich connector to scope
accountIdsYesthe ids (from list_connector_accounts) this brand may use — an empty array shares nothing

TDQS

A3.7/5.0
Behavior1/5

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

The description is behaviorally rich: it discloses replacement semantics, fail-closed behavior, server-side id verification, and the public risk of posting as the wrong Page. However, it directly contradicts the annotation destructiveHint=false by stating that the tool REPLACES the current selection and un-shares any omitted accounts. Because the annotation marks the operation as non-destructive while the description explicitly describes an overwriting/un-sharing side effect, this is an 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.

Conciseness4/5

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

The core purpose and critical warning are clearly front-loaded, and each major behavioral point earns its place. However, the provider enum is duplicated verbatim from the input schema, and the trailing 'Free.' adds no decision-making value, so it is not maximally concise.

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

Completeness4/5

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

For a two-parameter configuration tool with no output schema, the description is nearly complete: it covers required inputs, replacement side effects, empty-list behavior, server validation, failure semantics, and user confirmation. The only minor gap is that it never describes what the API returns on success or failure, though that is less critical for a setter 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%, so the baseline is 3. The description adds meaningful context by explaining what the ids represent (Facebook Pages, Instagram accounts, Google Ads customers, etc.), framing them as 'allowed to post to and spend from,' and reiterating the empty-array-means-share-nothing behavior. This goes modestly 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 ('Set') and resource ('which of a connector's accounts this brand is allowed to post to and spend from'), and distinguishes the operation from read-only siblings like list_connector_accounts by naming it as the id source. It also makes the brand-scoping 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 Guidelines4/5

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

The description gives a clear prerequisite and workflow: pass ids from list_connector_accounts, ask the user which accounts they mean, and understand that an empty list shares nothing. It does not explicitly compare against alternative setter tools, but the usage context is specific enough to route an agent correctly.

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
chatIdNoTELEGRAM — which chat, group or channel posts go to (@username or numeric id). Without one, telegram is skipped: there is no default chat and posting to the wrong one is a public mistake.
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.

TDQS

A4/5.0
Behavior1/5

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

Annotation contradiction: the description states that enabled:false removes the recurring job outright, which is a destructive side effect, while annotations set destructiveHint to false. Even though the description otherwise discloses dryRun defaults, spending behavior, and queued-post handling, the direct conflict requires a score of 1.

Agents need to know what a tool does to the world before 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 justified for a 13-parameter configuration tool. It front-loads the most important constraints (pass only what changes, enabled:false is the pause) and every sentence contributes operational information without padding.

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?

It covers the critical invocation context: pause semantics, dryRun prerequisite, cadence source, spending controls, and references to run_post_refill and cancel_scheduled. It is slightly incomplete on what a successful response looks like and what an empty call with zero parameters does, but those are minor given the rich schema and partial-update guidance.

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?

Because schema description coverage is 100%, the schema already documents all 13 parameters. The description still adds value by explaining relationships between parameters: why raising maxImagesPerDay, maxVideosPerDay, or maxCreditsPerDay enables spending, how postsPerDay caps below posting times, and that maxCreditsPerDay binds independently.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter 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 sentence states a clear verb and resource: turn the automatic posting refill on or off and set its behavior. It also differentiates this tool from siblings like run_post_refill and cancel_scheduled, so an agent can identify which operation this tool performs.

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 rules: pass only changed fields, keep dryRun true until a human has reviewed output from run_post_refill, use cancel_scheduled if queued posts must be removed, and recognize that cadence comes from the brand's posting times rather than a number here. This goes well beyond vague applicability.

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 and SAVE it as this brand's default product, so every later plan_ad / render_ad / generate_image grounds on the true packaging without being told again. 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 or saved (the summary says why). On PASS it persists the photo to a DURABLE url, writes it to the brand's product library as the DEFAULT, and READS THE BRAND BACK to confirm — savedToBrand and the summary report what the brand ACTUALLY holds now, never what was asked for, so if it did not become the default you are told instead of finding out from a paid render. 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"

TDQS

A4.6/5.0
Behavior5/5

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

The description goes far beyond the annotations, disclosing that the server downloads the image, runs product and safety checks, rejects unsuitable images with nothing locked or saved, persists to a durable URL, reads the brand back to confirm, and reports actual state rather than requested state. It also mentions billing one vision check and active-brand switching 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 long but dense and front-loaded with the core purpose. Every sentence carries relevant behavioral or usage information, from rejection conditions to confirmation behavior and billing. It is not minimalist, but the length is justified by the tool's complexity and the absence of an output schema.

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

Completeness5/5

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

With no output schema, the description adequately explains what the caller can expect: savedToBrand and a summary that reflect the actual brand state, explicit failure behavior, persistence, and the confirmation read-back. Given the tool's side effects and integration with other ad tools, this is complete enough for an agent to invoke and interpret the result 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 detail: imageUrl is expanded to include research results, organic post images, workspace/list_product_photos URLs, and public product photos; brandId is explained as targeting a brand and switching the active brand. source_note is not given extra meaning, but two of three parameters are enriched.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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: 'Lock an image as the ad's real PRODUCT photo and SAVE it as this brand's default product.' It clearly differentiates from sibling tools like list_product_photos and use_brand by explaining that this tool sets the persistent default product photo used by later ad-generation 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 clear context for when to use the tool: before plan_ad/render_ad/generate_image to establish the true product packaging, and it explains how brandId targets a specific brand, even noting it switches the active brand 'like use_brand.' It does not explicitly state when not to use it or name direct alternatives, but the usage context is strong.

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

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

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses that this is a privilege change and requires user confirmation before calling, including the confirm:true flag. This adds meaningful behavioral context beyond the annotations, which already mark the tool as non-read-only but not destructive.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core action and role definitions, and every clause adds meaningful guidance. 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 three-parameter tool with a complete schema and relevant annotations, the description covers the essential workflow, role semantics, and confirmation requirement. Nothing needed for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by explaining what admin versus member means and by clarifying that confirm must be true after user confirmation, which goes beyond the bare 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 uses a specific verb ('Change') and resource ('workspace member's role'), and clarifies the exact role values with their access implications. This clearly distinguishes set_role from related sibling tools like invite_member and remove_member.

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

Usage Guidelines4/5

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

The description makes the use case clear: adjusting a workspace member's privileges, not adding or removing members. It does not explicitly name alternatives or state 'use this instead of X', but the context is unambiguous enough for an agent to select this tool correctly.

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 clip of the chosen model. A multi-beat ad that FITS one clip renders better and cheaper as ONE single-pass generate_video/render_ad (a single generation carries the whole hook→demo→payoff arc) — never stitch those. What fits is the model’s own maximum from hermoso_capabilities, not a fixed number: 15s on most models, 30s on the longest-clip one, so a 30s spot need not be stitched at all if you name that model. 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
resolutionNo1080p (default), or 480p/720p for a cheaper draft
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)

TDQS

A4.6/5.0
Behavior4/5

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

Since all annotations are false and provide no useful safety profile, the description carries the burden and does disclose two key operational traits: it blocks until done and it spends credits. It also implies cost trade-offs by noting single-pass rendering is cheaper for fitting spots. It stops short of describing the return value or failure behavior, but the disclosed traits are genuinely useful.

Agents need to know what a tool does to the world before 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, usage boundary, alternative, model-specific threshold, and operational behavior. It front-loads the core purpose and uses clear emphasis (ONLY, NEVER) to guide decision-making without 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 complex stitching tool with 7 parameters and no output schema, the description covers the essential decision boundary, alternatives, blocking behavior, cost, and model-specific max durations. It omits explicit return-value/output-location details and doesn't describe failure behavior, but the schema covers parameters and the description provides enough 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 description coverage is 100%, so the baseline is 3, and the schema already documents all parameters. The description adds valuable interpretive context for the model parameter by explaining the maximum clip length varies by model and must be looked up in hermoso_capabilities, and clarifies when durationSeconds may require stitching.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 (multi-scene stitched video) with an explicit minimum of 2 scenes, making the tool's core function unambiguous. It also distinguishes itself from generate_video/render_ad by explaining that this tool is for longer-than-one-clip spots.

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: only for spots longer than one clip of the chosen model, and tells the agent to never stitch ads that fit in one clip. It names the alternatives (generate_video/render_ad) and directs the agent to hermoso_capabilities for the model-specific threshold.

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. Read-only, free. Allowed keys: heist.memory.v1, heist.skills.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 / 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)

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context: read-only, free, scoped to the workspace, and acting as a raw key-based accessor rather than a typed interface.

Agents need to know what a tool does to the world before 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 front-loaded with the core operation and purpose, then gives the allowed keys, then ends with routing guidance. No sentences are wasted, and the structure makes the key information 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 read-only, two-parameter tool with a full input schema, the description is complete: it covers purpose, scope, allowed values, alternatives, and safety. The default limit is already documented in the schema, so its absence from the description is not a gap.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds significant meaning by listing the exact allowed key values, which the schema only vaguely describes as 'one of the allowlisted keys'. This helps an agent choose a valid key without external knowledge.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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 one of this workspace's data stores by key' and lists what kind of data the stores hold. It also distinguishes itself from sibling typed tools like list_memory and get_brand, so an agent can tell them apart without opening schemas.

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

Usage Guidelines5/5

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

The description explicitly names the friendlier typed tools (list_memory / list_skills / get_brand) and says to use store_get for the rest. It also enumerates the allowed keys, giving concrete guidance on when and how to invoke the tool.

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

subscribe_linkedin_leadsTurn on real-time LinkedIn lead deliveryA
Idempotent
Inspect

Have LinkedIn push every new lead to Hermoso the moment it is submitted, and optionally relay each event on to the user’s own CRM. THE WEBHOOK LINKEDIN VALIDATES IS ALWAYS HERMOSO’S OWN: LinkedIn challenges it with our app secret (and re-challenges every ~2 hours), which no CRM, Zapier or Make endpoint can answer — so never promise a customer URL as the LinkedIn webhook. Pass forwardTo (public HTTPS) to have Hermoso relay each lead event there; leave it off to keep events in Hermoso only (list_linkedin_lead_events). The reply is read back from LinkedIn, not from the 201. Leads stay readable with list_linkedin_leads either way. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdNothe company Page that owns the form — from list_linkedin_pages; omit when one Page is shared
leadTypeNodefaults by owner: SPONSORED for an ad account, COMPANY for a Page
forwardToNooptional public HTTPS URL Hermoso relays each lead event to (a CRM, Zapier, Make)
adAccountIdNoread forms owned by an AD ACCOUNT instead of a Page

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, the description discloses critical behavior: LinkedIn validates Hermoso's own webhook with the app secret and re-challenges every ~2 hours, the reply is read back from LinkedIn rather than relying on the 201, and leads remain readable afterward. This provides operational understanding that annotations alone could 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.

Conciseness4/5

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

The description is dense and each sentence adds necessary context, with the core purpose front-loaded. The all-caps warning, while important, interrupts flow, and the trailing 'Free.' is minor filler. Overall 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.

Completeness4/5

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

For a subscription tool with no output schema, the description covers the essential operational contract: what causes a push, where the webhook points, the optional relay, and how to access the resulting events/leads. It does not mention how to list or cancel existing subscriptions, but those are covered by sibling tools, so the gap is minor.

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 four parameters are already described in the schema (100% coverage), so the baseline is 3. The description adds extra semantic value for forwardTo, explaining the relay-vs-local behavior and why the webhook cannot be a customer URL. It does not elaborate on pageId, leadType, or adAccountId, but the schema 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 a specific verb+resource: 'Have LinkedIn push every new lead to Hermoso the moment it is submitted.' It also differentiates this subscription action from the sibling listing tools, noting that events remain readable via list_linkedin_lead_events and leads via list_linkedin_leads. This makes the tool's purpose unambiguous and easy to distinguish 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 Guidelines4/5

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

The description gives explicit conditional guidance: use forwardTo to relay events to the user's CRM, or omit it to keep events only in Hermoso. It also provides a strong 'never' instruction about promising a customer URL as the LinkedIn webhook. It does not explicitly contrast with deletion or subscription-listing siblings, but the context for when to use this tool is clear.

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

tidy_memoryTidy the Memory listA
DestructiveIdempotent
Inspect

Clean up and consolidate the workspace Memory: drops entries that are about how Hermoso, a tool, a connector or a platform API behaves (product behaviour, not the brand), drops phone numbers and emails, and merges near-duplicate facts into one sentence each. Call with no argument to get the PROPOSAL (what would be removed and merged, with reasons) — nothing changes. Call again with confirm:true to apply it through the same typed writers the app uses (deletes carry tombstones so they stay deleted on every device). One small model call; a few credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNotrue to APPLY the proposal; omit to only see it

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint and idempotentHint annotations, the description discloses the proposal/apply safety model, tombstone deletions that persist across devices, the use of the same typed writers, and the model-call cost. This is rich behavioral context with no contradiction against 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 dense sentences, front-loaded with the core purpose and followed by the invocation pattern, safety guarantees, and cost. Every clause adds necessary information; 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 single-parameter destructive tool with no output schema, the description explains what the proposal contains, what applying means, and the side-effect guarantees. An agent has everything needed to invoke it safely and predict the outcome.

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 confirm with a short description, so the baseline is met. The description adds meaningful procedural semantics: omitting confirm produces a proposal, while confirm:true applies the changes, which is helpful for 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 names a specific action ('Clean up and consolidate the workspace Memory') and the resource, with explicit criteria: dropping product-behavior entries, phone numbers, emails, and merging near-duplicates. This clearly distinguishes it from related memory tools like list_memory, remember, and forget.

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 prescribes a two-step workflow: call with no argument to get a proposal, then call again with confirm:true to apply it. It clearly states that nothing changes in proposal mode, though it does not name alternative tools or exclusion conditions.

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

TDQS

A4.4/5.0
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 valuable behavioral context: it explains partial-update semantics, guarantees no overwriting of unspecified fields, and calls out the read-modify-write nature of the operation. This is meaningful beyond the annotations, though it doesn't discuss side effects like validation or response 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?

Three tightly written sentences. The field list is front-loaded, the targeting examples are concrete, and the alternative tool and usage constraint are placed last. 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?

For a 10-parameter, 0-required mutation tool with no output schema, the description covers the critical operational points: what it patches, what it avoids overwriting, when to use it, and how to pass parameters. Missing return-value details are minor for this tool's selection and invocation.

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

Parameters3/5

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

Schema coverage is 60%, leaving name, audience, category, and positioning undocumented in the schema. The description lists all ten field names but adds only marginal semantics, mostly through the examples and the 'only pass changed fields' guidance. It does not compensate for the undocumented parameters with deeper 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?

Description states a specific verb ('Patch'), a clear resource ('workspace brand profile'), and enumerates the exact fields it affects. It also disambiguates from draft_brand by saying it is for onboarding from scratch, making the tool's 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?

Provides concrete usage examples ('change our voice to playful', 'we sell to dentists now'), explicitly names the alternative tool (draft_brand) and when to use it, and instructs the caller to pass only the fields being changed. This gives clear, actionable selection and invocation guidance.

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

TDQS

A5/5.0
Behavior5/5

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

Even though destructiveHint and readOnlyHint are already in annotations, the description adds critical behavioral detail: zero matches are reported as a failure, whole-body rewrite requires a confirm/confirmCells dance, and the tool is deliberately index-free to avoid deleting the wrong sentence. These disclosures go beyond annotations and do 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?

The text is long but information-dense; every sentence carries a distinct operational fact such as failure reporting, confirmation workflow, or index-free rationale. The two operation shapes are front-loaded, and the paragraph remains scannable 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, two-mode editing tool with no output schema, the description covers prerequisites, the confirmation workflow, failure reporting, and the offset-avoidance constraint. There is no critical missing context 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.

Parameters5/5

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

With 83% schema description coverage, the schema already documents most parameters, and the description adds operational meaning: matchCase:false ignores case, replacements are find/replace pairs applied in order, confirmCells echoes the unconfirmed character count, and rewrite:"" empties the doc. This reframes raw schema fields into practical invocation 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 names the specific operation 'EDIT a Google Doc', immediately distinguishes it from append_to_doc's grow-only limitation, and enumerates the two actual behaviors: replacements and whole-body rewrite. This makes purpose and scope unambiguous and clearly separates it 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?

It explicitly states when to use the tool (to make corrections append_to_doc cannot), instructs calling read_doc first and matching text EXACTLY, and prescribes a two-step confirm flow for rewrites. It also warns against using character offsets, giving concrete guidance on what not to do.

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)

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the bar is lowered; the description adds value beyond them by revealing a non-obvious behavior: moveToFolderId alone does not remove the file from its old parent — removeFromFolderId is required to move OUT of it. It also discloses that trash is reversible via trash:false. 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 with zero waste: operations are front-loaded, then parameter provenance, then sibling routing. Every sentence earns its place and nothing repeats the title or annotation content.

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

Completeness4/5

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

Covers operation semantics, parameter combinations, data provenance, and the correct alternative for permanent deletion — everything needed to invoke correctly. The only gap is the unspecified success/error response format, which is a minor omission for a mutation tool with no output schema.

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 inter-parameter semantics the schema lacks: it maps each parameter to an operation and explains how moveToFolderId and removeFromFolderId combine to form a move. It also provides provenance for fileId ('from list_drive_files'), which the schema does not.

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

Purpose5/5

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

States a specific verb and resource — 'Update a Drive file' — then enumerates the exact operations mapped to their parameters: rename (name), move (moveToFolderId/removeFromFolderId), and trash/untrash (trash:true|false). It explicitly defers permanent deletion to delete_drive_file, distinguishing itself from the closest sibling without requiring schema inspection.

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 vs alternative guidance: rename/move/trash belong here, while 'To delete permanently, use delete_drive_file' names the sibling and the condition that selects it. 'Pass fileId (from list_drive_files)' also tells the agent where to source the required parameter, so no inference is left to the agent.

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

update_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)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so the safety profile is covered. The description adds value by scoping the exact operations (rename/move) and explicitly carving out deletion as out-of-scope. It stops short of disclosing error behavior, conflict handling, or return values, but the annotation coverage lowers the bar and the added scope is genuinely useful.

Agents need to know what a tool does to the world before 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 with zero filler: purpose is front-loaded, parameter mapping follows, and the sibling routing closes it out. 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 3-parameter mutation tool with a rich annotation set, the description is nearly sufficient: it covers purpose, parameter sourcing, and alternative routing. The remaining gap is the absence of return-value disclosure given there is no output schema, plus a minor ambiguity about what happens when only fileId is passed. These are minor 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%: 'new name', 'the OneDrive item id', and 'folder id to move the item into' already document all three parameters. The description's param references ('rename (name)', 'moveToFolderId', 'fileId (from list_onedrive_files)') mostly restate the schema, adding only the 'and/or' combinability nuance. This matches the baseline 3 for high schema coverage.

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

Purpose5/5

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

The description states a specific verb+resource+scope: 'Update a OneDrive item: rename (name) and/or move it into a folder (moveToFolderId).' This precisely distinguishes the tool from siblings like delete_onedrive_file and convert_onedrive_file, and the title reinforces the rename/move scope.

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 ('rename and/or move'), tells the agent where to source the required ID ('Pass fileId (from list_onedrive_files)'), and provides an explicit when-not with a named alternative ('To remove an item, use delete_onedrive_file'). This fully routes an agent without requiring it to inspect other tools.

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

update_saved_creatorUpdate a saved creator (outreach status, note)A
Idempotent
Inspect

Set the OUTREACH STATUS and/or a NOTE on a creator already saved in the swipefile (find_creators → save_to_swipefile, or the ♥ on a creator card). Status is one of new | contacted | replied | booked | passed. The note is free text (deal terms, rate, what was sent). Reads back the updated row. Use list_swipefile to find the key. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesthe saved row's key from list_swipefile, e.g. tiktok:handle
noteNoreplaces the existing note; pass "" to clear it
statusNo

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already mark the operation idempotent and non-destructive, and the description consistently describes a mutation. It adds behavioral context beyond the annotations: it reads back the updated row, it operates only on already-saved creators, and it is free. No contradiction exists between description 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 compact and front-loaded with the core action, followed by necessary workflow and parameter context. It is slightly redundant with the schema's enum list, but each sentence still adds practical information such as key discovery, note semantics, and the read-back 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 simple tool shape, the description covers what an agent needs: how to identify the creator, what statuses are valid, what the note should contain, how to clear the note, and what the tool returns. The absent output schema is compensated by the explicit 'reads back the updated row' disclosure.

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%, and the description adds useful semantic context beyond the schema: it explains the note is for deal terms, rate, and what was sent, and it clarifies the status values as outreach stages. The key's origin from list_swipefile is also reinforced. This goes beyond simply restating 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 a specific verb ('Set') and resource ('creator already saved in the swipefile') with an explicit pipeline context (find_creators → save_to_swipefile, or the ♥ on a creator card). It clearly distinguishes this update tool from creation tools like save_to_swipefile by emphasizing the creator must already be saved.

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 this tool is appropriate (after a creator is already in the swipefile) and explicitly tells the agent to use list_swipefile to find the required key. It does not explicitly name exclusions or alternatives, but the workflow guidance is strong enough for correct routing.

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

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and idempotentHint=true, and the description does not contradict them. It adds valuable behavioral context: the language setting persists to every future ad/script/plan/answer and also applies to MCP renders, and changes 'take effect on the next call.' These details go beyond the structured annotations and clarify the operation's persistence and timing.

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 two-liner but every sentence earns its place by explaining parameter behavior, scope, and side effects. It is front-loaded with the core purpose and then systematically walks through each setting. It could be tightened slightly by removing minor redundancy (e.g., the language example list), but overall it remains efficient and well-ordered.

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 update tool with three optional parameters and no output schema, the description covers the necessary ground: what each parameter does, the account-wide scope, the 'only pass what you are changing' pattern, and timing. It does not spell out the return value, but no output schema exists and the behavior is straightforward. The annotations provide the safety profile, 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?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema: for language it specifies that it applies to EVERY ad, script, plan and answer, gives plain-English formatting examples, and notes MCP render applicability; for theme it reiterates 'dark' or 'light'. This is substantial enrichment, especially for the language parameter, though watchEmail adds little beyond the existing 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 opens with the specific verb-resource pair 'Change this account's app settings', immediately distinguishing it from brand-level or content tools. It then enumerates the three settings it changes with precise meanings. The 'Account-wide (every brand)' phrase also differentiates it from sibling tools like update_brand, leaving no ambiguity about the target 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?

The description gives clear scope ('Account-wide (every brand)') and instructs 'Only pass what you are changing', which tells the agent when and how to invoke it. It stops short of explicitly naming alternatives, such as 'use update_brand for brand-specific settings,' so there is no direct when-not-to-use statement, but the account-wide qualifier strongly implies the boundary.

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

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses the destructive overwrite behavior and the guarded confirmation flow: writing over filled cells is refused until the agent shows the count and calls again with confirm:true. It also reveals that the result is read back from the sheet, extending the annotations with operationally important detail.

Agents need to know what a tool does to the world before 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 earns its place: purpose, alternative comparison, input format, safety flow, and read-back guarantee are presented in a logical order. The rhetorical explanation of append_to_sheet's limitation directly supports tool selection rather than padding.

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?

It thoroughly covers purpose, alternatives, confirmation safety, and result verification, and it compensates for the missing output schema by explaining that values are read back from the sheet. The remaining gaps are the exact return shape and the sheetUrl/spreadsheetId target identifiers, which are conventional and partially covered by the schema.

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 most parameters, and the description adds concrete examples for range formats, anchor-cell expansion, and row-array shape. However, it does not add detail for updates, sheetUrl, or spreadsheetId, so it slightly misses full semantic 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 opens with a specific verb and object ('CORRECT cells in a Google Sheet') and immediately defines the action as writing to an exact range and overwriting whatever is there. It explicitly contrasts itself with append_to_sheet, making its role unambiguous within a large sibling list.

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 this is the fix append_to_sheet cannot make and explains why appending is insufficient for corrections. It also points to list_sheet_tabs for getting tab names, giving the agent concrete routing guidance.

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

upgrade_planUpgrade planAInspect

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)

TDQS

A4.7/5.0
Behavior5/5

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

Despite having annotations, the description adds major behavioral context: Stripe payment is deferred to the human, 'agents never spend money directly', and 'Nothing is charged until your human pays.' It also discloses the different outcomes for new subscribers, existing paid accounts, downgrades, and members, going well beyond the annotation flags.

Agents need to know what a tool does to the world before 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 not bloated: every sentence conveys a distinct decision point or safety constraint. It front-loads the core action and admin restriction, then flows through usage, exceptions, and financial safety.

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

Completeness5/5

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

No output schema exists, so the description has to cover return/outcome behavior. It covers the list output format, the Stripe Checkout URL for new subscribers, the human-action instructions for existing paid plans/downgrades, and the member message. Nothing needed to invoke the tool safely is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains `plan` and `period` fully. The description reinforces the no-argument listing behavior and the plan-id usage, but does not add substantive new meaning beyond the structured schema; it also omits the period parameter's optional yearly logic, which is already in the schema. Baseline 3 is appropriate because the schema carries the parameter documentation 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 first sentence states the exact operation: 'Change this account's SUBSCRIPTION plan (admin only).' It also declares the dual no-argument/list and plan-id/change modes, making the resource and scope unmistakable. This clearly separates it from sibling tools like billing_status or buy_credits.

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 instructions: call without arguments to list plans, then call with `plan` set. It also provides exclusions and alternatives: existing paid plans or downgrades are done by a person in the app, and members should ask an admin.

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, video, audio, PDF or document, 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_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 — passing two is an error, never a silent preference: url (ANY public http(s) link — Hermoso fetches it server-side, so nothing crosses this connection and there is no practical size limit; THIS IS THE ONE THAT ALWAYS WORKS, including on the hosted connector), path (a local file — ONLY when Hermoso runs on the user's own machine over stdio/CLI; the hosted connector cannot see their disk), or dataUri (a base64 data: URI — keep it under ~15MB, since the bytes travel over this connection). 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. (Calling the underlying HTTP route directly? POST /api/upload takes the file's RAW BYTES as the request body with its own content-type — NOT multipart/form-data — or ?url= with no body.) Returns {url, kind, bytes}.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoa PUBLIC http(s) URL Hermoso fetches server-side (private/internal addresses are refused, and every redirect hop is re-checked). Works on every surface including the hosted connector, and the bytes never cross this connection — prefer this whenever the file is reachable on the web.
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,<…>) — bytes travel over this connection, so keep it small

TDQS

A4.9/5.0
Behavior5/5

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

The description goes well beyond the annotations: it warns that passing two sources is an error, explains size limits for each source type, notes that the hosted connector cannot see local paths, discloses the HTTP-route behavior, and specifies the return shape {url, kind, bytes}. No contradiction with the 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 every section earns its place: compatibility list, source selection, size limits, edge cases, and the underlying HTTP route. It is front-loaded with the core purpose before diving into details. The only minor deduction is that the sibling-name enumeration could have been trimmed, though it does add specificity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 no output schema, the description still explains the return value with its fields. It covers all three input modes, constraints, failure conditions, integration scope, and even the raw HTTP route. For a central upload tool with this complexity, nothing an agent needs to invoke it correctly is missing.

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

Parameters5/5

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

Although the schema already provides 100% coverage, the description adds substantial meaning beyond each parameter description: exactly one source must be supplied, url is the always-works option, path is stdio/CLI-only, and dataUri should stay under ~15MB. This level of guidance is absent from the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships 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: persist an arbitrary user file into Hermoso and return a durable public URL. It clearly distinguishes this from create/render tools by branding it as the 'BRING-YOUR-OWN-CREATIVE PATH' and listing exactly which publish/schedule/ad-build tools accept its output, so an agent can tell it apart from 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 explicitly says when to use this tool (files unrelated to a Hermoso render, LinkedIn/Pinterest/YouTube-thumbnail/Google-Ads assets that need re-hosted bytes) and when not to (Meta, Reddit, ChatGPT-Ads can take public URLs directly). It also gives a tie-breaker: 'When in doubt, use this' — concrete, decision-ready guidance.

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

TDQS

A4.2/5.0
Behavior4/5

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

The description goes beyond the sparse annotations by disclosing that this is a paid render operation and that it returns a served URL. This is meaningful behavioral context for an agent deciding whether to invoke a costly operation, though it does not mention potential latency or failure modes.

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

Conciseness5/5

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

A single sentence with no filler. It front-loads the action and resolution, then adds the two most decision-relevant facts: cost and return value. Every word 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 one-parameter tool with no output schema, the description adequately covers what the tool does, the cost implication, and the return format. It could mention input constraints or processing expectations, but the description is sufficient for correct invocation in most cases.

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, 'video', as 'the source video URL' (100% coverage). The description adds the 2x upscale context but no additional parameter-level guidance, 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 states a clear, specific operation: upscale a video to 2x resolution for final delivery. This distinguishes it from sibling video tools like clip_video, dub_video, or edit_video without 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 phrase 'for final delivery' provides clear contextual guidance on when this tool is appropriate, and 'Paid render' signals a cost consideration. It does not explicitly name alternatives or exclusions, but the intended pipeline position is clear.

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

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already mark it as non-read-only, idempotent, and non-destructive. The description adds valuable behavioral detail: the selection persists for the API key until changed, applies to every surface including the hosted connector, requires no environment variables or restart, and verifies real membership before pinning a shared workspace.

Agents need to know what a tool does to the world before 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 dense sentences with no filler: core action, input requirements, shared-account nuance, and persistence behavior each earn their place. It is front-loaded with the primary purpose and avoids 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 single-parameter stateful switch, the description covers input selection, shared-workspace authorization, persistence, and surface coverage. It does not describe the return value, but no output schema exists and the result is largely inferable from the membership verification and pinning semantics.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents that brand can be an id, exact name, or shared-workspace profile id. The description reinforces these formats and adds the 'exact name from list_brands' rule, but it does not materially expand on the schema's parameter 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 opens with 'Pin which brand this connection acts on (multi-brand accounts)', giving a specific verb, resource, and scope. It clearly distinguishes use_brand from sibling tools like list_brands, create_brand, update_brand, and delete_brand by framing it as the action of selecting/activating an existing brand for the connection.

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 invocation context: multi-brand accounts, passing a brand id or exact name from list_brands, and handling shared workspaces. It does not explicitly name alternatives or state when not to use the tool, but the context is unambiguous and practical.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool update
    • Addedupdate_saved_creator
  2. 168 tool updates
    • First observedanalyze_video
    • First observedappend_to_doc
    • First observedappend_to_sheet
    • First observedbackfill_posts
    • First observedbilling_status
    • First observedbuy_credits
    • First observedcall_tool
    • First observedcancel_scheduled
    • First observedchange_voice
    • First observedcheck_ad_policy
    • First observedclear_sheet_range
    • First observedclip_video
    • First observedcollect_post_metrics
    • First observedcompetitor_teardown
    • First observedconvert_onedrive_file
    • First observedcreate_brand
    • First observedcreate_doc
    • First observedcreate_drive_folder
    • First observedcreate_onedrive_folder
    • First observedcreate_sheet
    • First observeddelete_brand
    • First observeddelete_creator
    • First observeddelete_drive_file
    • First observeddelete_linkedin_lead_subscription
    • First observeddelete_onedrive_file
    • First observeddelete_playbook
    • First observeddelete_skill
    • First observeddiagnose_posts
    • First observeddisconnect_connector
    • First observeddraft_brand
    • First observeddub_video
    • First observedduplicate_scheduled
    • First observededit_video
    • First observedenable_tools
    • First observederror_detail
    • First observedexport_swipefile_deck
    • First observedfetch_app_screens
    • First observedfetch_asset
    • First observedfetch_social_data
    • First observedfind_competitors
    • First observedfind_creators
    • First observedfind_tools
    • First observedfinish_video
    • First observedfix_beat
    • First observedforget
    • First observedformat_sheet
    • First observedgenerate_avatar
    • First observedgenerate_image
    • First observedgenerate_text
    • First observedgenerate_video
    • First observedgenerate_voice
    • First observedget_brand
    • First observedget_drive_file
    • First observedget_job
    • First observedget_linkedin_lead
    • First observedget_onedrive_file
    • First observedget_post_refill
    • First observedget_settings
    • First observedget_skill
    • First observedhermoso_capabilities
    • First observedhermoso_credits
    • First observedinvite_member
    • First observedleave_connector
    • First observedlist_brands
    • First observedlist_business_locations
    • First observedlist_connector_accounts
    • First observedlist_connectors
    • First observedlist_creators
    • First observedlist_drive_files
    • First observedlist_errors
    • First observedlist_hooks
    • First observedlist_jobs
    • First observedlist_library
    • First observedlist_linkedin_lead_events
    • First observedlist_linkedin_lead_forms
    • First observedlist_linkedin_lead_subscriptions
    • First observedlist_linkedin_leads
    • First observedlist_linkedin_pages
    • First observedlist_memory
    • First observedlist_meta_pages
    • First observedlist_meta_posts
    • First observedlist_onedrive_files
    • First observedlist_pinterest_boards
    • First observedlist_playbooks
    • First observedlist_product_photos
    • First observedlist_published_posts
    • First observedlist_scheduled
    • First observedlist_sheet_tabs
    • First observedlist_skills
    • First observedlist_swipefile
    • First observedlist_team
    • First observedlist_telegram_chats
    • First observedlist_watch_findings
    • First observedlist_whatsapp_accounts
    • First observedmake_explainer
    • First observedmake_template_ad
    • First observedmake_thumbnail
    • First observedmanage_sheet_tabs
    • First observedmine_angles
    • First observedmultiply_ad
    • First observedplan_ad
    • First observedplan_variations
    • First observedpost_edit
    • First observedpost_performance
    • First observedpost_to_bluesky
    • First observedpost_to_google_business
    • First observedpost_to_linkedin
    • First observedpost_to_linkedin_page
    • First observedpost_to_meta
    • First observedpost_to_pinterest
    • First observedpost_to_telegram
    • First observedpost_to_tiktok
    • First observedpost_to_x
    • First observedpost_to_youtube
    • First observedpost_x_article
    • First observedproduct_sizzle
    • First observedpublish_to_shopify_product
    • First observedpull_competitor_ads
    • First observedread_doc
    • First observedread_sheet
    • First observedrecast_motion
    • First observedreframe_video
    • First observedremember
    • First observedremix_static
    • First observedremove_member
    • First observedrender_ad
    • First observedreport_bug
    • First observedrequest_feature
    • First observedreschedule_post
    • First observedresearch_ads
    • First observedretry_scheduled
    • First observedrun_post_refill
    • First observedsave_creator
    • First observedsave_playbook
    • First observedsave_skill
    • First observedsave_to_drive
    • First observedsave_to_onedrive
    • First observedsave_to_swipefile
    • First observedschedule_post
    • First observedscore_ad
    • First observedsearch_google_ads
    • First observedsearch_instagram
    • First observedsearch_linkedin_ads
    • First observedsearch_meta_ads
    • First observedsearch_reddit
    • First observedsearch_threads
    • First observedsearch_tiktok
    • First observedsearch_youtube
    • First observedset_auto_reload
    • First observedset_competitor_watch
    • First observedset_connector_accounts
    • First observedset_post_refill
    • First observedset_product_image
    • First observedset_role
    • First observedstitch_video
    • First observedstore_get
    • First observedsubscribe_linkedin_leads
    • First observedtidy_memory
    • First observedupdate_brand
    • First observedupdate_doc
    • First observedupdate_drive_file
    • First observedupdate_onedrive_file
    • First observedupdate_settings
    • First observedupdate_sheet
    • First observedupgrade_plan
    • First observedupload_file
    • First observedupscale_video
    • First observeduse_brand

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    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.
    87
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Unifies Google Ads, Meta Ads, and Google Analytics 4 into a single remote MCP server, offering 250+ tools for campaign management, audience targeting, ad creation, and performance analytics across platforms with OAuth login and no API keys required.
    1,434
    MIT
  • 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.
    17
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A3.8/5.0
Disambiguation3/5

The descriptions are exceptionally detailed and cross-reference one another (e.g. post_edit vs finish_video vs edit_video), which genuinely helps, but 168 tools still contain tight clusters—video creation/editing, scheduling, and post-publishing—where misselection is easy. Many tools also reference hidden companions not in the visible set, adding ambiguity.

Naming Consistency4/5

The overwhelming majority follow a clear verb_noun snake_case convention (post_to_x, search_x, list_x, create_x, update_x). Minor deviations like store_get, billing_status, error_detail, and the hermoso_ prefix break the pattern slightly but do not obscure it.

Tool Count1/5

At 168 tools this is far beyond the 50+ threshold, and regardless of how broad the platform's purpose is, the sheer number makes the set hard to navigate. The server mitigates with groups and find_tools/call_tool, but the count itself is extreme.

Completeness4/5

The set covers a full marketing lifecycle—research, planning, creation, publishing, scheduling, measurement, billing, and file management—with no major workflow gaps. Some referenced tools like list_shopify_products and manage_meta_post are not in the visible list, but find_tools and call_tool are explicitly designed to close that gap.