ai-content-drop
Server Details
Make AI videos, images, ads and short dramas from a description, priced first. Sign in to create.
- Status
- Healthy
- Uptime
- 100.0% over 41 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- aicontentdrop/aicontentdrop
- GitHub Stars
- 0
TDQS
Scored across 42 tools
Most tools target a distinct action+resource (add_* card types, generate_video vs generate_image vs generate_ad, estimate_ad_cost vs estimate_credit_cost, get_generation vs get_ad_job). However, refresh_canvas is explicitly documented as returning the same answer as get_canvas, and add_frame partially overlaps group_cards, creating a couple of confusable pairs.
Nearly all 42 tools follow a consistent snake_case verb_noun convention (add_*, get_*, list_*, generate_*, estimate_*, search_*). The only minor outlier is ad_to_canvas_card, but the pattern is overwhelmingly predictable.
42 tools is very heavy for the apparent scope, and the set includes clear redundancy (refresh_canvas duplicating get_canvas). While the platform is broad, this surface is bloated and could be consolidated significantly.
Coverage is broad across boards, cards, generation, ad analysis, and content lookup, with solid create/read/update paths. But there are no delete operations anywhere (no delete_canvas, delete_card, delete_saved_ad, or delete_brand_profile), leaving lifecycle coverage incomplete.
Available Tools
42 toolsadd_frameInspect
Add a labelled frame (a region such as Week 1 or Hooks) to a board. To wrap existing cards in a frame use group_cards instead. Costs no credits. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | The frame's label, up to 200 characters. | |
| width | No | Optional width in pixels; defaults to 480. | |
| height | No | Optional height in pixels; defaults to 360. | |
| position | No | Optional { x, y } in board pixels. When omitted the server places the card in the first free grid cell. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | Yes | |
| canvas | Yes | |
| next_step | Yes |
add_generation_cardInspect
Add a draft generation card to a board: a prompt and a model (an id from list_models) that can be rendered later with run_generation_card. Adding it costs nothing; nothing renders until it is run with a quote. Set duration and resolution on the card for a per-second model: the quote for run_generation_card must be taken with them. For a step that builds on an earlier card (a still that becomes a video), pass from_card_id: the new card is connected to that card on the board and, unless it has its own image_url, starts from that card's finished image. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Defaults to video. | |
| model | No | A model id from list_models. | |
| width | No | Optional card width in pixels. | |
| height | No | Optional card height in pixels. | |
| prompt | No | The generation prompt, up to 4000 characters. | |
| duration | No | Optional clip length in seconds, for video models that price by duration. | |
| position | No | Optional { x, y } in board pixels. When omitted the server places the card in the first free grid cell. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. | |
| image_url | No | Optional public https reference image for image-to-video or image-to-image. | |
| resolution | No | Optional, e.g. 720p, 1080p. | |
| aspect_ratio | No | Optional, e.g. 9:16, 16:9, 1:1. | |
| from_card_id | No | Optional: an image generation card or an image media card on the same board. The new card is connected to it, and its finished image is the new card's start frame when the new card runs (run the source card first). |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | Yes | |
| edge | No | The connection from from_card_id, when one was given. |
| canvas | Yes | |
| next_step | Yes |
add_media_cardInspect
Add an image or video card to a board from a public https URL (an import_asset result, a finished generation's video_url, or an ad's video_url). Costs no credits. Returns the whole board and the new card. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public https URL of the image or video. | |
| kind | Yes | ||
| title | No | Optional title, up to 200 characters. | |
| width | No | Optional card width in pixels. | |
| height | No | Optional card height in pixels. | |
| source | No | Optional provenance: where the media came from. | |
| caption | No | Optional caption, up to 2000 characters. | |
| position | No | Optional { x, y } in board pixels. When omitted the server places the card in the first free grid cell. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | Yes | |
| canvas | Yes | |
| next_step | Yes |
add_text_cardInspect
Add a text card (a note, an idea, a script line) to a board. The server places it on a grid unless a position is given. Costs no credits. Returns the whole board and the new card. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The card's text, up to 4000 characters. | |
| color | No | Optional colour name or hex the website uses for the card. | |
| title | No | Optional title, up to 200 characters. | |
| width | No | Optional card width in pixels. | |
| height | No | Optional card height in pixels. | |
| position | No | Optional { x, y } in board pixels. When omitted the server places the card in the first free grid cell. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | Yes | |
| canvas | Yes | |
| next_step | Yes |
ad_to_canvas_cardInspect
Place a saved competitor ad on a board as a media card (its video or image, the advertiser as title, the hook as caption) with its decoded brief attached when it has one. Costs no credits. Returns the whole board and the new card. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | A saved ad's id, from list_saved_ads or save_competitor_ad. | |
| revision | No | The board revision this change is based on. Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ad | Yes | |
| card | Yes | |
| canvas | Yes | |
| next_step | Yes |
arrange_cardsInspect
Lay chosen cards (or the whole board) out as a grid, a row or a column. Costs no credits. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| gap | No | Optional spacing in pixels; defaults to 24. | |
| ids | No | Card ids to arrange; omitted means every card. | |
| layout | Yes | ||
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| canvas | Yes | |
| next_step | Yes |
connect_cardsIdempotentInspect
Connect two cards on a board with a line from one to the next, so the board reads as a flow: a script card to the card that renders it, an idea to each of its variations. Costs no credits. Refuses a card connected to itself, a frame, and a connection that is already there. To make an image card's result the start frame of a new card, add that card with add_generation_card and from_card_id instead. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Optional short label drawn on the line, up to 200 characters. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. | |
| to_card_id | Yes | The card it leads to. | |
| from_card_id | Yes | The card the line starts from, from cards[] on the board. |
Output Schema
| Name | Required | Description |
|---|---|---|
| edge | Yes | A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame. |
| canvas | Yes | |
| next_step | Yes |
create_canvasInspect
Create a new, empty board and return it. Costs no credits. Use one board per plan or campaign; cards are added with the add_* tools. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Board name, up to 100 characters. Defaults to Untitled Canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| canvas | Yes | |
| next_step | Yes |
decode_adIdempotentInspect
Decode a saved competitor ad into a reusable formula: hook, script, scenes, audio, call to action and style, plus a generation-ready recreation prompt. Requires a quote_id from estimate_ad_cost with kind "decode" (a flat price). Credits are charged only when the analysis succeeds; an ad decoded before returns its stored decode and charges nothing. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | A saved ad's id, from list_saved_ads or save_competitor_ad. | |
| quote_id | Yes | The quote_id from estimate_ad_cost with kind "decode". Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present only when the charge could not be applied to the account. |
| ad_id | Yes | |
| cached | Yes | True when a stored decode was returned; nothing was charged. |
| decode | Yes | The ad's formula, layer by layer, plus a generation-ready prompt. |
| replayed | Yes | True when this quote_id had already been submitted and the original result was returned. |
| next_step | Yes | |
| credits_used | Yes | Credits charged: 0 for a stored decode or when the charge could not be applied (then note says so); null when the figure is not reported. |
| credits_quoted | Yes | The price fixed by the quote. |
estimate_ad_costARead-onlyIdempotentInspect
Price a studio job before making it: a finished ad from a brief or storyboard (kind "ad"), a UGC creator video (kind "ugc"), a generated avatar (kind "avatar") or a competitor-ad decode (kind "decode"). Returns the credit lines, the total and a quote_id that generate_ad, generate_ugc_video, generate_avatar and decode_ad require. No account needed. For an ad, quote exactly the fields you will submit.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Defaults to ad. | |
| brief | No | The ad brief: brandName, brandOneLiner, valueProps (1-8 strings), cta, intent, format (an id from list_ad_formats), shotCount (1-5), totalDurationSec (5-20), aspect (9:16 | 16:9 | 1:1), language, quality (fast | premium), modelTier (standard | cinematic), garmentImageUrl for the try-on formats. | |
| quality | No | Lip-sync tier. premium costs more per talking shot. Defaults to the brief's quality, else fast. | |
| model_tier | No | cinematic renders on Seedance with director-grade camera work and costs more per shot; needs the brief. | |
| storyboard | No | The storyboard returned by write_ad_storyboard, as is or edited. When present it is what renders; the brief is optional alongside it. | |
| persona_mode | No | synthetic lets the studio substitute one consistent generated creator for the avatar; exact-avatar (default) keeps the avatar as given. | |
| needs_avatar_gen | No | True when the avatar still has to be generated (billed as a line). | |
| needs_product_gen | No | True when the product still has to be generated (billed as a line). |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| basis | Yes | |
| lines | Yes | |
| quote_id | Yes | Signed quote. Pass it to the matching generate_* tool; it fixes the price and makes a retry safe. |
| next_step | Yes | |
| expires_at | Yes | ISO time after which the quote is refused. |
| credits_total | Yes | For an ad, the most it can cost; the charge on success is never higher. |
| expires_in_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, and the description is consistent with that. It adds genuinely new behavior: it returns credit lines plus a total plus a quote_id, states no account is needed, and discloses that the quote_id is a prerequisite for the generator tools. Return-format detail is limited, but the output schema is the better place for that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler: purpose, kind taxonomy, and return/contract information, all front-loaded. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only estimator with a full output schema, this covers what is needed: what it prices, the output contract, the quote_id dependency, and the no-auth condition. Nothing essential is missing or left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value by expanding the meaning of the kind enum values (what 'ad', 'ugc', 'avatar', 'decode' actually price) and by giving submission guidance ('quote exactly the fields you will submit'). It does not add syntax detail beyond the schema for the nested brief/storyboard objects.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Price a studio job before making it') and then enumerates the four job kinds it prices (ad, ugc, avatar, decode). It also names the downstream consumers (generate_ad, generate_ugc_video, generate_avatar, decode_ad), so an agent can place it precisely relative to siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the timing ('before making it') and adds the concrete rule 'For an ad, quote exactly the fields you will submit.' That is clear context for when to call it, but it does not address the near-neighbour sibling estimate_credit_cost, which an agent would need to disambiguate between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_credit_costARead-onlyIdempotentInspect
Price a video or image before making it. Returns the exact credit cost and a quote_id that generate_video and generate_image require. No account needed. Pass the duration and resolution you intend to use; some video models bill per second.
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | Video length in seconds you intend to generate. Affects the price of per-second models. | |
| model_id | Yes | Model ID, e.g. "kling_3_0" or "veo_3_fast". | |
| quantity | No | How many generations to price. Defaults to 1. Only a quote for exactly 1 can be spent; larger quantities are for planning. | |
| resolution | No | Video resolution you intend to generate, e.g. "720p" or "1080p". Affects the price of per-second models. | |
| reference_video_seconds | No | Length in seconds of the reference video you will pass as reference_video_url (seedance_2_5 up to 30 s, or seedance_2_0_fast up to 15 s at 720p). Reference seconds are billed as input, so they change the price; the server measures the file and refuses a quote whose length does not match. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| type | Yes | |
| basis | Yes | |
| model_id | Yes | Normalized to underscores. |
| quantity | Yes | |
| quote_id | Yes | Signed quote. Pass it to generate_video or generate_image; it fixes the price and makes a retry safe. |
| next_step | Yes | |
| resolution | No | The resolution actually priced, for per-second models. |
| credits_each | Yes | |
| credits_total | Yes | |
| duration_seconds | No | The duration actually priced, for per-second models. |
| quote_expires_at | Yes | ISO time after which the quote is refused. |
| reference_video_seconds | No | Reference-video seconds priced as input, when a reference was quoted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent, and the description adds meaningful behavioral context: it returns an exact credit cost and a spendable quote_id, requires no account, and notes that some video models bill per second. This clarifies auth needs and cost behavior 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the purpose, followed by the key output and usage pointers. Every sentence earns its place with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, the required output, the no-account condition, and the pricing nuance. Since an output schema exists, return values are sufficiently specified, and the overall combination of description, schema, and annotations is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description reminds users to pass duration and resolution, but that information is already present in the schema, so it adds little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: "Price a video or image before making it." It further distinguishes the tool by stating it returns a quote_id required by generate_video and generate_image, which sets it apart from cost tools like estimate_ad_cost.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly says to use this tool before generating and to pass the intended duration and resolution. It does not explicitly mention alternatives or when not to use it, but the precondition and typical workflow are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_adIdempotentInspect
Make a finished video ad — multi-shot, with a speaking creator, product shots, captions and an optional music bed — from a brief or a storyboard plus an avatar image and a product image. Requires a quote_id from estimate_ad_cost for exactly these fields; returns a job_id to poll with get_ad_job. Credits are charged only when the ad succeeds, and never more than the quote. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | The ad brief: brandName, brandOneLiner, valueProps (1-8 strings), cta, intent, format (an id from list_ad_formats), shotCount (1-5), totalDurationSec (5-20), aspect (9:16 | 16:9 | 1:1), language, quality (fast | premium), modelTier (standard | cinematic), garmentImageUrl for the try-on formats. | |
| music | No | Optional music bed. | |
| quality | No | Lip-sync tier. premium costs more per talking shot. Defaults to the brief's quality, else fast. | |
| quote_id | Yes | The quote_id from estimate_ad_cost for these exact fields (kind ad). Required. | |
| canvas_id | No | Optional board id (from list_canvases or create_canvas): the ad is placed on it as a generation card that fills in when the render lands. | |
| avatar_url | Yes | Public https URL of the creator's reference image (a catalogue portrait, a generate_avatar result, or an import_asset URL). | |
| model_tier | No | cinematic renders on Seedance with director-grade camera work and costs more per shot; needs the brief. | |
| project_id | No | Optional studio project (uuid) to file the run under. | |
| storyboard | No | The storyboard returned by write_ad_storyboard, as is or edited. When present it is what renders; the brief is optional alongside it. | |
| persona_mode | No | synthetic lets the studio substitute one consistent generated creator for the avatar; exact-avatar (default) keeps the avatar as given. | |
| needs_avatar_gen | No | True when the avatar still has to be generated (billed as a line). | |
| needs_product_gen | No | True when the product still has to be generated (billed as a line). | |
| product_image_url | Yes | Public https URL of the product image. | |
| avatar_description | No | Optional one-line identity note for the creator (20-500 characters). | |
| product_description | No | Optional one-line product note (10-500 characters). |
Output Schema
| Name | Required | Description |
|---|---|---|
| job_id | Yes | Poll this with get_ad_job. |
| status | Yes | |
| replayed | Yes | True when this quote_id had already been submitted and the original job was returned. |
| next_step | Yes | |
| studio_url | No | The job's page in the studio on AI Content Drop. |
| credits_quoted | Yes | The ceiling fixed by the quote. |
| poll_after_seconds | Yes |
generate_avatarIdempotentInspect
Generate a creator portrait (Nano Banana) to use as the avatar in generate_ad, checked for hands, face and background defects. Requires a quote_id from estimate_ad_cost with kind "avatar". Finishes within the call; credits are charged only when a portrait comes back. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | Who the creator is: age, look, clothing, setting, mood (20-800 characters). | |
| save_as | No | Optional name; saves the portrait on a brand profile for reuse. | |
| quote_id | Yes | The quote_id from estimate_ad_cost with kind "avatar". Required. | |
| aspect_ratio | No | Defaults to 9:16. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present only when the charge could not be applied to the account. |
| qa_notes | Yes | |
| replayed | Yes | |
| next_step | Yes | |
| qa_passed | Yes | |
| avatar_url | Yes | Pass as avatar_url to generate_ad. |
| credits_used | Yes | The charge that landed; 0 when no portrait came back or the charge could not be applied (then note says so). |
| credits_quoted | Yes | |
| brand_profile_id | No |
generate_imageAIdempotentInspect
Make an AI image: a product still, a thumbnail, a poster, concept art, or a reference frame to animate later. Requires a quote_id from estimate_credit_cost so the price is agreed first; then returns a job id to poll with get_generation (kind "image"). Credits are charged only when the image succeeds. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Image model ID from list_models with type "image". Must match the quoted model; omitted means the quoted model. | |
| prompt | Yes | What the image should show. | |
| quote_id | Yes | The quote_id from estimate_credit_cost for this exact image model. Required. | |
| image_url | No | Optional public reference image (image-to-image). Only these models accept one: gpt_image_2, gpt_image_2_edit, gpt_image_2_5_flare, gpt_image_2_5_sunburst, seedream_5_0_pro. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Poll this with get_generation. |
| kind | Yes | |
| model | No | |
| status | Yes | |
| replayed | Yes | True when this quote_id had already been submitted and the original job was returned. |
| image_url | No | Null until the render finishes. |
| next_step | Yes | What to do next, in words, so a model need not infer it. |
| unlimited | No | |
| video_url | No | Null until the render finishes. |
| credits_used | Yes | 0 until the render succeeds; billing is post-deduct. |
| credits_quoted | Yes | The price fixed by the quote. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that credits are charged only on successful generation, that the call returns a job id rather than an immediate image, and that OAuth or an API key is required. These are meaningful behavioral details that an agent needs to manage cost expectations and polling flow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized logically: purpose, workflow prerequisite, return behavior, pricing, then auth. It is dense but every sentence adds needed information, and the primary purpose is front-loaded before the procedural details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters and an output schema, the description covers the full invocation contract: what to prepare (quote_id), what happens next (job id poll via get_generation), cost timing, auth methods, and input constraints. Nothing essential for calling the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all parameters with 100% coverage, so the baseline is 3. The description adds practical semantics by explaining that quote_id must come from estimate_credit_cost, that model must match the quoted model, and that only certain models accept image_url, which goes beyond the schema's individual field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource, 'Make an AI image,' and lists concrete output types such as product still, thumbnail, poster, concept art, and reference frame. It further distinguishes the tool's output channel by noting the job returns a kind of 'image' to poll with get_generation, separating it from video generation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the prerequisite workflow: first obtain a quote_id from estimate_credit_cost, then call this tool, then poll with get_generation. It also explains when authentication is needed and how to provide it, but it does not explicitly name a sibling alternative such as generate_video for when video output is desired.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_ugc_videoAIdempotentInspect
Make a UGC-style creator video: a catalogue creator (template from list_ugc_avatars) or a person's own photo (image_url) speaks the script with lip-sync, optional voice choice and ambience. Requires a quote_id from estimate_ad_cost with kind "ugc", and image_rights_consent: true given by the person. Returns an id to poll with get_generation. Credits are charged only on success. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| voice | No | Optional voice id or name. | |
| script | Yes | What the creator says, up to 1000 characters. | |
| ambience | No | Optional background sound, e.g. cafe, street, none. | |
| language | No | Optional language code, e.g. en. | |
| quote_id | Yes | The quote_id from estimate_ad_cost with kind "ugc". Required. | |
| template | No | A creator id from list_ugc_avatars. Alternative to image_url. | |
| image_url | No | Public https URL of the person's photo. Alternative to template. | |
| image_rights_consent | Yes | Must be true, and only after the person confirmed they hold the rights to the face and accept the acceptable-use terms. No default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Poll this with get_generation. |
| kind | Yes | |
| status | Yes | |
| replayed | Yes | |
| next_step | Yes | |
| credits_used | Yes | 0 until the render succeeds; billing is post-deduct. |
| credits_quoted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (non-destructive, idempotent, open-world), and the description adds substantial context beyond them: credits are charged only on success, the call returns an id to poll, an explicit image_rights_consent requirement, and full auth instructions (OAuth or Bearer acd_live_ key with URL). This is genuinely rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and modes, then prerequisites, then cost/polling behavior. The trailing SIGN-IN block is dense but earns its place for an auth-required tool; overall efficient though slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, authorized, credit-charged generation tool, the description covers inputs' provenance, consent gating, cost timing, async polling, and authentication. Since an output schema exists, no return-shape detail is needed, and nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-tool meaning: it names where template comes from (list_ugc_avatars) and where quote_id comes from (estimate_ad_cost with kind "ugc"), clarifying the authoring flow beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Make a UGC-style creator video') and clearly delineates the two modes (catalogue creator via template vs. person's own photo via image_url), distinguishing it from generic siblings like generate_video and generate_avatar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear prerequisites and routes the agent to sibling tools: template 'from list_ugc_avatars', quote_id 'from estimate_ad_cost with kind "ugc"', and polling via get_generation. It implies when to use it (UGC creator content) but doesn't explicitly state when to choose generate_video or generate_avatar instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_videoAIdempotentInspect
Make an AI video: a product ad, a vertical clip for social, a cinematic shot, or animate a photo into video (image-to-video). Requires a quote_id from estimate_credit_cost so the price is agreed first; then returns a job id to poll with get_generation. Credits are charged only when the video succeeds. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Model ID from list_models, e.g. "kling_3_0". Must match the quoted model; omitted means the quoted model. | |
| prompt | Yes | What the video should show. Detailed prompts produce better results. | |
| duration | No | Length in seconds. Must match the quoted duration for per-second models. | |
| quote_id | Yes | The quote_id from estimate_credit_cost for this exact model, duration and resolution. Required. | |
| image_url | No | Public image URL to animate (image-to-video). Required for models whose list_models entry has needs_start_image; optional for the rest. | |
| resolution | No | e.g. "720p" or "1080p". Must match the quoted resolution for per-second models. | |
| aspect_ratio | No | Defaults to 16:9. Use 9:16 for vertical social clips. | |
| reference_video_url | No | Optional public https URL of a reference video (for example a 3D blockout playblast) whose camera movement, shot rhythm and subject motion the generation must follow. seedance_2_5 (30 s max) or seedance_2_0_fast (15 s max, 720p). The quote must have been priced with reference_video_seconds equal to this clip's length rounded up; the server measures the clip and refuses on mismatch. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Poll this with get_generation. |
| kind | Yes | |
| model | No | |
| status | Yes | |
| replayed | Yes | True when this quote_id had already been submitted and the original job was returned. |
| image_url | No | Null until the render finishes. |
| next_step | Yes | What to do next, in words, so a model need not infer it. |
| unlimited | No | |
| video_url | No | Null until the render finishes. |
| credits_used | Yes | 0 until the render succeeds; billing is post-deduct. |
| credits_quoted | Yes | The price fixed by the quote. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: states that credits are charged only on success, that an OAuth sign-in or a specific API key header is required, and that a job id is returned for polling. This adds billing, auth and async-job context that the hints (readOnlyHint=false, idempotentHint=true) do not convey, and it is consistent with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the required quote_id flow before the auth block, and every sentence carries information. The OAuth/API-key sentence is long and partly host-handled, but it is genuinely needed setup context rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-parameter, async, credit-charging tool with an output schema, the description covers the cost gate, the auth requirement, and the follow-up call (get_generation). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value by naming the sibling that produces quote_id and framing the quote as the agreed price, and by tying reference_video_url to a quote priced with reference_video_seconds. It does not add syntax beyond the schema for the remaining parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Make an AI video') and enumerates concrete output types (product ad, vertical social clip, cinematic shot, image-to-video). It distinguishes the image-to-video mode explicitly, but never differentiates itself from close siblings such as generate_ugc_video or generate_ad.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear required workflow: obtain a quote_id from estimate_credit_cost first, then poll the returned job with get_generation. Prerequisites (quote must exist, price agreed) are stated. No explicit when-not-to-use guidance versus generate_ugc_video or generate_image is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountARead-onlyIdempotentInspect
Check the signed-in account's remaining credits and current plan name before generating, and get the informational page about plans and entitlement. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| plan | Yes | free | starter | professional | ultra | enterprise_max |
| info_url | Yes | Informational page describing plans and entitlement options. |
| username | No | |
| can_generate | Yes | |
| credits_remaining | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is known. The description adds the crucial behavior that sign-in is required)Skip, specifying two authentication methods and a link to create credentials. This adds meaningful context beyond annotations, though it doesn't describe the output format beyond 'informational page'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the primary purpose and then providing essential authentication guidance. Every sentence adds value, with no filler. The critical sign-in requirement is placed prominently after the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema and readOnly annotations, the description is quite complete. It covers purpose, usage timing, and authentication details. The only minor gap is that it doesn't explicitly state that no parameters are required (though the schema shows this), which is trivial. The output schema presumably details the response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parametersaday, so the description need not explain parameter semantics. It correctly focuses on what the tool returns, which is abundant. With 100% schema coverage (empty schema), the description compensates fully for the lack of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks the signed-in account's remaining credits and current plan name, and retrieves the informational page about plans and entitlement. It uses specific verbs ('Check', 'get') and a clear resource ('signed-in account', 'informational page'), which distinguishes it from siblings like 'list_models' or 'generate_image'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use this tool before generating, and details the sign-in requirements (OAuth or API key) and where to create the key. It provides necessary context for when to call it, though it doesn't explicitly mention alternatives; however, the use case is so unique that no alternative is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_jobRead-onlyIdempotentInspect
Check an ad job: stage and percent while it renders, then the finished video URL, the storyboard sheet, duration, size and the credits charged. Poll every 15 seconds after generate_ad; stop after 15 minutes. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id returned by generate_ad. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present only when a succeeded job's charge could not be applied to the account. |
| error | No | |
| stage | No | storyboard | rendering | done, while known. |
| job_id | Yes | |
| status | Yes | |
| percent | No | |
| next_step | Yes | |
| video_url | No | The finished ad with burnt-in captions. Present only when succeeded. |
| size_bytes | No | |
| studio_url | No | The job's page in the studio on AI Content Drop. |
| credits_used | Yes | Credits charged for this job when the record reports them; null when a succeeded job's record does not carry the figure (credits_quoted from generate_ad is the ceiling). 0 while running, when failed, or when the charge could not be applied (then note says so). |
| duration_seconds | No | |
| retry_after_seconds | No | Present while the job is not terminal. |
| storyboard_sheet_url | No | The storyboard sheet image, when the run produced one. |
get_articleARead-onlyIdempotentInspect
Fetch the full text of one published article as markdown, by slug.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Article slug, e.g. "kling-vs-sora-comparison". |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| slug | Yes | |
| title | Yes | |
| markdown | Yes | Full article body. |
| published | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the 'published' scoping constraint and 'markdown' return format, which is useful but not rich 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence states the action, resource, format, and input in about a dozen words. Every element earns its place, with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with a full output schema, annotations covering safety, and no nested objects, the description provides everything an agent needs: what to pass (slug), what it returns (full text as markdown), and the published-only constraint. No missing critical context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the slug parameter is already documented with a description and example. The description's 'by slug' adds no new meaning beyond the schema, so it 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch'), states the resource ('full text of one published article'), specifies the output format ('as markdown'), and identifies the key identifier ('by slug'). This clearly distinguishes it from sibling tools like search_articles or list_generations without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when you have a slug and need the full published text) but does not explicitly state when not to use it or mention alternatives such as search_articles for finding articles. Usage context is implied, not explicitly routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_canvasRead-onlyIdempotentInspect
Read one board in full: every card with its type, position, size and data, the edges, and the revision. Generation cards that are still rendering are checked against their jobs on every read. Shows the board as a view; a board already on screen updates itself, so call this to show a board that is not. Costs no credits. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| canvas | Yes | |
| next_step | Yes |
get_canvas_linkARead-onlyIdempotentInspect
Get the link to a board's page on AI Content Drop so the person can open it in a browser or the host's embedded browser panel. Costs no credits. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | |
| name | Yes | |
| canvas_id | Yes | |
| next_step | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/non-open-world, so the bar is lower. The description adds genuinely useful behavior beyond them: 'Costs no credits' (relevant in a credit-metered tool family) and an explicit SIGN-IN REQUIRED block with both OAuth and API-key header paths.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and cost note before the auth detail, and every sentence carries information. The auth block is verbose but justified for a sign-in-gated server.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained; annotations carry the safety profile; and the auth requirement is fully spelled out. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single param (canvas_id) is already documented as 'The board id, from list_canvases or create_canvas'. The description adds no syntax or sourcing 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get the link to a board's page on AI Content Drop'. The 'link/page in a browser' framing implicitly separates it from get_canvas (content) and list_canvases, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context — the link is for opening in a browser or the host's embedded browser panel — so the agent knows the scenario. It does not explicitly name alternatives (e.g. get_canvas) 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.
get_generationRead-onlyIdempotentInspect
Check whether a video or image is finished and get its URL. Poll this after generate_video or generate_image; pass kind "image" for an image job. Reports status, the finished file URL, and the credits charged. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id returned by generate_video or generate_image. | |
| kind | No | Which job type the id belongs to. Defaults to video. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Poll this with get_generation. |
| kind | No | |
| model | No | Model ID, underscored. |
| title | No | |
| status | Yes | generating | processing | completed | failed | timeout |
| image_url | No | |
| video_url | No | |
| credits_used | Yes | Charged only on success — a failed generation is 0. |
| error_message | No | |
| thumbnail_url | No |
get_saved_adRead-onlyIdempotentInspect
Read one saved competitor ad in full, with its stored decode (the ad's formula and a recreation prompt) when it has one. Costs no credits; never runs a decode. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | A saved ad's id, from list_saved_ads or save_competitor_ad. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ad | Yes | |
| decode | Yes | The ad's formula, layer by layer, plus a generation-ready prompt. |
| next_step | Yes |
group_cardsInspect
Wrap chosen cards in a labelled frame that encloses them. Returns the board and the new frame. Costs no credits. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | The card ids to enclose. | |
| label | Yes | The frame's label, up to 200 characters. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | Yes | |
| canvas | Yes | |
| next_step | Yes |
import_assetAIdempotentInspect
Copy a public image (JPEG, PNG or WebP, at most 10 MB) onto AI Content Drop so it can be used as an avatar, product or photo reference. Returns the hosted URL. Costs no credits. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public https URL of the image. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | The hosted copy. |
| bytes | Yes | |
| width | No | |
| height | No | |
| next_step | Yes | |
| content_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=true), the description discloses authentication requirements in detail (OAuth prompt or 'Authorization: Bearer acd_live_…' API key), the zero-credit cost, the accepted input formats/size limit, and the hosted-URL result. This is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: purpose and constraints first, then return value and cost, then auth. No filler, and the auth prerequisite is clearly flagged for the agent before it attempts the call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain the response, and it still mentions the hosted URL. Combined with explicit auth, cost, and input constraints, an agent has everything needed to invoke this tool successfully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'url' param is already described, so the baseline is 3. The description nevertheless adds validation semantics the schema lacks: only publicly reachable images, restricted to JPEG/PNG/WebP, capped at 10 MB.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Copy a public image ... onto AI Content Drop') plus accepted formats and size cap, and clarifies what the asset is for (avatar, product or photo reference). This clearly differentiates it from generation siblings like generate_image or generate_avatar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use (importing an existing public image as a reference/avatar) and notes 'Costs no credits,' which implicitly steers an agent away from paid generation when an existing image suffices. It does not, however, explicitly name an alternative or state when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_brand_profileAIdempotentInspect
Read a brand's website and save a brand profile from it: name, value props, CTA, tone and product images. Costs no credits. Low-confidence reads are returned for confirmation instead of being saved. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The brand's product page or app page. | |
| mode | No | What kind of page it is. Defaults to product. | |
| persist | No | Save when the read is confident. Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| profile | Yes | The saved profile, or null when not saved. |
| warnings | Yes | |
| next_step | Yes | |
| extraction | No | What was read from the page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations, which only declare the non-read-only/idempotent/non-destructive profile: it adds credit cost, the low-confidence confirmation branch instead of silent save, and explicit auth mechanics (OAuth prompt or Bearer acd_live_ key). It does not clarify whether saving overwrites or duplicates an existing profile, which matters for a write tool flagged idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what is read and saved, then cost/confidence behavior, then the auth requirement last. No filler, and each sentence carries distinct operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description covers cost, auth, and the confirmation escape hatch. The one gap is the write semantics of persist (create vs overwrite on an existing brand profile), which is material for a tool with destructiveHint=false and idempotentHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so url, mode, and persist are already documented in the schema, including the enum and both defaults. The description adds no parameter-level detail (e.g., what persist=false does to the confirmation flow), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a brand's website and save a brand profile') and enumerates exactly what the profile contains (name, value props, CTA, tone, product images). An agent can distinguish it from the read-only sibling list_brand_profiles 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides useful operating context (no credit cost, low-confidence reads returned rather than saved, sign-in required), but never states when to prefer this over alternatives such as list_brand_profiles or refresh_canvas, nor what happens when a profile already exists for the brand.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ad_formatsARead-onlyIdempotentInspect
See the ad formats the studio can produce — UGC, talking head, unboxing, tutorial, TV spot, product hero, hyper-motion, try-on and more — with a one-line description, the default aspect and the allowed shot count and duration. No account needed. Pick one before writing a brief.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| formats | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds auth context beyond the annotations ('No account needed') and previews the return payload, which is useful operational detail the structured fields do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the core action and return contents front-loaded, and the usage cue last. The format enumeration (UGC, talking head, unboxing...) is somewhat long but demonstrates catalogue breadth, so it largely earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with an output schema and full annotation coverage, the description supplies everything needed: what it lists, what each entry contains, that no account is required, and when to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters (0 params, empty schema), so the baseline is 4. The description correctly implies there is nothing to supply and instead characterizes the payload rather than inventing parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('See the ad formats the studio can produce') and enumerates the actual catalogue contents, so an agent knows exactly what comes back. It is clearly distinguishable from sibling lists (list_models, list_canvases, list_brand_profiles) and is tied to the ad-writing workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Pick one before writing a brief' explicitly places the tool in the workflow and signals the downstream consumer (write_ad_storyboard / generate_ad). It gives clear context but names no alternative tool or exclusion condition, 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_brand_profilesARead-onlyIdempotentInspect
List the account's saved brand profiles — name, site, value props, CTA, tone, product images — so ads for the same brand reuse the same facts. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| profiles | Yes | |
| next_step | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so those are covered. The description adds genuinely new operational context the annotations lack: authentication is required, via OAuth or a bearer API key header, with the exact header format and the URL to create the key. It stops short of describing pagination or result limits, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the operation and its purpose, then the auth requirement. No filler, and the critical blocker (sign-in) is called out in caps rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero params, an output schema, and strong read-only annotations, the only real risk an agent faces is auth failure — and the description covers that thoroughly. The field list is mildly redundant against the output schema, but nothing needed 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 per the rubric. The description's enumeration of returned fields adds useful shape for an agent even though the output schema already exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (the account's saved brand profiles), then enumerates the fields returned (name, site, value props, CTA, tone, product images). This clearly separates it from the write-side sibling import_brand_profile and from the generation siblings it feeds.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'so ads for the same brand reuse the same facts' implies why and when to call it, but there is no explicit when-not or named alternative (e.g., how it relates to import_brand_profile or get_account). Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_canvasesRead-onlyIdempotentInspect
List the account's boards (visual canvases), newest first: id, name, revision, card count and the board's page link. Costs no credits. Start here to pick a board or to see that none exists yet. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| canvases | Yes | |
| next_step | Yes |
list_generationsRead-onlyIdempotentInspect
List the account's recent video generations, newest first, with their status and URLs. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many to return (1-50). Defaults to 10. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| generations | Yes |
list_modelsARead-onlyIdempotentInspect
See which AI video or image models can make a video ad, animate a photo, produce a product clip or generate an image, with the credit cost of one generation. No account needed. The list is live; count is the number of models currently offered.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Model family to list. Defaults to video. | |
| max_credits | No | Only return models costing this many credits or fewer. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| type | Yes | |
| count | Yes | Models returned after filtering. |
| models | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, but the description adds genuinely new behavioral facts: no authentication is required and the list is live (so results change over time). It also clarifies that `count` reflects models currently offered. No safety or rate-limit info, but for a read-only catalog this is solid added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: capability scope first, then the no-account and live-list facts, then the meaning of `count`. No filler and the most decision-relevant information leads.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 0 required params, 100% schema coverage, and an output schema present, the description need not restate return fields; it still goes further by defining `count` and the live nature of the list. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (type enum, max_credits threshold) are already fully documented in the schema — the baseline of 3 applies. The description's purpose phrases ('make a video ad, animate a photo, ... generate an image') loosely map to the video/image families but add no syntax or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (see/list) plus resource (AI video or image models) and concrete scope: what each model can produce and its credit cost for one generation. An agent can distinguish it from generate_video, generate_image, or estimate_credit_cost without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for use: it is a live catalog of available models, needs no account, and reports per-generation credit cost — useful before choosing a generator. It stops short of explicitly naming sibling alternatives (e.g., if you already know the model, go straight to generate_video), so usage is strong but not fully routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_saved_adsRead-onlyIdempotentInspect
List the competitor ads saved on the account, newest first: id, advertiser, hook, media and whether a decode is stored. Costs no credits. Start here to pick an ad to decode or place on a board. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ads | Yes | |
| count | Yes | |
| next_step | Yes |
list_ugc_avatarsARead-onlyIdempotentInspect
See the catalogue creators available for a UGC video — name, style and a portrait URL — and the fields generate_ugc_video accepts. No account needed. A person's own photo can be used instead, with their consent.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| avatars | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds genuinely non-annotation context — 'No account needed' (auth requirements) and the consent caveat for using a person's own photo — which is exactly the kind of behavioral detail the schema cannot express. No pagination or catalogue-size behavior is mentioned, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that states what the agent gets before the secondary consent note. Efficient with no filler, though the trailing photo/consent clause is slightly tangential to 'list the catalogue'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no further explanation, and the description still volunteers the key fields. Combined with annotations covering safety and a no-parameter schema, the definition is complete enough for correct invocation; only routing alternatives are thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline there is nothing for the description to document. The field mentions (name, style, portrait URL) describe output, not inputs, but do no harm.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (see/list) and resource (catalogue of UGC creators) and enumerates the returned fields (name, style, portrait URL). It also ties itself to the consumer tool generate_ugc_video, which helps separate it from list_models and list_generations. 'See' is a slightly soft verb, keeping it just below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage by naming generate_ugc_video and its accepted fields, so the agent can infer this is the pre-flight lookup for that tool. However, it never states when-not to use it or names alternatives like list_models or generate_avatar explicitly, leaving routing somewhat inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_cardsInspect
Move one or more cards to new positions on a board. The server places new cards itself; this is for the board view's drag. Costs no credits. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| moves | Yes | Cards and their new positions. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| canvas | Yes | |
| next_step | Yes |
refresh_canvasRead-onlyIdempotentInspect
Re-read a board (same answer as get_canvas). Call it every 10 seconds while a generation card is rendering; a finished render sets the card's status to done and its media_url. It opens no new view: a board already on screen refreshes itself. Costs no credits. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| canvas | Yes | |
| next_step | Yes |
rename_canvasInspect
Rename a board. Costs no credits. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The new name, 1-100 characters. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| canvas | Yes | |
| next_step | Yes |
run_generation_cardIdempotentInspect
Render a generation card: its prompt and model become a video or image job whose result lands in the card. Requires a quote_id from estimate_credit_cost for the card's model and kind (quantity 1), taken with the card's duration and resolution when it has them: per-second models are priced from those, and the quote is verified against the card. A card added with from_card_id and no image_url starts from its source card's finished image; until that card is done the run is refused with nothing charged. Credits are charged only on success; a retry with the same quote_id returns the same job. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| card_id | Yes | A generation card with a model and a prompt. | |
| quote_id | Yes | The quote_id from estimate_credit_cost for this card's model and kind, quoted with the card's duration and resolution when it has them. Required. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | Yes | |
| card | Yes | |
| canvas | Yes | |
| next_step | Yes | |
| credits_quoted | Yes | The ceiling fixed by the quote. |
save_competitor_adIdempotentInspect
Keep one ad from search_competitor_ads on the account so it can be decoded and placed on a board. Pass the row exactly as returned. Costs no credits. Saving the same ad twice returns the existing saved ad. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| ad | Yes | One row from search_competitor_ads results[], copied as is. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ad | Yes | |
| next_step | Yes |
search_articlesARead-onlyIdempotentInspect
Search AI Content Drop's published guides and model comparisons about AI video generation, prompting, and ad creative.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results (1-25). Defaults to 10. | |
| query | Yes | Keywords, e.g. 'kling vs sora' or 'ugc hooks'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| query | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile with readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds content scope but no additional behavioral traits such as pagination, rate limits, or result ordering, so it stays at a baseline 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It packs the verb, resource scope, and topic coverage efficiently, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with two fully documented parameters, safety annotations, and an output schema, the description is largely sufficient. It is slightly incomplete in that it doesn't hint at the recommended flow of searching then fetching an article via get_article, but nothing essential to invoking the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: query and limit are both documented with examples and constraints. The description adds no parameter-specific meaning beyond what the schema already provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Search AI Content Drop's published guides and model comparisons' about AI video generation, prompting, and ad creative. It clearly differentiates from generation and listing tools, though it does not explicitly distinguish itself from the closely related get_article sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when discovering published content by keyword, such as 'kling vs sora', but it provides no explicit when-to-use or when-not-to-use guidance. It does not mention alternatives like get_article for retrieving a specific article by ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_competitor_adsARead-onlyIdempotentInspect
Search live competitor ads by keyword on Meta or TikTok: advertiser, copy, hook, call to action, media and run time per ad. Costs no credits. When live data is not available the rows are samples, marked demo: true with a note; never present those as real ads. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | impressions (default) ranks by reach; recent by start date. | |
| limit | No | Rows to return, 1-20; defaults to 10. | |
| keyword | Yes | What to search for: a product, a category or a competitor, 1-200 characters. | |
| platform | No | Defaults to meta. |
Output Schema
| Name | Required | Description |
|---|---|---|
| demo | Yes | True when results are sample rows because live data was not available. |
| note | No | Present only when demo is true: why, and what the rows are. |
| sort | Yes | |
| count | Yes | Rows returned. |
| keyword | Yes | |
| results | Yes | |
| platform | Yes | |
| next_step | Yes | |
| total_found | Yes | Rows the search produced before limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world behavior, so the safety bar is covered; the description goes further by disclosing that fallback rows are synthetic and flagged demo: true, instructing the agent never to present them as real ads, and spelling out the auth path (OAuth or Authorization: Bearer acd_live_ key).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by cost, data-quality caveat, and auth prerequisite in that priority order. Every sentence carries function; the auth URL is long but necessary and appears last.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema coverage, the description need not explain return values, and it covers cost, fallback data semantics, and authentication. The only gap is lack of comparative guidance against sibling ad tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so keyword, platform, sort and limit are already fully documented in the schema; the description's mention of "by keyword on Meta or TikTok" only echoes that. No format or edge-case detail (e.g. keyword syntax caveats) is added beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) plus resource (competitor ads) with explicit scope: live ads by keyword on Meta or TikTok. It even enumerates the per-ad fields returned (advertiser, copy, hook, CTA, media, run time), which separates it cleanly from siblings like search_articles and list_saved_ads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Costs no credits" and the demo-sample caveat imply when this is worth calling, and the sign-in requirement is a clear precondition. However, it names no alternative tool (e.g. save_competitor_ad, list_saved_ads) and gives no explicit when-not-to-use guidance, so routing is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_cardDestructiveInspect
Change a card: merge fields into its data (text or title on a text card; prompt, model, kind, aspect_ratio, duration, resolution or image_url on a generation card; title or caption on a media card; label on a frame), or move and resize it. Costs no credits. status, job_id, job_kind, quote_id, media_url, thumbnail_url, credits_used and error are set by the server when a card runs and are refused here. A per-second model is priced from the card's duration and resolution, so set them before quoting. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Fields to merge into the card's data; fields not named are kept. | |
| width | No | Optional card width in pixels. | |
| height | No | Optional card height in pixels. | |
| card_id | Yes | The card id, from cards[] on the board. | |
| position | No | Optional { x, y } in board pixels. When omitted the server places the card in the first free grid cell. | |
| revision | No | The board revision this change is based on (from the last board you saw). Optional: when omitted the tool reads the current one first. | |
| canvas_id | Yes | The board id, from list_canvases or create_canvas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | Yes | |
| canvas | Yes | |
| next_step | Yes |
write_ad_storyboardARead-onlyIdempotentInspect
Turn an ad brief into a storyboard: 1-5 shots with framing, the spoken line, the caption and the duration of each. Costs no credits. Show it to the person, edit it if needed, then price it with estimate_ad_cost and submit it with generate_ad. SIGN-IN REQUIRED: connect this server with OAuth (the host prompts for it), or add an API key header "Authorization: Bearer acd_live_…" created at https://aicontentdrop.com/settings/integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | The ad brief: brandName, brandOneLiner, valueProps (1-8 strings), cta, intent, format (an id from list_ad_formats), shotCount (1-5), totalDurationSec (5-20), aspect (9:16 | 16:9 | 1:1), language, quality (fast | premium), modelTier (standard | cinematic), garmentImageUrl for the try-on formats. |
Output Schema
| Name | Required | Description |
|---|---|---|
| format | No | |
| next_step | Yes | |
| storyboard | Yes | ad { aspect, totalDurationSec, voiceLanguage } and shots[]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, idempotentHint, destructiveHint=false) already cover the safety profile, and the description is consistent with them by framing this as a free drafting step. It adds genuinely useful context beyond the annotations: 'Costs no credits' and detailed OAuth/API-key auth instructions with a concrete header format and settings URL.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and output shape, then workflow, then auth. Every sentence carries load, though the trailing auth block is dense and could be split for readability. Still efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained; the description instead covers the input artifact, the downstream workflow, and the sign-in prerequisites. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single nested 'brief' object enumerates its fields (brandName, valueProps, shotCount, aspect, etc.) in the schema itself. The description describes the output shape rather than adding input meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (turn an ad brief into a storyboard) and immediately defines the produced artifact: 1-5 shots with framing, spoken line, caption, duration. It also names the sibling tools that follow it in the workflow (estimate_ad_cost, generate_ad), so an agent can place it precisely in the pipeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and sequencing: show the storyboard to the person, edit if needed, then price with estimate_ad_cost and submit with generate_ad. This routes the agent to the correct alternatives and states the ordering constraint rather than leaving it to inference.
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.
24 tool updates
- Changed
ad_to_canvas_card2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
add_frame2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
add_generation_card2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
add_media_card2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
add_text_card2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
arrange_cards2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
connect_cards2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
create_canvas2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
decode_ad2 fields changed- removed
Output schema / properties / decode / properties / decodedAtRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / decode / requiredPrevious value: -[ - "layers", - "recreationPrompt", - "confidence", - "decodedAt" -]New value: +[ + "layers", + "recreationPrompt", + "confidence" +]
- Changed
generate_ad2 fields changed- removed
Output schema / properties / run_idRemoved value: -{ - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / studio_urlAdded value: +{ + "description": "The job's page in the studio on AI Content Drop.", + "type": [ + "string", + "null" + ] +}
- Changed
get_ad_job2 fields changed- removed
Output schema / properties / run_idRemoved value: -{ - "type": "string" -} - added
Output schema / properties / studio_urlAdded value: +{ + "description": "The job's page in the studio on AI Content Drop.", + "type": "string" +}
- Changed
get_canvas2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
get_generation1 field changed- removed
Output schema / properties / created_atRemoved value: -{ - "type": [ - "string", - "null" - ] -}
- Changed
get_saved_ad4 fields changed- removed
Output schema / properties / ad / properties / saved_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / ad / requiredPrevious value: -[ - "id", - "ad_ref", - "platform", - "advertiser_name", - "ad_copy", - "media_url", - "media_type", - "estimated_spend", - "engagement_score", - "running_days", - "hook_text", - "cta_text", - "ad_url", - "demo", - "decoded", - "saved_at" -]New value: +[ + "id", + "ad_ref", + "platform", + "advertiser_name", + "ad_copy", + "media_url", + "media_type", + "estimated_spend", + "engagement_score", + "running_days", + "hook_text", + "cta_text", + "ad_url", + "demo", + "decoded" +] - removed
Output schema / properties / decode / properties / decodedAtRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / decode / requiredPrevious value: -[ - "layers", - "recreationPrompt", - "confidence", - "decodedAt" -]New value: +[ + "layers", + "recreationPrompt", + "confidence" +]
- Changed
group_cards2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
list_canvases2 fields changed- removed
Output schema / properties / canvases / items / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvases / items / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link" +]
- Changed
list_generations1 field changed- removed
Output schema / properties / generations / items / properties / created_atRemoved value: -{ - "type": [ - "string", - "null" - ] -}
- Changed
list_saved_ads2 fields changed- removed
Output schema / properties / ads / items / properties / saved_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / ads / items / requiredPrevious value: -[ - "id", - "ad_ref", - "platform", - "advertiser_name", - "ad_copy", - "media_url", - "media_type", - "estimated_spend", - "engagement_score", - "running_days", - "hook_text", - "cta_text", - "ad_url", - "demo", - "decoded", - "saved_at" -]New value: +[ + "id", + "ad_ref", + "platform", + "advertiser_name", + "ad_copy", + "media_url", + "media_type", + "estimated_spend", + "engagement_score", + "running_days", + "hook_text", + "cta_text", + "ad_url", + "demo", + "decoded" +]
- Changed
move_cards2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
refresh_canvas2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
rename_canvas2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
run_generation_card2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
- Changed
save_competitor_ad2 fields changed- removed
Output schema / properties / ad / properties / saved_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / ad / requiredPrevious value: -[ - "id", - "ad_ref", - "platform", - "advertiser_name", - "ad_copy", - "media_url", - "media_type", - "estimated_spend", - "engagement_score", - "running_days", - "hook_text", - "cta_text", - "ad_url", - "demo", - "decoded", - "saved_at" -]New value: +[ + "id", + "ad_ref", + "platform", + "advertiser_name", + "ad_copy", + "media_url", + "media_type", + "estimated_spend", + "engagement_score", + "running_days", + "hook_text", + "cta_text", + "ad_url", + "demo", + "decoded" +]
- Changed
update_card2 fields changed- removed
Output schema / properties / canvas / properties / updated_atRemoved value: -{ - "type": [ - "string", - "null" - ] -} - changed
Output schema / properties / canvas / requiredPrevious value: -[ - "id", - "name", - "revision", - "card_count", - "updated_at", - "link", - "cards", - "edges" -]New value: +[ + "id", + "name", + "revision", + "card_count", + "link", + "cards", + "edges" +]
2 tool updates
- Changed
generate_video1 field changed- changed
Input schema / properties / image_url / descriptionPrevious value: -"Optional public image URL to animate (image-to-video)."New value: +"Public image URL to animate (image-to-video). Required for models whose list_models entry has needs_start_image; optional for the rest."
- Changed
list_models2 fields changed- changed
Output schema / properties / models / items / properties / credits / descriptionPrevious value: -"Flat cost per generation."New value: +"Cost of one generation at the model's default settings; estimate_credit_cost quotes other lengths." - added
Output schema / properties / models / items / properties / needs_start_imageAdded value: +{ + "description": "True when the model only animates an image: pass image_url to generate_video.", + "type": "boolean" +}
3 tool updates
- Changed
estimate_ad_cost1 field changed- changed
Input schema / properties / brief / descriptionPrevious value: -"The ad brief: brandName, brandOneLiner, valueProps (1-8 strings), cta, intent, format (an id from list_ad_formats), shotCount (2-5), totalDurationSec (6-20), aspect (9:16 | 16:9 | 1:1), language, quality (fast | premium), modelTier (standard | cinematic), garmentImageUrl for the try-on formats."New value: +"The ad brief: brandName, brandOneLiner, valueProps (1-8 strings), cta, intent, format (an id from list_ad_formats), shotCount (1-5), totalDurationSec (5-20), aspect (9:16 | 16:9 | 1:1), language, quality (fast | premium), modelTier (standard | cinematic), garmentImageUrl for the try-on formats."
- Changed
generate_ad1 field changed- changed
Input schema / properties / brief / descriptionPrevious value: -"The ad brief: brandName, brandOneLiner, valueProps (1-8 strings), cta, intent, format (an id from list_ad_formats), shotCount (2-5), totalDurationSec (6-20), aspect (9:16 | 16:9 | 1:1), language, quality (fast | premium), modelTier (standard | cinematic), garmentImageUrl for the try-on formats."New value: +"The ad brief: brandName, brandOneLiner, valueProps (1-8 strings), cta, intent, format (an id from list_ad_formats), shotCount (1-5), totalDurationSec (5-20), aspect (9:16 | 16:9 | 1:1), language, quality (fast | premium), modelTier (standard | cinematic), garmentImageUrl for the try-on formats."
- Changed
write_ad_storyboard1 field changed- changed
Input schema / properties / brief / descriptionPrevious value: -"The ad brief: brandName, brandOneLiner, valueProps (1-8 strings), cta, intent, format (an id from list_ad_formats), shotCount (2-5), totalDurationSec (6-20), aspect (9:16 | 16:9 | 1:1), language, quality (fast | premium), modelTier (standard | cinematic), garmentImageUrl for the try-on formats."New value: +"The ad brief: brandName, brandOneLiner, valueProps (1-8 strings), cta, intent, format (an id from list_ad_formats), shotCount (1-5), totalDurationSec (5-20), aspect (9:16 | 16:9 | 1:1), language, quality (fast | premium), modelTier (standard | cinematic), garmentImageUrl for the try-on formats."
14 tool updates
- Changed
add_frame2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
add_generation_card4 fields changed- added
Input schema / properties / from_card_idAdded value: +{ + "description": "Optional: an image generation card or an image media card on the same board. The new card is connected to it, and its finished image is the new card's start frame when the new card runs (run the source card first).", + "type": "string" +} - added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +} - added
Output schema / properties / edgeAdded value: +{ + "description": "The connection from from_card_id, when one was given.", + "properties": { + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } + }, + "type": [ + "object", + "null" + ] +}
- Changed
add_media_card2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
add_text_card2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
arrange_cards2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Added
connect_cards - Changed
create_canvas2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
get_canvas2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
group_cards2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
move_cards2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
refresh_canvas2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
rename_canvas2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
run_generation_card2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
- Changed
update_card2 fields changed- added
Output schema / properties / canvas / properties / edges / items / descriptionAdded value: +"A connection drawn from one card to the next: { id, source, target, label? }. data.role start_image means the source card's finished image is the target card's start frame." - added
Output schema / properties / canvas / properties / edges / items / propertiesAdded value: +{ + "id": { + "type": "string" + }, + "label": { + "description": "Text drawn on the line, when it has one." + }, + "source": { + "description": "The card the connection starts from.", + "type": "string" + }, + "target": { + "description": "The card it leads to.", + "type": "string" + } +}
2 tool updates
- Changed
estimate_credit_cost2 fields changed- added
Input schema / properties / reference_video_secondsAdded value: +{ + "description": "Length in seconds of the reference video you will pass as reference_video_url (seedance_2_5 up to 30 s, or seedance_2_0_fast up to 15 s at 720p). Reference seconds are billed as input, so they change the price; the server measures the file and refuses a quote whose length does not match.", + "type": "number" +} - added
Output schema / properties / reference_video_secondsAdded value: +{ + "description": "Reference-video seconds priced as input, when a reference was quoted.", + "type": "number" +}
- Changed
generate_video1 field changed- added
Input schema / properties / reference_video_urlAdded value: +{ + "description": "Optional public https URL of a reference video (for example a 3D blockout playblast) whose camera movement, shot rhythm and subject motion the generation must follow. seedance_2_5 (30 s max) or seedance_2_0_fast (15 s max, 720p). The quote must have been priced with reference_video_seconds equal to this clip's length rounded up; the server measures the clip and refuses on mismatch.", + "type": "string" +}
32 tool updates
- Added
ad_to_canvas_card - Added
add_frame - Added
add_generation_card - Added
add_media_card - Added
add_text_card - Added
arrange_cards - Added
create_canvas - Added
decode_ad - Added
estimate_ad_cost - Added
generate_ad - Added
generate_avatar - Added
generate_ugc_video - Added
get_ad_job - Added
get_canvas - Added
get_canvas_link - Added
get_saved_ad - Added
group_cards - Added
import_asset - Added
import_brand_profile - Added
list_ad_formats - Added
list_brand_profiles - Added
list_canvases - Added
list_saved_ads - Added
list_ugc_avatars - Added
move_cards - Added
refresh_canvas - Added
rename_canvas - Added
run_generation_card - Added
save_competitor_ad - Added
search_competitor_ads - Added
update_card - Added
write_ad_storyboard
6 tool updates
- Changed
estimate_credit_cost10 fields changed- added
Input schema / properties / durationAdded value: +{ + "description": "Video length in seconds you intend to generate. Affects the price of per-second models.", + "type": "number" +} - changed
Input schema / properties / quantity / descriptionPrevious value: -"How many generations. Defaults to 1."New value: +"How many generations to price. Defaults to 1. Only a quote for exactly 1 can be spent; larger quantities are for planning." - added
Input schema / properties / resolutionAdded value: +{ + "description": "Video resolution you intend to generate, e.g. \"720p\" or \"1080p\". Affects the price of per-second models.", + "type": "string" +} - added
Output schema / properties / basisAdded value: +{ + "enum": [ + "flat", + "per_second" + ], + "type": "string" +} - added
Output schema / properties / duration_secondsAdded value: +{ + "description": "The duration actually priced, for per-second models.", + "type": "number" +} - added
Output schema / properties / next_stepAdded value: +{ + "type": "string" +} - added
Output schema / properties / quote_expires_atAdded value: +{ + "description": "ISO time after which the quote is refused.", + "type": "string" +} - added
Output schema / properties / quote_idAdded value: +{ + "description": "Signed quote. Pass it to generate_video or generate_image; it fixes the price and makes a retry safe.", + "type": "string" +} - added
Output schema / properties / resolutionAdded value: +{ + "description": "The resolution actually priced, for per-second models.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "model_id", - "name", - "credits_each", - "quantity", - "credits_total", - "type" -]New value: +[ + "model_id", + "name", + "credits_each", + "quantity", + "credits_total", + "type", + "basis", + "quote_id", + "quote_expires_at", + "next_step" +]
- Added
generate_image - Changed
generate_video12 fields changed- changed
Input schema / properties / aspect_ratio / descriptionPrevious value: -"Defaults to 16:9."New value: +"Defaults to 16:9. Use 9:16 for vertical social clips." - changed
Input schema / properties / duration / descriptionPrevious value: -"Length in seconds. Defaults to 5."New value: +"Length in seconds. Must match the quoted duration for per-second models." - changed
Input schema / properties / model / descriptionPrevious value: -"Model ID from list_models, e.g. \"kling_3_0\". Omitted means the platform picks a suitable one."New value: +"Model ID from list_models, e.g. \"kling_3_0\". Must match the quoted model; omitted means the quoted model." - added
Input schema / properties / quote_idAdded value: +{ + "description": "The quote_id from estimate_credit_cost for this exact model, duration and resolution. Required.", + "type": "string" +} - added
Input schema / properties / resolutionAdded value: +{ + "description": "e.g. \"720p\" or \"1080p\". Must match the quoted resolution for per-second models.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "prompt" -]New value: +[ + "prompt", + "quote_id" +] - added
Output schema / properties / credits_quotedAdded value: +{ + "description": "The price fixed by the quote.", + "type": "number" +} - changed
Output schema / properties / credits_used / descriptionPrevious value: -"0 until the render succeeds — billing is post-deduct."New value: +"0 until the render succeeds; billing is post-deduct." - added
Output schema / properties / image_urlAdded value: +{ + "description": "Null until the render finishes.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / kindAdded value: +{ + "enum": [ + "video", + "image" + ], + "type": "string" +} - added
Output schema / properties / replayedAdded value: +{ + "description": "True when this quote_id had already been submitted and the original job was returned.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "id", - "status", - "credits_used", - "next_step" -]New value: +[ + "id", + "kind", + "status", + "credits_quoted", + "credits_used", + "replayed", + "next_step" +]
- Changed
get_account3 fields changed- added
Output schema / properties / can_generateAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / info_urlAdded value: +{ + "description": "Informational page describing plans and entitlement options.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "plan", - "credits_remaining" -]New value: +[ + "plan", + "credits_remaining", + "can_generate", + "info_url" +]
- Changed
get_generation4 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"The id returned by generate_video."New value: +"The id returned by generate_video or generate_image." - added
Input schema / properties / kindAdded value: +{ + "description": "Which job type the id belongs to. Defaults to video.", + "enum": [ + "video", + "image" + ], + "type": "string" +} - added
Output schema / properties / image_urlAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / kindAdded value: +{ + "enum": [ + "video", + "image" + ], + "type": "string" +}
- Changed
list_generations2 fields changed- added
Output schema / properties / generations / items / properties / image_urlAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / generations / items / properties / kindAdded value: +{ + "enum": [ + "video", + "image" + ], + "type": "string" +}
3 tool updates
- Changed
get_account1 field changed- added
Input schema / requiredAdded value: +[]
- Changed
list_generations1 field changed- added
Input schema / requiredAdded value: +[]
- Changed
list_models1 field changed- added
Input schema / requiredAdded value: +[]
8 tool updates
- First observed
estimate_credit_cost - First observed
generate_video - First observed
get_account - First observed
get_article - First observed
get_generation - First observed
list_generations - First observed
list_models - First observed
search_articles
Related MCP Connectors
AI video production, idea to final cut: generate, edit and assemble films, ads and social video.
Create AI images, clips, voice-overs, music and editable storyboard films from your AI assistant.
Create and edit AI videos from chat: plan shots, generate scenes, and export stories and ads.
AI image, video, audio and text tools for creators. Pay per use with credits.
Related MCP Servers
- AlicenseAqualityAmaintenanceMake UGC-style video ads without filming: tell your AI assistant what to say and get a vertical clip of a realistic actor saying it, ready for TikTok, Reels or Shorts. Pick or describe an actor, choose a voice from samples, and see the price before rendering. It also makes faceless videos from a script or a short brief: narration over an opening animated clip and image scenes.14MIT
- AlicenseNot gradedqualityCmaintenanceGenerate and refine AI images/audio/video through natural conversation.408Apache 2.0
- AlicenseBqualityBmaintenanceEnables AI agents to take a raw script all the way to a finished, downloadable short-drama .mp4, covering AI rewrite, character consistency, storyboards, frames, video shots, TTS voiceover, and final cut with quote-before-spend billing from any MCP client.1323,245 npmMIT
- AlicenseAqualityAmaintenanceGenerate video from a prompt, from an image, or from up to thirty reference images, routed across the field of AI video models (Sora, Veo, Kling, Seedance, Hailuo, Wan and more). Quotes the credit cost before spending it and refunds a technical failure automatically.5MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.