Skip to main content
Glama

agent-media

Server Details

Turn an app screenshot or a product photo into a 10-second vertical AI UGC video ad of a creator showing it. Sign in with OAuth; videos need an agent-media plan.

Ownership verified
Status
Healthy
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.3/5.0

Scored across 14 tools

Disambiguation4/5

The three generators map cleanly to distinct media types, and get_run_status/quote/list_models/rate_run each have a clear job. Minor overlap remains: upload_image doubles as both the actual upload tool and the fallback for opening the upload panel, and quote vs quote_ugc plus make_ugc vs generate_video require reading descriptions to separate. These are clarified in the text, so an agent can mostly disambiguate.

Naming Consistency4/5

Most tools follow a clean verb_noun pattern (generate_audio, get_run_status, list_models, open_upload_panel, upload_image), and the generate_* family is fully consistent. Minor deviations are bare/abbreviated names like quote, quote_ugc, and make_ugc, but they remain readable and predictable.

Tool Count5/5

14 tools is well within the sweet spot for a media-generation platform, covering generators, pricing, status, uploads, discovery and feedback. Each tool earns its place without obvious redundancy.

Completeness4/5

The surface covers the full generation lifecycle: discovery (list_models, list_characters), cost preview (quote, quote_ugc), upload (open_upload_panel, upload_image, get_uploads), generation (image/video/audio/make_ugc), polling (get_run_status) and feedback (rate_run). Gaps are minor — no explicit job cancellation or run-history listing — which agents can largely work around.

Available Tools

14 tools
generate_audioAInspect

Speak text in a named voice (jessica, sarah, liam, chris, roger, lily, bill, matilda, or a raw ElevenLabs voice id). A cloned voice cannot speak Hebrew: a stock voice of the same gender speaks a Hebrew line. Emotion tags like [excited] or [whispers] are honoured. For a talking-head clip you usually do NOT need this: generate_video renders native speech when the words are in the prompt. Use it for voiceover over b-roll or a standalone audio file. Models: elevenlabs-tts. Spends 16 credits per 1,000 characters, rounded up. Returns a job id, poll get_run_status for the mp3 URL. The mp3 URL can be passed as an audio_ref to generate_video.

RETRY SAFETY: set request_id to a fresh UUID for a new generation. Reuse the exact same request_id and inputs only to recover a lost response; that returns the original job without another charge. A deliberately new generation needs a new request_id. Keep the returned job_id and poll get_run_status. Never invent a refund.

NameRequiredDescriptionDefault
textYesThe words to speak. Emotion tags like [excited] or [whispers] are honoured. Priced per character; see list_models.
toneNoenergetic | calm | confident | dramatic.
modelNoA live audio model id from list_models, or "auto". Omit for the default (elevenlabs-tts).
voiceNoA voice name: jessica (young female), sarah (female), liam (young male), chris (male), roger (male), lily (elder female), bill (elder male), matilda (warm), or a raw ElevenLabs voice id. A cloned voice cannot speak Hebrew: a stock voice of the same gender speaks a Hebrew line.sarah
request_idNoUnique request identity (prefer a UUID). Reuse with identical inputs to recover the same job after a lost response; choose a new identity only for an intentionally new generation.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (which only flag non-readonly, open-world, non-idempotent, non-destructive), the description discloses credit cost (16 per 1,000 characters, rounded up), the async job model, and a detailed retry-safety contract for request_id including that replay returns the original job without recharging. That idempotency nuance is especially valuable given idempotentHint=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?

Purpose and the sibling comparison are front-loaded, and the retry-safety block is clearly separated from the core description. It is long and repeats the voice list already present in the schema, but nearly every sentence carries operational information (pricing, polling, audio_ref chaining).

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

Completeness5/5

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

Although there is no output schema, the description explains the return value (a job id to poll via get_run_status for the mp3 URL) and that the resulting URL can be chained into generate_video as an audio_ref. For a 5-parameter async generation tool, nothing an agent needs to call and follow up correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond it: the voice roster with gender/age characterizations, the cloned-voice Hebrew limitation, and the request_id reuse-vs-new-generation distinction. The tone enum and model parameter are left to the schema, and the voice list is partly duplicated from the schema description, keeping it from a 5.

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

Purpose5/5

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

The description opens with a specific verb+resource ("Speak text in a named voice") and immediately enumerates the voice options. It explicitly distinguishes itself from the closest sibling by stating generate_video renders native speech when words are in the prompt, so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

It states both when NOT to use it ("for a talking-head clip you usually do NOT need this") and when to use it instead ("voiceover over b-roll or a standalone audio file"), naming the alternative tool explicitly. Constraints like the Hebrew/cloned-voice rule further narrow correct usage.

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

generate_imageAInspect

Render one image from YOUR prompt. Without refs it paints from the prompt; with refs (https URLs) it edits/composes from them, a portrait to re-light, a product to place in a hand, a character sheet to pose. Use it to build the reference a video needs (portrait first, then generate_video with that URL in refs). Models: gpt-image-2.5, gpt-image-2.5-flare, gpt-image-2, nano-banana-pro (default gpt-image-2.5). Spends credits per image (see list_models). Returns a job id, poll get_run_status for the image URL.

When the user wants to provide a product photo, portrait, screenshot, or image reference, check tools/list. If open_upload_panel is available, offer it first: call open_upload_panel with {}, show its inline panel or returned browser link, and wait for the user to finish. Then call get_uploads with the returned session_id and use the exact ready image_url in refs, first_frame, last_frame, or the matching skill image field. Do not start a reference-dependent generation until the required images are ready. The panel accepts still PNG, JPEG, and WebP, up to 10 images and 25 MB each. Images expire 24 hours after the panel is created; show the returned expiry, request a new upload if expired, and never make a permanent copy. Uploading uses no generation credits. Do not ask the user for base64, shell commands, or a public hosting service; do not continuously poll while waiting for them. Only call these tool names when discovered. If they are missing from the connected tool catalog, call upload_image with {} to open the same panel; use the returned panel: upload_key with upload_image to retrieve images after the user finishes. If that reports the panel is unavailable, use upload_image only for an already accessible file or URL. Do not build an upload page or request a local folder as a substitute for the existing panel. Never invent access to a chat attachment: if you cannot read it, explain that and offer the panel when available. Browser fallback works without inline UI support; do not promise an inline panel in every client. Inspect the native image previews returned with retrieved uploads before describing them or writing image-specific prompts. Never infer what the image shows from an email domain, account metadata, or filename. Use the original URLs for generation, not preview bytes. If the session ID was lost, call get_uploads with {} to list recent sessions, or upload_image with {"upload_key":"panel:recent"} for cached catalogs; retrieve the matching session before asking for re-upload. Account-wide recent uploads may belong to other conversations, so clarify ambiguous selection. Uploading stores an image; it does not attach it to a generation automatically. If the user already requested a generation with these images, continue that request using the returned URLs; do not stop at "upload complete" or ask again whether to use them. If make_ugc fits the requested outcome, pass a person photo as image or a product photo as product_image, then call quote_ugc before spending. Otherwise compose the direct generators: for generate_image, put the relevant image_url values in refs; for generate_video, use refs for product/person/appearance references, or first_frame for animating a still (last_frame only for an explicitly requested ending frame), and never combine refs with frame fields. Preserve the user's intended image roles and model limits; ask only if the role or selection is unclear. Include the URL in the tool arguments, not only in the prompt. Do not substitute a newly generated image for the uploaded reference. If the request was upload-only, report readiness and wait for a generation request; uploading alone does not authorize spending credits. After submitting, poll get_run_status and return the result.

IMAGES: pass an https URL. If you only have raw bytes or a data: URL, call upload_image FIRST and pass the URL it returns. Never paste base64 into these arguments, the client prints tool arguments in the conversation, so a base64 image becomes a wall of text for the user and is re-sent on every retry.

RETRY SAFETY: set request_id to a fresh UUID for a new generation. Reuse the exact same request_id and inputs only to recover a lost response; that returns the original job without another charge. A deliberately new generation needs a new request_id. Keep the returned job_id and poll get_run_status. Never invent a refund.

NameRequiredDescriptionDefault
refsNoReference images (https URLs, up to 4). With refs the model EDITS/composes from them (a product into a hand, a portrait re-lit); without, it paints from the prompt alone.
sizeNo1024x1536 portrait (default, for 9:16 video), 1024x1024 square, 1536x1024 landscape.1024x1536
modelNoA live image model id from list_models, or "auto" to let agent-media pick from recent results. Omit for the default (gpt-image-2.5).
promptYesWhat to paint. Be concrete: subject, age, framing, light, lens, mood, what the hands do.
request_idNoUnique request identity (prefer a UUID). Reuse with identical inputs to recover the same job after a lost response; choose a new identity only for an intentionally new generation.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations, it discloses credit spending per image, model choices, return behavior ('Returns a job id, poll get_run_status'), and nuanced retry safety via request_id reuse to avoid duplicate charges. These are material behaviors an agent needs and are not captured by readOnlyHint, destructiveHint, or idempotentHint.

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 front-loaded and organized into sections, but it is extremely long for a 5-parameter tool and includes extensive upload-panel instructions that primarily belong to sibling tools. It is not disorganized, but it is well beyond what is needed for this tool alone.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 credit-spending generation tool with no output schema, the description covers return values, polling, model selection, reference handling, upload prerequisites, and retry semantics. An agent has enough information to invoke it correctly and recover safely from failures.

Complex tools with many parameters or behaviors need more documentation. Simple tools 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 model IDs, clarifies refs as editing/composition references, and explains how to pass URLs in arguments rather than prompts. It repeats some schema text, but the workflow context around refs and request_id gives extra meaning.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Render one image from YOUR prompt.' It immediately distinguishes behavior with and without refs, and explicitly explains how it differs from generate_video by describing the portrait-first workflow. An agent can identify this as the direct image-generation tool without opening the schema.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance, including routing to make_ugc for person/product photos, quote_ugc before spending, and composing direct generators otherwise. It also states when not to start reference-dependent generation and when to use the upload panel first. The alternatives and preconditions are clearly named.

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

generate_videoAInspect

Render a video clip from YOUR prompt on the model YOU choose, in one of three MODES that follow from the fields you pass: TEXT (prompt only), IMAGE-TO-VIDEO (first_frame: an https still that becomes frame one, optionally last_frame to end on; the clip animates the still) or REFERENCE (refs: https images such as a portrait, a character sheet from list_characters or a product photo whose identity/look is kept; video_refs: clips whose motion or framing is followed; audio_refs: a voice or sound to carry; address them in the prompt as @image1, @video1, @audio1). Frames and refs cannot be mixed. Write the shot like a director: who is in frame, where, what happens, camera, and the exact spoken words in quotes if anyone talks. HEBREW: the video models cannot speak Hebrew, so Hebrew words in quotes are never left to them: Gemini speaks the line and OmniHuman 1.5 lip-syncs a front-facing still to it (your first_frame, or a keyframe made from the prompt and refs). 9:16 or 1:1, up to 35 s, no video_refs or audio_refs; priced as the voice + the keyframe + 26 credits per lip-sync second instead of the model's rate (call quote); voiceover sets the voice (sulafat, achird) or the gender. Models: seedance-2.0, seedance-2.5, wan-3.0-prime (default seedance-2.5; call list_models for each model's modes, limits, prices and recent results; or pass model:"auto"). Aspect: 9:16 default, also 16:9, 1:1, 4:3, 3:4, 3:2, 2:3, 21:9, adaptive where the selected model supports it. Quality: 480p, 720p, 1080p, or 4k where the selected model supports it; omit for the selected model's default. The price per second follows the model and quality (seedance-2.5: 60 credits/s at 480p, 125 credits/s at 720p, 225 credits/s at 1080p; call list_models for the full table). Reference clip seconds are billed like output seconds. Call quote first if the user cares about cost. Returns a job id, then call get_run_status until it is done and hand the user the URL.

When the user wants to provide a product photo, portrait, screenshot, or image reference, check tools/list. If open_upload_panel is available, offer it first: call open_upload_panel with {}, show its inline panel or returned browser link, and wait for the user to finish. Then call get_uploads with the returned session_id and use the exact ready image_url in refs, first_frame, last_frame, or the matching skill image field. Do not start a reference-dependent generation until the required images are ready. The panel accepts still PNG, JPEG, and WebP, up to 10 images and 25 MB each. Images expire 24 hours after the panel is created; show the returned expiry, request a new upload if expired, and never make a permanent copy. Uploading uses no generation credits. Do not ask the user for base64, shell commands, or a public hosting service; do not continuously poll while waiting for them. Only call these tool names when discovered. If they are missing from the connected tool catalog, call upload_image with {} to open the same panel; use the returned panel: upload_key with upload_image to retrieve images after the user finishes. If that reports the panel is unavailable, use upload_image only for an already accessible file or URL. Do not build an upload page or request a local folder as a substitute for the existing panel. Never invent access to a chat attachment: if you cannot read it, explain that and offer the panel when available. Browser fallback works without inline UI support; do not promise an inline panel in every client. Inspect the native image previews returned with retrieved uploads before describing them or writing image-specific prompts. Never infer what the image shows from an email domain, account metadata, or filename. Use the original URLs for generation, not preview bytes. If the session ID was lost, call get_uploads with {} to list recent sessions, or upload_image with {"upload_key":"panel:recent"} for cached catalogs; retrieve the matching session before asking for re-upload. Account-wide recent uploads may belong to other conversations, so clarify ambiguous selection. Uploading stores an image; it does not attach it to a generation automatically. If the user already requested a generation with these images, continue that request using the returned URLs; do not stop at "upload complete" or ask again whether to use them. If make_ugc fits the requested outcome, pass a person photo as image or a product photo as product_image, then call quote_ugc before spending. Otherwise compose the direct generators: for generate_image, put the relevant image_url values in refs; for generate_video, use refs for product/person/appearance references, or first_frame for animating a still (last_frame only for an explicitly requested ending frame), and never combine refs with frame fields. Preserve the user's intended image roles and model limits; ask only if the role or selection is unclear. Include the URL in the tool arguments, not only in the prompt. Do not substitute a newly generated image for the uploaded reference. If the request was upload-only, report readiness and wait for a generation request; uploading alone does not authorize spending credits. After submitting, poll get_run_status and return the result.

IMAGES: pass an https URL. If you only have raw bytes or a data: URL, call upload_image FIRST and pass the URL it returns. Never paste base64 into these arguments, the client prints tool arguments in the conversation, so a base64 image becomes a wall of text for the user and is re-sent on every retry.

RETRY SAFETY: set request_id to a fresh UUID for a new generation. Reuse the exact same request_id and inputs only to recover a lost response; that returns the original job without another charge. A deliberately new generation needs a new request_id. Keep the returned job_id and poll get_run_status. Never invent a refund.

NameRequiredDescriptionDefault
refsNoREFERENCE-TO-VIDEO: image references (https URLs): a portrait, a character sheet from list_characters, a product photo. The model keeps that identity/look. Address them in the prompt as @image1, @image2...
seedNoOnly for models whose mode lists seed support (none of the live Seedance modes). Refused elsewhere.
audioNoRender native audio when the model supports an audio toggle (speech from the quoted words, ambience). false = silent clip on models that support silence.
modelNoA live video model id from list_models, or "auto" to let agent-media pick from recent results. Omit for the default. Call list_models for what each model is good for, its modes, limits and price.
aspectNo9:16 (default for text and reference), 16:9, 1:1, 4:3, 3:4, 3:2, 2:3, 21:9, or adaptive (follows the first frame or reference; the default and the only option in image mode on seedance-2.5).
promptYesThe shot, as a director would say it: who (age, look), where (setting, light), what happens, camera (phone framing), and, if anyone speaks, the exact words in quotes. About 2.3 words per second. With references, address them as @image1, @video1, @audio1.
qualityNoOne of 480p, 720p, 1080p, 4k where the selected model supports it. Omit for the model default. Price per second differs; see list_models.
secondsNoClip length in seconds (the model sets the range; seedance 2.0: 4 to 15, seedance 2.5: 4 to 30). Credits = seconds x the per-second rate at the chosen quality.
captionsNoOptional: burn word-timed captions in this style into the finished clip (a second step after the render, the subtitle price added). Leave out for no captions.
voiceoverNoSpeech in a language the video models cannot speak (Hebrew): the line is spoken by Gemini TTS and a front-facing still (first_frame, or a keyframe made from the prompt and refs) is lip-synced to it by OmniHuman 1.5. Hebrew lines in quotes get this automatically. 9:16 or 1:1, up to 35 s; not with video_refs or audio_refs. Priced as the voice + the keyframe (when there is no first_frame) + the lip-sync seconds, not the model's per-second rate.
audio_refsNoReference audio (https wav/mp3): a voice or a sound the clip should carry; @audio1... in the prompt.
last_frameNoOptional with first_frame: the image the clip ends on; the model animates from first to last.
request_idNoUnique request identity (prefer a UUID). Reuse with identical inputs to recover the same job after a lost response; choose a new identity only for an intentionally new generation.
video_refsNoReference clips (https mp4/mov) whose motion, framing or look the model should follow; @video1... in the prompt. Their seconds are billed like output seconds.
first_frameNoIMAGE-TO-VIDEO: an https image that becomes frame one of the clip (a still you want animated, a product shot, a portrait). Cannot be combined with refs, video_refs or audio_refs on Seedance.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only flag non-read-only, open-world, non-idempotent, non-destructive. The description adds real behavioral context beyond that: credit pricing per second by model/quality, the Hebrew path with its restrictions and alternate pricing, retry safety via request_id reuse without double charge, and the post-submit get_run_status polling loop.

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 core generation contract is front-loaded and well organized with caps-labeled sections, but roughly half the text is an upload-panel and tool-discovery procedure that duplicates open_upload_panel/upload_image/get_uploads guidance and is not needed to invoke this tool. It bloats the definition and dilutes the video-specific instructions.

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

Completeness5/5

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

For a 15-parameter, nested-object tool with no output schema, the description covers modes, per-model limits, pricing, the Hebrew special path, return handling (job id then get_run_status), and retry semantics. An agent can call it correctly and knows what comes back.

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

Parameters4/5

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

Schema coverage is 100%, so parameters are documented; the description nevertheless adds cross-field semantics the schema can't express well, such as mode selection following from which fields are populated and the rule that frames and refs cannot be mixed. The remaining per-enum details (aspect/quality support matrix) are deferred to list_models, which is reasonable but leaves some inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious 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+resource (render a video clip) and immediately enumerates the three operational modes derived from which fields are passed, which is exactly the distinction an agent needs. It also names sibling boundaries implicitly (generate_image, make_ugc) by routing image-only or UGC outcomes elsewhere.

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

Usage Guidelines5/5

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

Explicit when-to-use rules: call `quote` first if cost matters, call list_models for per-model modes, use make_ugc when it fits the requested outcome, otherwise compose the direct generators. It also gives when-not rules (never mix refs with frame fields; don't start a reference-dependent generation before images are ready).

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

get_accountA
Read-onlyIdempotent
Inspect

Check this authenticated connection, available generation credits, and whether generation/upload services are configured. Free and read-only: does not create an upload session, generate media, refill credits or change billing. Call before the first generation; then use quote_ugc for make_ugc or quote for a direct generator and compare the cost with the balance. A positive balance is not a guarantee of sufficient funds for a specific request or provider availability.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description reinforces this with concrete negatives: no upload session created, no media generated, no credits refilled, no billing change. It also adds a genuinely useful caveat that a positive balance does not guarantee sufficient funds or provider availability.

Agents need to know what a tool does to the world before 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 read-only guarantee is front-loaded in the first sentence, alternatives and caveats follow in priority order. Every sentence adds decision-relevant information with no filler.

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

Completeness4/5

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

With no output schema, the description carries the burden of indicating what comes back, and it does so at a high level: auth state, credit balance, service configuration flags. Exact response shape and units are not specified, which is a minor gap for a 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 tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies no inputs are needed by framing it as a read-only status check.

Input schemas describe structure but not intent. Descriptions should explain non-obvious 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 set: check authentication, available generation credits, and whether generation/upload services are configured. This is clearly distinct from siblings like get_run_status, get_uploads, and the 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 Guidelines5/5

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

Explicitly says to call it before the first generation and routes the agent onward: use quote_ugc for make_ugc or quote for a direct generator, then compare cost against balance. Both the when and the alternatives are named.

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

get_run_statusA
Read-onlyIdempotent
Inspect

Check a generation you already submitted, and get its output URL (video, image or audio) when it is done. Pass the id ANY agent-media tool returned (run id, skill run id, or job id), this resolves all of them. Set wait:true to block until the job reaches a terminal state (up to ~45 seconds per call; if it is still running, just call again: a video often takes several minutes, and list_models recent has each model's median render time, so keep calling until it is done). ALWAYS call this after submitting: without it you cannot tell whether the video succeeded, and cannot give the user a link.

NameRequiredDescriptionDefault
waitNoBlock until the run finishes or ~45 seconds elapse (default false). A video needs several such calls; just call again.
run_idYesThe run_id / skill_run_id / job_id returned when you submitted.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds the behavior that matters: the ~45 second blocking cap, the need to re-poll, and that videos take several minutes. It does not describe what a failed or errored run looks like in the response, which is the main remaining gap.

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

Conciseness4/5

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

The purpose and output come first, then id semantics, then the polling guidance — good front-loading. The final parenthetical about median render times is long and slightly redundant with the wait advice, but it still carries 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?

With no output schema, the description correctly takes on the return-value burden by naming the output URL and media types. It is nearly complete for a 2-parameter polling tool; only failure-state handling is left implicit.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds real semantics the schema lacks: run_id accepts ids from ANY agent-media tool and resolves run id, skill run id, and job id interchangeably. The wait parameter's blocking behavior is reinforced beyond the schema's own wording.

Input schemas describe structure but not intent. Descriptions should explain non-obvious 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 ('Check a generation you already submitted') and the payoff ('get its output URL (video, image or audio)'). This is unambiguously distinct from the generate_* siblings, which create runs rather than inspect 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?

Explicit conditional instructions: 'ALWAYS call this after submitting', 'Set wait:true to block', and 'if it is still running, just call again'. It even routes the agent to list_models `recent` to estimate render time, so the polling decision is grounded in another tool.

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

get_uploadsGet uploaded imagesA
Read-onlyIdempotent
Inspect

Retrieve uploaded images as native image previews plus original generation URLs and expiry times. Inspect the previews before describing the image or writing a prompt. Omit session_id to find recent unexpired sessions on this account if the session ID was lost; choose the session matching the user request, never silently mix unrelated uploads. Call after the user finishes uploading, not in a tight polling loop. Sessions and images expire 24 hours after the session opens; request a fresh upload if expired. Reuse these URLs for generation without downloading, re-encoding, or making a permanent copy.

NameRequiredDescriptionDefault
session_idNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare read-only/idempotent/non-destructive, so safety is covered; the description adds non-obvious behavior: 24-hour expiry of sessions and images, the need to request a fresh upload when expired, and the guidance to reuse URLs without downloading, re-encoding, or copying. It also discourages polling, which is a real invocation trait not captured anywhere in 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?

Front-loaded with what is returned, then usage rules, then expiry and URL-reuse guidance — every sentence carries actionable content. It runs five sentences and is dense, but no sentence is redundant; slightly tighter grouping would make it scannable faster.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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, yet the description names the return payload (native previews, original URLs, expiry times) and covers lifecycle (24h expiry, refresh path) and downstream consumption rules. Nothing an agent needs to call this correctly and interpret results 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 0% and the schema only declares a uuid-typed session_id with no meaning attached. The description supplies the crucial semantics: the parameter is optional, omitting it triggers a fallback discovery of recent unexpired sessions on the account, and the agent must select the matching session. It stops short of stating the expected format, which the schema already implies.

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

Purpose5/5

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

"Retrieve uploaded images as native image previews plus original generation URLs and expiry times" gives a specific verb, resource, and return content in one clause. It is clearly distinguishable from upload_image and open_upload_panel siblings, which imply writing/opening rather than reading.

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

Usage Guidelines5/5

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

Explicit sequencing ("Call after the user finishes uploading, not in a tight polling loop"), an alternative discovery path ("Omit session_id to find recent unexpired sessions... if the session ID was lost"), and a disambiguation rule ("choose the session matching the user request, never silently mix unrelated uploads"). It also names the downstream use ("Inspect the previews before describing the image or writing a prompt").

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

list_charactersA
Read-onlyIdempotent
Inspect

List the authenticated user's saved, reusable characters. Each has a character_id (char_…) and a character_sheet_url. Pass either one as make_ugc's character, or pass the sheet/portrait URL in refs of the advanced generate_video / generate_image tools. Plus a portrait/thumbnail URL for display.

NameRequiredDescriptionDefault
limitNoMax characters to return (default 50).

TDQS

A4.2/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, non-destructive, and non-open-world. The description adds useful behavioral context by describing the returned character identifiers and URLs and how they are consumed by sibling tools. It does not describe pagination behavior, but the single `limit` parameter is documented in the schema.

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

Conciseness4/5

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

The description is front-loaded with the listing purpose, then efficiently covers returned fields and downstream usage. The final sentence fragment about the portrait/thumbnail URL is useful but slightly less tightly structured than the rest.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 no output schema, the description sufficiently explains what is returned (`character_id`, `character_sheet_url`, portrait/thumbnail URL) and how those values are used. Annotations cover the safety profile, and the schema covers the sole parameter.

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 (`limit`) is fully documented there with a default and maximum. The description does not add parameter-level semantics, 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 and resource: "List the authenticated user's saved, reusable characters." It also explains the returned identifier formats (`character_id`, `character_sheet_url`) and distinguishes this listing tool from generation siblings by naming where its outputs are consumed.

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

Usage Guidelines4/5

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

It clearly states the downstream usage: pass a character_id or sheet URL as `make_ugc`'s `character`, or use the sheet/portrait URL in `refs` for advanced `generate_video` / `generate_image`. It does not explicitly say when not to use this tool versus alternatives like `get_uploads`, but the intended context is clear.

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

list_modelsA
Read-onlyIdempotent
Inspect

List the generation models agent-media can use: for each, its MODES (video: text, image-to-video via first_frame, reference via refs / video_refs / audio_refs) with the exact inputs, limits, aspects, qualities and credits per second of every mode, a "pick when" line, prompting tips, expected latency, how to select it, plus recent: the last 30 days of real runs per model (fail rate, auto-judge score, user ratings, median render time). Read this BEFORE choosing a model or a mode for generate_video / generate_image / generate_audio: the default seedance-2.5 is right for most jobs. Pass the id as model, or model:"auto" and the printed policy picks from the stats. Costs NO credits. Includes the same authenticated balance check as get_account; compare it with quote before generation. Set include_candidates:true to also see planned models that cannot be selected yet.

NameRequiredDescriptionDefault
include_candidatesNoAlso return planned models (no price, not selectable). Default false.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds value beyond them: 'Costs NO credits', it performs an authenticated balance check (an auth-adjacent side effect), the `recent` block covers the last 30 days of real runs with fail rate, auto-judge score, ratings and median render time, and candidates are explicitly not selectable. These are behavioral facts not 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.

Conciseness3/5

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

Front-loaded correctly and zero fluff sentences, but it is a single very dense sentence packing modes, limits, stats, cost, auth and defaults together, making it hard to scan. Some of the selection guidance could be separated from the return-value inventory.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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 describing return contents, and it does so thoroughly (per-mode inputs/limits/quality/credits, pick-when, latency, 30-day run stats). Nothing an agent needs to decide whether and how to call it is missing.

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

Parameters3/5

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

The only parameter, include_candidates, is already 100% covered by the schema and the description merely restates it. The instructions about passing the id as `model` or `model:"auto"` actually describe parameters of the generate_* tools, not of list_models, which risks confusing an agent about this tool's own signature.

Input schemas describe structure but not intent. Descriptions should explain non-obvious 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 ('List the generation models agent-media can use') and enumerates precisely what is returned per model: modes, exact inputs, limits, aspects, qualities, credits/second, pick-when line, latency, selection guidance, plus 30-day run statistics. This is clearly distinguishable from siblings like quote, get_account, or the generate_* tools.

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

Usage Guidelines5/5

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

Explicitly states timing and alternatives: 'Read this BEFORE choosing a model or a mode for generate_video / generate_image / generate_audio', plus compare the included balance with quote before generation, and use include_candidates:true only when planned models are relevant. It also names the default (seedance-2.5) so an agent knows when it can skip this call.

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

make_ugcAInspect

Optional convenience workflow for one finished vertical UGC video from a script. Use it when the user wants the server to choose takes and timing, join a long monologue, and optionally burn captions. Use the direct generate_image, generate_video and generate_audio tools instead when the agent needs custom models, modes, shot structure, intermediate assets, or a different composition. Use image for a person photo, product_image for a product photo, or character for a saved character. Use scene for where it happens (a beach, a gym, in bed, a car); without a place the video is set in an ordinary room. Call quote_ugc with the exact same input first; it costs no credits. Ask before setting captions:true. After submission, keep calling get_run_status until it returns the finished video URL. Files it lists under So far are intermediate, not the result.

When the user wants to provide a product photo, portrait, screenshot, or image reference, check tools/list. If open_upload_panel is available, offer it first: call open_upload_panel with {}, show its inline panel or returned browser link, and wait for the user to finish. Then call get_uploads with the returned session_id and use the exact ready image_url in refs, first_frame, last_frame, or the matching skill image field. Do not start a reference-dependent generation until the required images are ready. The panel accepts still PNG, JPEG, and WebP, up to 10 images and 25 MB each. Images expire 24 hours after the panel is created; show the returned expiry, request a new upload if expired, and never make a permanent copy. Uploading uses no generation credits. Do not ask the user for base64, shell commands, or a public hosting service; do not continuously poll while waiting for them. Only call these tool names when discovered. If they are missing from the connected tool catalog, call upload_image with {} to open the same panel; use the returned panel: upload_key with upload_image to retrieve images after the user finishes. If that reports the panel is unavailable, use upload_image only for an already accessible file or URL. Do not build an upload page or request a local folder as a substitute for the existing panel. Never invent access to a chat attachment: if you cannot read it, explain that and offer the panel when available. Browser fallback works without inline UI support; do not promise an inline panel in every client. Inspect the native image previews returned with retrieved uploads before describing them or writing image-specific prompts. Never infer what the image shows from an email domain, account metadata, or filename. Use the original URLs for generation, not preview bytes. If the session ID was lost, call get_uploads with {} to list recent sessions, or upload_image with {"upload_key":"panel:recent"} for cached catalogs; retrieve the matching session before asking for re-upload. Account-wide recent uploads may belong to other conversations, so clarify ambiguous selection. Uploading stores an image; it does not attach it to a generation automatically. If the user already requested a generation with these images, continue that request using the returned URLs; do not stop at "upload complete" or ask again whether to use them. If make_ugc fits the requested outcome, pass a person photo as image or a product photo as product_image, then call quote_ugc before spending. Otherwise compose the direct generators: for generate_image, put the relevant image_url values in refs; for generate_video, use refs for product/person/appearance references, or first_frame for animating a still (last_frame only for an explicitly requested ending frame), and never combine refs with frame fields. Preserve the user's intended image roles and model limits; ask only if the role or selection is unclear. Include the URL in the tool arguments, not only in the prompt. Do not substitute a newly generated image for the uploaded reference. If the request was upload-only, report readiness and wait for a generation request; uploading alone does not authorize spending credits. After submitting, poll get_run_status and return the result.

IMAGES: pass an https URL. If you only have raw bytes or a data: URL, call upload_image FIRST and pass the URL it returns. Never paste base64 into these arguments, the client prints tool arguments in the conversation, so a base64 image becomes a wall of text for the user and is re-sent on every retry.

NameRequiredDescriptionDefault
lookNonatural
nameNoName/age/vibe hint, e.g. 'Sophia, 28'.
imageNoA photo of the person, an https URL. The face is locked to it. If you only hold bytes, call `upload_image` first and pass the URL it returns; base64 is still accepted here but it is printed into the user’s chat and re-sent on every retry.
musicNo
sceneNoWHERE the video happens, in a few words: 'on a sunny beach, sea behind her', 'in a gym by the weights', 'in bed at night with a lamp on', 'in a parked car'. Set it whenever the user names a place. Without it the video is set in an ordinary room.
personNoDescribe the person in words. Omit if you pass image or character.
scriptNoWhat the person SAYS (lip-synced), any length. A one-liner makes one clip; a full monologue makes the full multi-take video automatically, never trimmed. Usually the only field you set. EXCEPTION: when you also pass product_image the video is a SINGLE take of at most 15s, so the script must be 46 words or fewer.
captionsNoBurn in TikTok/Hormozi captions. OFF unless set true, ASK the user whether they want captions (and which caption_style) before generating; never add captions unprompted.
durationNoIGNORED when `script` is set: length follows how long the words take to say (~2.9 words/sec; one take: up to 15 words → 5s, up to 31 → 10s, up to 46 → 15s; longer scripts become several takes sized the same way). A video is never stretched to reach a requested duration; silence between takes and at the end is cut, so the final video runs about as long as the speech. To get a longer video, write more words (~2.8 words per extra second). The response's take_plan shows the takes. Only used for a silent `scene_action` clip, which has no words to measure.
broll_urlNoA b-roll / gameplay / product video overlaid on the lower half while the person narrates.
characterNoReuse a saved character: its character_id (char_…) OR its character_sheet_url from list_characters.
aspect_ratioNo9:16
scene_actionNoA silent action clip (dancing, b-roll, vibes), no dialogue. Use instead of script; needs a `character`.
caption_styleNohormozi
product_imageNoA photo of a PRODUCT to show/hold/wear, an https URL. If you only hold bytes, call `upload_image` first and pass the URL it returns: base64 travels inside this tool call, is printed into the user’s chat, and is re-sent on every retry. Turns the video into a product ad; needs a `character` to hold it, and limits `script` to ONE take of at most 15s (46 words).

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important operational behavior: quote_ugc should be called first at no credit cost, captions require user confirmation, get_run_status must be polled after submission, and intermediate files under 'So far' are not the final result. It also explains upload-panel behavior, image expiry, and that uploading does not automatically attach an image to a generation.

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 purpose and alternatives are front-loaded well, but the definition is heavily bloated with general upload-panel instructions, fallback procedures, expiry rules, browser-panel caveats, and image-preview guidance. Much of that content is cross-cutting upload workflow rather than make_ugc-specific behavior, so many sentences do not earn their place in this tool definition.

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

Completeness5/5

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

Given 15 parameters, no output schema, and sparse annotations, the description is complete enough for an agent to call the tool correctly. It covers the generation workflow, credit preflight, caption confirmation, polling, final-video retrieval, and the image/product upload path, including what happens when upload tools are unavailable.

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 73%, and the schema already documents the most important parameters such as script, image, product_image, character, scene, captions, and duration. The description reinforces some parameter roles and constraints, but it does not add much for undocumented fields like look, music, aspect_ratio, and caption_style beyond the 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 first sentence states the exact resource and outcome: a finished vertical UGC video from a script. It also distinguishes this convenience workflow from the direct generate_image, generate_video, and generate_audio tools, so an agent can recognize when make_ugc is the intended path.

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 and explicit alternatives: use make_ugc when the server should choose takes and timing, but use the direct generators when the agent needs custom models, modes, shot structure, intermediate assets, or different composition. It further names quote_ugc as the zero-credit preflight and explains the image/product_image/character/scene roles.

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

open_upload_panelUpload imagesAInspect

Open a drag-and-drop image upload panel for the user. Use when the user wants to supply photos, portraits, products, or image references, especially in Claude or ChatGPT. PNG/JPEG/WebP, up to 25 MB each and 10 images, available for up to 24 hours. No generation credits. Returns a browser link for clients without inline panels. Never ask the user to paste base64. After the user uploads, call get_uploads with the returned session_id; use the exact image_url in refs, first_frame, or a skill image field. Do not generate before images are ready.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial context beyond the sparse annotations: accepted formats, 25 MB per-file and 10-image limits, 24-hour retention, no credit consumption, and a browser-link fallback for clients lacking inline panels. Missing only failure behavior (what happens if the panel is unavailable or the session expires mid-upload).

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 action, then constraints, then follow-up instructions — every sentence carries operational content. It is slightly dense, packing limits, cost, fallback, and chaining rules into one block, but nothing is filler.

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

Completeness5/5

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

With no input schema and no output schema, the description must carry the full contract, and it does: trigger condition, limits, lifetime, cost, return channels, and the exact next tool call. An agent can act correctly without any other 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?

Zero parameters, so the baseline is 4; the schema is a closed empty object. The description instead documents the outputs (session_id, image_url) and where to place them (refs, first_frame, skill image field), which is valuable but is return-value guidance rather than parameter semantics.

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

Purpose5/5

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

States a specific action (open a drag-and-drop image upload panel) and its resource (images), plus the user-facing intent (supply photos, portraits, products). It is clearly distinguishable from siblings like upload_image (direct upload) and get_uploads (retrieval after upload).

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

Usage Guidelines5/5

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

Explicit when-to-use (user wants to supply image references), explicit anti-pattern ('Never ask the user to paste base64'), and an explicit next step ('After the user uploads, call get_uploads'). It also warns not to generate before images are ready, which routes the agent correctly relative to generate_image.

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

quoteA
Read-onlyIdempotent
Inspect

Price a generate_image / generate_video / generate_audio call WITHOUT running it. Pass the same input you would pass to the tool. Returns credits (1 credit = $0.01), the model that would run, and the breakdown. Costs nothing. Use it before spending when the user asked about cost, when choosing between models, or before a clip longer than a few seconds.

NameRequiredDescriptionDefault
kindYes
inputYesThe exact arguments you would pass to generate_<kind>.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds value beyond them by stating the call is free ('Costs nothing'), that it returns credits at a stated conversion (1 credit = $0.01), the model that would run, and a breakdown. The 'Pass the same input' contract is also a behavioral rule not captured 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?

Three tight sentences, front-loaded with the core action and the 'WITHOUT running it' distinction in the first line, followed by return shape and then usage triggers. No filler.

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

Completeness5/5

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

With no output schema, the description supplies the return contents (credits, model, breakdown) that would otherwise be unknown. It also covers cost and the input-passthrough contract, so an agent has everything needed for a 2-param preview 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 50%, with the `kind` enum and the `input` object already described structurally. The description reinforces the key semantic constraint that `input` must be exactly the arguments you would pass to generate_<kind>, and semantically ties kind to the corresponding sibling tool, which is meaningful beyond the schema.

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

Purpose5/5

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

States a specific verb (price) and resource (a generate_* call) and explicitly distinguishes itself from the sibling generate_image/generate_video/generate_audio tools by saying it runs nothing. An agent can tell instantly what it does and what it does not do.

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 trigger conditions: before spending when the user asks about cost, when choosing between models, or before a clip longer than a few seconds. It also names the alternative behavior implicitly (call generate_* directly to actually run), 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.

quote_ugcA
Read-onlyIdempotent
Inspect

Price an optional make_ugc workflow and check the spendable balance without rendering or using credits. Pass the exact input intended for make_ugc. Show the returned price to the user and only call make_ugc after the user has authorized that spend.

NameRequiredDescriptionDefault
lookNonatural
nameNoName/age/vibe hint, e.g. 'Sophia, 28'.
imageNoA photo of the person, an https URL. The face is locked to it. If you only hold bytes, call `upload_image` first and pass the URL it returns; base64 is still accepted here but it is printed into the user’s chat and re-sent on every retry.
musicNo
sceneNoWHERE the video happens, in a few words: 'on a sunny beach, sea behind her', 'in a gym by the weights', 'in bed at night with a lamp on', 'in a parked car'. Set it whenever the user names a place. Without it the video is set in an ordinary room.
personNoDescribe the person in words. Omit if you pass image or character.
scriptNoWhat the person SAYS (lip-synced), any length. A one-liner makes one clip; a full monologue makes the full multi-take video automatically, never trimmed. Usually the only field you set. EXCEPTION: when you also pass product_image the video is a SINGLE take of at most 15s, so the script must be 46 words or fewer.
captionsNoBurn in TikTok/Hormozi captions. OFF unless set true, ASK the user whether they want captions (and which caption_style) before generating; never add captions unprompted.
durationNoIGNORED when `script` is set: length follows how long the words take to say (~2.9 words/sec; one take: up to 15 words → 5s, up to 31 → 10s, up to 46 → 15s; longer scripts become several takes sized the same way). A video is never stretched to reach a requested duration; silence between takes and at the end is cut, so the final video runs about as long as the speech. To get a longer video, write more words (~2.8 words per extra second). The response's take_plan shows the takes. Only used for a silent `scene_action` clip, which has no words to measure.
broll_urlNoA b-roll / gameplay / product video overlaid on the lower half while the person narrates.
characterNoReuse a saved character: its character_id (char_…) OR its character_sheet_url from list_characters.
aspect_ratioNo9:16
scene_actionNoA silent action clip (dancing, b-roll, vibes), no dialogue. Use instead of script; needs a `character`.
caption_styleNohormozi
product_imageNoA photo of a PRODUCT to show/hold/wear, an https URL. If you only hold bytes, call `upload_image` first and pass the URL it returns: base64 travels inside this tool call, is printed into the user’s chat, and is re-sent on every retry. Turns the video into a product ad; needs a `character` to hold it, and limits `script` to ONE take of at most 15s (46 words).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint true and destructiveHint false, and the description adds real context beyond that: no rendering, no credit consumption, and a balance check. It does not say whether a quote expires or what happens on invalid input, so it stops short of full disclosure.

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

Conciseness5/5

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

Three short sentences, no repetition, and the safety-critical instruction (authorize before spending) lands at the end where it is most salient. Every sentence carries an instruction the agent must act on.

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, no-output-schema tool, the description correctly frames inputs as make_ugc's payload and mentions the 'returned price' as the output. Missing only edge-case behavior (quote staleness, error responses) for full completeness.

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

Parameters4/5

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

With 73% schema coverage the schema carries most of the burden, but the description adds a critical semantic the schema can't: the parameters are the exact make_ugc input, i.e. this call must mirror that tool's payload. Individual parameter behavior is left to the rich schema.

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

Purpose4/5

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

Opens with a specific verb+resource ('Price an optional make_ugc workflow and check the spendable balance') and explicitly distinguishes itself from make_ugc by noting it runs 'without rendering or using credits'. The only gap is the sibling 'quote', which is never mentioned, leaving the general-vs-UGC quoting split implicit.

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

Usage Guidelines5/5

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

Gives an explicit workflow: pass the exact input intended for make_ugc, show the price to the user, and only call make_ugc after authorization. That is a when-to-use rule and a hard gate on the alternative, not an inference.

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

rate_runA
Idempotent
Inspect

Rate a finished generate_video / generate_image / generate_audio run 1 to 5, with an optional note (what was wrong or right). Costs nothing. Do this when the user reacts to an output, "perfect", "her face changed", "too slow", or when you can see a defect yourself. Ratings feed the per-model stats in list_models and the model:"auto" choice, so an honest 2 helps more than a polite 4.

NameRequiredDescriptionDefault
noteNoOne line on why (optional).
scoreYes1 = unusable, 3 = usable with edits, 5 = shipped as-is.
run_idYesThe job id the generate tool returned.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare non-read-only, idempotent, non-destructive; the description adds things annotations can't convey: the call costs nothing, the run must already be finished, and ratings aggregate into list_models stats and model:"auto" selection. It stops short of saying what happens on re-rating an already-rated run or on an unknown run_id, so it's strong but not exhaustive.

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

Conciseness5/5

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

Three sentences, front-loaded with the operation and scale, then triggers, then the incentive rationale. No sentence is redundant and nothing is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence 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, non-destructive feedback tool with no output schema, the description covers cost, preconditions, triggers, and consequences of the data. An agent has everything needed to decide to call it and how to score honestly.

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 defines the score anchors (1 unusable, 3 usable with edits, 5 shipped) and the note's one-line purpose, so the baseline is 3. The description adds only scoring-conduct framing ("an honest 2 helps more than a polite 4") rather than new format or constraint detail.

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

Purpose5/5

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

Names a specific verb (Rate) and resource (a finished generate_video/generate_image/generate_audio run), plus the 1-5 scale and the optional note. This cleanly distinguishes it from the generation siblings, which create runs rather than evaluate 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?

Explicit triggers are given: the user reacts to an output (with quoted examples like "her face changed" or "too slow"), or the agent itself observes a defect. It also names the downstream consumer of the data, which tells the agent why and when the call matters.

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

upload_imageAInspect

When the user wants to provide a product photo, portrait, screenshot, or image reference, check tools/list. If open_upload_panel is available, offer it first: call open_upload_panel with {}, show its inline panel or returned browser link, and wait for the user to finish. Then call get_uploads with the returned session_id and use the exact ready image_url in refs, first_frame, last_frame, or the matching skill image field. Do not start a reference-dependent generation until the required images are ready. The panel accepts still PNG, JPEG, and WebP, up to 10 images and 25 MB each. Images expire 24 hours after the panel is created; show the returned expiry, request a new upload if expired, and never make a permanent copy. Uploading uses no generation credits. Do not ask the user for base64, shell commands, or a public hosting service; do not continuously poll while waiting for them. Only call these tool names when discovered. If they are missing from the connected tool catalog, call upload_image with {} to open the same panel; use the returned panel: upload_key with upload_image to retrieve images after the user finishes. If that reports the panel is unavailable, use upload_image only for an already accessible file or URL. Do not build an upload page or request a local folder as a substitute for the existing panel. Never invent access to a chat attachment: if you cannot read it, explain that and offer the panel when available. Browser fallback works without inline UI support; do not promise an inline panel in every client. Inspect the native image previews returned with retrieved uploads before describing them or writing image-specific prompts. Never infer what the image shows from an email domain, account metadata, or filename. Use the original URLs for generation, not preview bytes. If the session ID was lost, call get_uploads with {} to list recent sessions, or upload_image with {"upload_key":"panel:recent"} for cached catalogs; retrieve the matching session before asking for re-upload. Account-wide recent uploads may belong to other conversations, so clarify ambiguous selection. Uploading stores an image; it does not attach it to a generation automatically. If the user already requested a generation with these images, continue that request using the returned URLs; do not stop at "upload complete" or ask again whether to use them. If make_ugc fits the requested outcome, pass a person photo as image or a product photo as product_image, then call quote_ugc before spending. Otherwise compose the direct generators: for generate_image, put the relevant image_url values in refs; for generate_video, use refs for product/person/appearance references, or first_frame for animating a still (last_frame only for an explicitly requested ending frame), and never combine refs with frame fields. Preserve the user's intended image roles and model limits; ask only if the role or selection is unclear. Include the URL in the tool arguments, not only in the prompt. Do not substitute a newly generated image for the uploaded reference. If the request was upload-only, report readiness and wait for a generation request; uploading alone does not authorize spending credits. After submitting, poll get_run_status and return the result.

For an image already accessible to you: Store an image and get back a stable https URL you can pass to any agent-media tool. Costs NO credits. THREE ways in, in this order:

  1. FILE ON DISK (when the file is already accessible to your shell): call upload_image with file_bytes set to the exact byte size of the file (wc -c < photo.png) and file_name. You get back a put_url; run the printed curl to stream the file straight to storage, then call upload_image again with the upload_key you were given to get the URL. The bytes never pass through this conversation, so there is NO reason to resize, crop or re-encode the user’s photo first. Do not: a downscaled product photo is what the video model will show. Up to 25 MB.

  2. A URL you already have: pass image_url to re-host it.

  3. Raw bytes with no shell available: pass image_base64 (PNG or JPEG, 10 MB max after decoding). Only when 1 and 2 are impossible, and even then upload the original, never a shrunken copy. Then pass the returned URL everywhere. Do NOT paste base64 into other tool arguments or into the conversation: the client displays tool arguments to the user, so a base64 image becomes a wall of unreadable text, and every retry re-sends it.

NameRequiredDescriptionDefault
file_nameNoOptional with file_bytes: the file name, so the content type is right (.png or .jpg).
image_urlNoAn https URL to fetch and re-host instead.
file_bytesNoStep 1 of the file path: the exact size of the file in bytes (`wc -c < photo.png`). Returns a put_url and an upload_key. Full resolution, up to 25 MB.
upload_keyNoReuse the exact upload_key returned earlier: a panel: key retrieves all ready temporary images; a file upload key confirms the completed PUT and returns its image_url.
image_base64NoThe image bytes, base64-encoded. A `data:image/png;base64,...` prefix is accepted and stripped. Last resort: use file_bytes when you can run a shell.

TDQS

A4/5.0
Behavior5/5

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

Goes far beyond the annotations: no generation credits consumed, 25 MB ceiling (10 MB decoded for base64), 24-hour expiry on panel images, the two-phase put_url + upload_key handshake, and the fact that file bytes bypass the conversation entirely. It also warns that image previews are not to be used for generation and that the client renders tool arguments visibly, which is non-obvious and operationally important.

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?

Substantially over-long and poorly front-loaded: the tool's actual function appears only after paragraphs of guidance about sibling tools, generation orchestration, make_ugc, and polling. Several constraints (do not poll, never infer from filename, preserve image roles) are repeated or belong to other tools' descriptions. It reads as a merged system prompt rather than a definition.

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 does explain what comes back (put_url, upload_key, image_url, panel: keys, expiry) and covers limits, fallbacks, expiry recovery, and handoff to generators. It is nearly complete, losing a point only because the density makes the return-value contract harder to extract than it should be.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantic layering: the three input modes are ranked by preference, and the two distinct roles of upload_key (panel: key versus file-upload completion key) are explained. The only shortfall is that the file_bytes/curl round-trip sequence is described in prose that is longer than the schema needs.

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

Purpose3/5

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

The core purpose is stated, but only in the final third: "Store an image and get back a stable https URL you can pass to any agent-media tool." The first two paragraphs are routing instructions toward open_upload_panel and get_uploads, so an agent skimming the opening might conclude this tool's job is user-interaction orchestration rather than storing an image. The verb+resource is specific once found, but it is diluted by multi-tool workflow narration.

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

Usage Guidelines5/5

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

Explicit when-to-use ordering is given: panel first if available, then file_bytes for a shell-accessible file, then image_url for a re-host, then image_base64 only as a last resort when 1 and 2 are impossible. When-not rules are equally explicit ("Do NOT paste base64 into other tool arguments or into the conversation", "never make a permanent copy", "do not build an upload page"). Alternatives and fallbacks are named with the conditions that select them.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updates
    • First observedgenerate_audio
    • First observedgenerate_image
    • First observedgenerate_video
    • First observedget_account
    • First observedget_run_status
    • First observedget_uploads
    • First observedlist_characters
    • First observedlist_models
    • First observedmake_ugc
    • First observedopen_upload_panel
    • First observedquote
    • First observedquote_ugc
    • First observedrate_run
    • First observedupload_image

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Perplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.
    2
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Enables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.
    16
    4 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources