Skip to main content
Glama

Create Video

create-video
Destructive

Produces a Canva video from a complete production specification.

Use when a production guide has been selected and its required inputs and assets are available.

Only call after the user has requested or approved this video generation in the current conversation. Before the first generation call in the current conversation, tell the user: "Just a quick heads up - creating a video may use a significant portion or all of your monthly AI limit. Would you like to continue?" Then wait for a new, explicit user reply agreeing to continue. Never reuse approval from another conversation or from memory. For later calls in the same conversation, do not repeat the heads-up, but require the user to request or approve each new video generation.

Refer to it as their "AI limit". Do not provide their remaining AI limit, estimate how much a video will use, or discuss prices, plan names, or upgrades.

Returns a job_id and polling_policy for tracking generation to completion.

Input Schema

NameRequiredDescriptionDefault
user_intentNoMandatory description of what the user is trying to accomplish with this tool call. This should always be provided by LLM clients. Please keep it concise (255 characters or less recommended).
video_titleYesInfer and provide a concise, descriptive video name based on the user's request, for example "Summer sale teaser". Do not require the user to supply an exact title. Plain text: letters, numbers, spaces and ,.'!?&:()-_/#%+@$*;=|~[]’‘“”–—" only. No emoji, rare symbols, backslashes, angle brackets, line breaks or file extension. Max 250 characters.
production_specYesComplete production plan following the selected production guide, including the brief, output settings, visual direction, storyboard, required assets, audio, constraints, and disclosed assumptions. Total serialized UTF-8 size <= 64 KiB.
video_generation_confirmedYesSet to true only when the user has requested or approved this video generation in the current conversation. Before the first generation call in the current conversation, approval must be a new, explicit user reply after this heads-up: "Just a quick heads up - creating a video may use a significant portion or all of your monthly AI limit. Would you like to continue?" Never reuse approval from another conversation or from memory. For later calls in the same conversation, do not repeat the heads-up, but require the user to request or approve each new video generation. For retries after a failed job, do not repeat the AI-limit notice. The user's request to retry counts as approval; never retry automatically.

Output Schema

NameRequiredDescriptionDefault
job_idNoID of the video generation job. Pass it to get-video-generation-status to poll for the result. This value is stable and never changes.
statusYesStatus of the job. pending means it has only just been started, so poll get-video-generation-status with the job_id for progress and the result. failed means no job was created and there is nothing to poll; failure explains why.
failureNoWhy no job was created. Present only when status is 'failed'. There is then no job_id, polling_policy, or continuation_token.
polling_policyNoHow and when to poll next.
continuation_tokenNoOpaque token to pass on the first poll to get-video-generation-status. Always use the most recent token from the last response.
expected_duration_secondsNoEstimated total generation time in seconds, when available.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added
  2. Removed
  3. Added
  4. Removed
  5. Changed1 schema field changed
    • changedOutput schema / properties / polling_policy / properties / instructions / description
      Previous value: -"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay exactly once the quoted sentence. It says this usually takes a few minutes, longer videos can take 20 minutes or more, and Canva Projects is a link to where the video will be when it is done. Continue polling as instructed while polling_policy is present; do not treat the Projects link as evidence that the video is ready."New value: +"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay exactly once the quoted sentence. It says this usually takes a few minutes, longer videos can take up to 20 minutes, and Canva Projects is a link to where the video will be when it is done. Continue polling as instructed while polling_policy is present; do not treat the Projects link as evidence that the video is ready."
  6. Changed1 schema field changed
    • changedInput schema / properties / production_spec / properties / output / properties / resolution / description
      Previous value: -"Output quality. Use 480p only when the user indicates a preference for a draft, quick, or lower quality result. Otherwise use 720p. Never select 480p solely to conserve the user's AI limit."New value: +"Output quality. Use the guide's output_defaults.resolution unless the user indicates a preference: 480p for a draft, quick, or lower quality result, or 720p for a higher quality one. Never select 480p solely to conserve the user's AI limit."
  7. Changed1 schema field changed
    • changedInput schema / properties / production_spec / properties / storyboard / items / properties / dialogue / description
      Previous value: -"Exact words spoken during this beat, or empty string for silence. No paraphrasing or invented factual claims; at most three words per second of the beat."New value: +"Exact words spoken during this beat, or empty string for silence. No paraphrasing or invented factual claims; at most 3 spoken words per second of this shot's end_ms - start_ms (6 words need 2000 ms, 12 words 4000 ms)."
  8. Changed3 schema fields changed
    • changedInput schema / properties / production_spec / properties / output / properties / duration_seconds / description
      Previous value: -"Whole-second duration within the selected engine's limit."New value: +"Whole-second duration within the selected engine's min_duration_seconds and max_duration_seconds."
    • changedInput schema / properties / production_spec / properties / output / properties / resolution / description
      Previous value: -"Seedance production resolution: 720p."New value: +"Output quality. Use 480p only when the user indicates a preference for a draft, quick, or lower quality result. Otherwise use 720p. Never select 480p solely to conserve the user's AI limit."
    • changedInput schema / properties / production_spec / properties / output / properties / resolution / enum
      Previous value: -[
      -  "720p"
      -]New value: +[
      +  "480p",
      +  "720p"
      +]
  9. Changed5 schema fields changed
    • changedInput schema / properties / production_spec / properties / audio / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "No spoken dialogue.",
      -    "properties": {
      -      "ambience": {
      -        "description": "Diegetic sound and specific action-synced effects; use none for silence.",
      -        "maxLength": 350,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "mode": {
      -        "const": "none",
      -        "type": "string"
      -      },
      -      "music": {
      -        "description": "Music mood, instrumentation, tempo and relationship to cuts; use none for no music.",
      -        "maxLength": 350,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "music",
      -      "ambience"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Generated speech with an explicitly directed voice.",
      -    "properties": {
      -      "accent": {
      -        "description": "Requested regional accent or neutral; do not imitate a named real person.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "ambience": {
      -        "description": "Soundscape and action-synced effects; use none for silence.",
      -        "maxLength": 350,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "language": {
      -        "description": "Language of the exact supplied script; never silently translate it.",
      -        "maxLength": 60,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "mode": {
      -        "description": "On-camera requires a presenter reference; voice-over is not visible lip-sync.",
      -        "enum": [
      -          "voice-over",
      -          "on-camera"
      -        ],
      -        "type": "string"
      -      },
      -      "music": {
      -        "description": "Music mood, instrumentation, tempo; keep below speech or use none.",
      -        "maxLength": 350,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "script": {
      -        "description": "Exact approved words, equal to nonempty storyboard dialogue joined with newlines. Allow enough time for natural delivery, using no more than three words per second. Do not invent factual claims.",
      -        "maxLength": 600,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "voice_direction": {
      -        "description": "Vocal age range, texture, pace, energy and pauses, without naming a real person's voice.",
      -        "maxLength": 300,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "script",
      -      "language",
      -      "accent",
      -      "voice_direction",
      -      "music",
      -      "ambience"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "No spoken dialogue.",
      +    "properties": {
      +      "ambience": {
      +        "description": "Diegetic sound and specific action-synced effects; use none for silence.",
      +        "maxLength": 350,
      +        "minLength": 0,
      +        "type": "string"
      +      },
      +      "mode": {
      +        "const": "none",
      +        "type": "string"
      +      },
      +      "music": {
      +        "description": "Music mood, instrumentation, tempo and relationship to cuts; use none for no music.",
      +        "maxLength": 350,
      +        "minLength": 0,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "music",
      +      "ambience"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Generated speech with an explicitly directed voice.",
      +    "properties": {
      +      "accent": {
      +        "description": "Requested regional accent or neutral; do not imitate a named real person.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "ambience": {
      +        "description": "Soundscape and action-synced effects; use none for silence.",
      +        "maxLength": 350,
      +        "minLength": 0,
      +        "type": "string"
      +      },
      +      "language": {
      +        "description": "Language of the storyboard dialogue; never silently translate it.",
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "mode": {
      +        "description": "On-camera requires a presenter reference; voice-over is not visible lip-sync.",
      +        "enum": [
      +          "voice-over",
      +          "on-camera"
      +        ],
      +        "type": "string"
      +      },
      +      "music": {
      +        "description": "Music mood, instrumentation, tempo; keep below speech or use none.",
      +        "maxLength": 350,
      +        "minLength": 0,
      +        "type": "string"
      +      },
      +      "voice_direction": {
      +        "description": "Vocal age range, texture, pace, energy and pauses, without naming a real person's voice.",
      +        "maxLength": 300,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "language",
      +      "accent",
      +      "voice_direction",
      +      "music",
      +      "ambience"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / production_spec / properties / storyboard / items / properties / dialogue / description
      Previous value: -"Exact words spoken during this beat, or empty string for silence. No paraphrasing. Combined shot dialogue must exactly equal audio.script, joined with newlines."New value: +"Exact words spoken during this beat, or empty string for silence. No paraphrasing or invented factual claims; at most three words per second of the beat."
    • changedOutput schema / properties / failure / properties / audience / description
      Previous value: -"Who an AI-credit refusal is addressed to, when Canva knows. 'self' can get more AI usage themselves, 'team_member' must ask an admin, and 'no_offer' has nothing more to buy in Canva. The message is already worded for them."New value: +"Who an AI-limit refusal is addressed to, when Canva knows. 'self' can get more AI usage themselves, 'team_member' must ask an admin, and 'no_offer' has nothing more to buy in Canva. The message is already worded for them."
    • changedOutput schema / properties / failure / properties / code / description
      Previous value: -"Why no job was created. 'quota_exceeded' means the user's Canva AI credits won't cover this video. Tell the user what the message says and do not retry. If credits_remain is true, they still have credits for other Canva AI tools, so do not say they are out of credits. Never give a number of credits or a cost."New value: +"Why no job was created. 'quota_exceeded' means what is left of the user's Canva plan's AI limit won't cover this video. Tell the user what the message says, in its words, and do not retry. If credits_remain is true, some of their AI limit is left for other Canva AI tools, so do not say it is used up. Call it their Canva AI limit, never \"credits\", and never give a number or a cost."
    • changedOutput schema / properties / failure / properties / credits_remain / description
      Previous value: -"Only for 'quota_exceeded'. True when the user still has Canva AI credits for other tools, but they won't cover this video. False when their credits are used up. Absent when Canva can't tell."New value: +"Only for 'quota_exceeded'. True when some of their Canva plan's AI limit is still left, but not enough for this video. False when the monthly limit is used up. Absent when Canva can't tell."
  10. Changed5 schema fields changed
    • addedOutput schema / properties / failure
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Why no job was created. Present only when status is 'failed'. There is then no job_id, polling_policy, or continuation_token.",
      +  "properties": {
      +    "audience": {
      +      "description": "Who an AI-credit refusal is addressed to, when Canva knows. 'self' can get more AI usage themselves, 'team_member' must ask an admin, and 'no_offer' has nothing more to buy in Canva. The message is already worded for them.",
      +      "enum": [
      +        "self",
      +        "team_member",
      +        "no_offer"
      +      ],
      +      "type": "string"
      +    },
      +    "code": {
      +      "description": "Why no job was created. 'quota_exceeded' means the user's Canva AI credits won't cover this video. Tell the user what the message says and do not retry. If credits_remain is true, they still have credits for other Canva AI tools, so do not say they are out of credits. Never give a number of credits or a cost.",
      +      "enum": [
      +        "quota_exceeded"
      +      ],
      +      "type": "string"
      +    },
      +    "credits_remain": {
      +      "description": "Only for 'quota_exceeded'. True when the user still has Canva AI credits for other tools, but they won't cover this video. False when their credits are used up. Absent when Canva can't tell.",
      +      "type": "boolean"
      +    },
      +    "message": {
      +      "description": "Human-readable explanation of the failure, suitable to show the user.",
      +      "type": "string"
      +    },
      +    "resets_at": {
      +      "description": "Only for 'quota_exceeded'. When the Canva plan's monthly AI limit resets, in Unix epoch seconds. Shown on the card. Do not add it to what you tell the user.",
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / properties / status / const
      Removed value: -"pending"
    • changedOutput schema / properties / status / description
      Previous value: -"Status of the job. It has only just been started, so poll get-video-generation-status with the job_id for progress and the result."New value: +"Status of the job. pending means it has only just been started, so poll get-video-generation-status with the job_id for progress and the result. failed means no job was created and there is nothing to poll; failure explains why."
    • addedOutput schema / properties / status / enum
      Added value: +[
      +  "pending",
      +  "failed"
      +]
    • changedOutput schema / required
      Previous value: -[
      -  "job_id",
      -  "status",
      -  "polling_policy",
      -  "continuation_token"
      -]New value: +[
      +  "status"
      +]
  11. Changed1 schema field changed
    • changedOutput schema / properties / polling_policy / properties / instructions / description
      Previous value: -"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay exactly once that video generation can take up to 20 minutes and will appear at the provided Canva Projects link only after generation finishes. Continue polling as instructed while polling_policy is present; do not treat the Projects link as evidence that the video is ready."New value: +"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay exactly once the quoted sentence. It says this usually takes a few minutes, longer videos can take 20 minutes or more, and Canva Projects is a link to where the video will be when it is done. Continue polling as instructed while polling_policy is present; do not treat the Projects link as evidence that the video is ready."
  12. Changed3 schema fields changed
    • changedInput schema / properties / production_spec / description
      Previous value: -"Complete production plan following the selected production guide, including the brief, output settings, visual direction, storyboard, required assets, audio, branding, constraints, and disclosed assumptions. Total serialized UTF-8 size <= 64 KiB."New value: +"Complete production plan following the selected production guide, including the brief, output settings, visual direction, storyboard, required assets, audio, constraints, and disclosed assumptions. Total serialized UTF-8 size <= 64 KiB."
    • removedInput schema / properties / production_spec / properties / branding
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "additionalProperties": false,
      -      "description": "No brand treatment.",
      -      "properties": {
      -        "mode": {
      -          "const": "none",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "mode"
      -      ],
      -      "type": "object"
      -    },
      -    {
      -      "additionalProperties": false,
      -      "description": "Intentional brand treatment.",
      -      "properties": {
      -        "exact_text": {
      -          "description": "Exact end-treatment text, or empty when text_treatment is none. Do not silently shorten.",
      -          "maxLength": 60,
      -          "minLength": 0,
      -          "type": "string"
      -        },
      -        "logo_reference_id": {
      -          "description": "Local ID of a real supplied logo reference; empty if no logo is wanted.",
      -          "maxLength": 40,
      -          "minLength": 0,
      -          "type": "string"
      -        },
      -        "mode": {
      -          "const": "branded",
      -          "type": "string"
      -        },
      -        "name": {
      -          "description": "Exact brand spelling.",
      -          "maxLength": 80,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "palette": {
      -          "description": "Brand colours as hex RGB. Empty if no fixed palette was provided.",
      -          "items": {
      -            "description": "Hex RGB colour.",
      -            "maxLength": 7,
      -            "minLength": 7,
      -            "pattern": "^#[0-9A-Fa-f]{6}$",
      -            "type": "string"
      -          },
      -          "maxItems": 6,
      -          "minItems": 0,
      -          "type": "array"
      -        },
      -        "text_treatment": {
      -          "description": "Only selected-template-supported end treatments; no arbitrary timed overlay graphics.",
      -          "enum": [
      -            "none",
      -            "signoff",
      -            "end_card"
      -          ],
      -          "type": "string"
      -        },
      -        "tone": {
      -          "description": "Brand character expressed through image, edit and sound, not empty adjectives.",
      -          "maxLength": 250,
      -          "minLength": 1,
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "mode",
      -        "name",
      -        "tone",
      -        "palette",
      -        "logo_reference_id",
      -        "text_treatment",
      -        "exact_text"
      -      ],
      -      "type": "object"
      -    }
      -  ],
      -  "description": "Make the absence of branding explicit. Exact logos require supplied authorized assets. Text treatment must be supported by the chosen guide."
      -}
    • changedInput schema / properties / production_spec / required
      Previous value: -[
      -  "schema_version",
      -  "blueprint",
      -  "brief",
      -  "output",
      -  "visual_direction",
      -  "storyboard",
      -  "reference_images",
      -  "audio",
      -  "branding",
      -  "constraints",
      -  "assumptions"
      -]New value: +[
      +  "schema_version",
      +  "blueprint",
      +  "brief",
      +  "output",
      +  "visual_direction",
      +  "storyboard",
      +  "reference_images",
      +  "audio",
      +  "constraints",
      +  "assumptions"
      +]
  13. Changed1 schema field changed
    • changedOutput schema / properties / polling_policy / properties / instructions / description
      Previous value: -"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay the initial generation-time expectation and Canva Projects link to the user, then continue polling as instructed while polling_policy is present."New value: +"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay exactly once that video generation can take up to 20 minutes and will appear at the provided Canva Projects link only after generation finishes. Continue polling as instructed while polling_policy is present; do not treat the Projects link as evidence that the video is ready."
  14. Changed1 schema field changed
    • changedInput schema / properties / video_title / description
      Previous value: -"Always provide a video title from the user's request, e.g. \"Summer sale teaser\". Plain text: letters, numbers, spaces and ,.'!?&:()-_/#%+@$*;=|~[]’‘“”–—\" only. No emoji, rare symbols, backslashes, angle brackets, line breaks or file extension. Max 250 characters. An invalid title is ignored."New value: +"Infer and provide a concise, descriptive video name based on the user's request, for example \"Summer sale teaser\". Do not require the user to supply an exact title. Plain text: letters, numbers, spaces and ,.'!?&:()-_/#%+@$*;=|~[]’‘“”–—\" only. No emoji, rare symbols, backslashes, angle brackets, line breaks or file extension. Max 250 characters."
  15. Changed2 schema fields changed
    • addedInput schema / properties / video_title
      Added value: +{
      +  "description": "Always provide a video title from the user's request, e.g. \"Summer sale teaser\". Plain text: letters, numbers, spaces and ,.'!?&:()-_/#%+@$*;=|~[]’‘“”–—\" only. No emoji, rare symbols, backslashes, angle brackets, line breaks or file extension. Max 250 characters. An invalid title is ignored.",
      +  "maxLength": 250,
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "video_generation_confirmed",
      -  "production_spec"
      -]New value: +[
      +  "video_generation_confirmed",
      +  "production_spec",
      +  "video_title"
      +]
  16. Changed3 schema fields changed
    • addedOutput schema / properties / continuation_token
      Added value: +{
      +  "description": "Opaque token to pass on the first poll to get-video-generation-status. Always use the most recent token from the last response.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / polling_policy / properties / instructions / description
      Previous value: -"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay the initial generation-time expectation and Canva Uploads link to the user, then continue polling as instructed while polling_policy is present."New value: +"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay the initial generation-time expectation and Canva Projects link to the user, then continue polling as instructed while polling_policy is present."
    • changedOutput schema / required
      Previous value: -[
      -  "job_id",
      -  "status",
      -  "polling_policy"
      -]New value: +[
      +  "job_id",
      +  "status",
      +  "polling_policy",
      +  "continuation_token"
      +]
  17. Changed6 schema fields changed
    • changedInput schema / properties / production_spec / description
      Previous value: -"A complete consumer-authored production plan. The consuming assistant must do the directing work, not delegate a vague prompt to another writer. Total serialized UTF-8 size <= 64 KiB."New value: +"Complete production plan following the selected production guide, including the brief, output settings, visual direction, storyboard, required assets, audio, branding, constraints, and disclosed assumptions. Total serialized UTF-8 size <= 64 KiB."
    • changedInput schema / properties / production_spec / properties / audio / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "No spoken dialogue.",
      -    "properties": {
      -      "ambience": {
      -        "description": "Diegetic sound and specific action-synced effects; use none for silence.",
      -        "maxLength": 350,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "mode": {
      -        "const": "none",
      -        "type": "string"
      -      },
      -      "music": {
      -        "description": "Music mood, instrumentation, tempo and relationship to cuts; use none for no music.",
      -        "maxLength": 350,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "music",
      -      "ambience"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Generated speech with an explicitly directed voice.",
      -    "properties": {
      -      "accent": {
      -        "description": "Requested regional accent or neutral; do not imitate a named real person.",
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "ambience": {
      -        "description": "Soundscape and action-synced effects; use none for silence.",
      -        "maxLength": 350,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "language": {
      -        "description": "Language of the exact supplied script; never silently translate it.",
      -        "maxLength": 60,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "mode": {
      -        "description": "On-camera requires a presenter reference; voice-over is not visible lip-sync.",
      -        "enum": [
      -          "voice-over",
      -          "on-camera"
      -        ],
      -        "type": "string"
      -      },
      -      "music": {
      -        "description": "Music mood, instrumentation, tempo; keep below speech or use none.",
      -        "maxLength": 350,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "script": {
      -        "description": "Exact approved words, equal to nonempty storyboard dialogue joined with newline. Fit comfortably in the duration; no invented factual claims.",
      -        "maxLength": 600,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "voice_direction": {
      -        "description": "Vocal age range, texture, pace, energy and pauses, without naming a real person's voice.",
      -        "maxLength": 300,
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "script",
      -      "language",
      -      "accent",
      -      "voice_direction",
      -      "music",
      -      "ambience"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "No spoken dialogue.",
      +    "properties": {
      +      "ambience": {
      +        "description": "Diegetic sound and specific action-synced effects; use none for silence.",
      +        "maxLength": 350,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "mode": {
      +        "const": "none",
      +        "type": "string"
      +      },
      +      "music": {
      +        "description": "Music mood, instrumentation, tempo and relationship to cuts; use none for no music.",
      +        "maxLength": 350,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "music",
      +      "ambience"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Generated speech with an explicitly directed voice.",
      +    "properties": {
      +      "accent": {
      +        "description": "Requested regional accent or neutral; do not imitate a named real person.",
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "ambience": {
      +        "description": "Soundscape and action-synced effects; use none for silence.",
      +        "maxLength": 350,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "language": {
      +        "description": "Language of the exact supplied script; never silently translate it.",
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "mode": {
      +        "description": "On-camera requires a presenter reference; voice-over is not visible lip-sync.",
      +        "enum": [
      +          "voice-over",
      +          "on-camera"
      +        ],
      +        "type": "string"
      +      },
      +      "music": {
      +        "description": "Music mood, instrumentation, tempo; keep below speech or use none.",
      +        "maxLength": 350,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "script": {
      +        "description": "Exact approved words, equal to nonempty storyboard dialogue joined with newlines. Allow enough time for natural delivery, using no more than three words per second. Do not invent factual claims.",
      +        "maxLength": 600,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "voice_direction": {
      +        "description": "Vocal age range, texture, pace, energy and pauses, without naming a real person's voice.",
      +        "maxLength": 300,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "script",
      +      "language",
      +      "accent",
      +      "voice_direction",
      +      "music",
      +      "ambience"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / production_spec / properties / reference_images / items / properties / source / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "A genuine authorized Canva image.",
      -    "properties": {
      -      "asset_id": {
      -        "description": "Real ID returned by get-assets or an upload tool. No placeholders, URLs or paths.",
      -        "maxLength": 50,
      -        "minLength": 1,
      -        "pattern": "^[A-Za-z0-9_-]+$",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "canva_asset",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "asset_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "An intentionally fictional reference to generate before rendering.",
      -    "properties": {
      -      "image_prompt": {
      -        "description": "Production-ready image direction: subject identity, full silhouette, neutral background where appropriate, light, angle, materials and no unintended lettering.",
      -        "maxLength": 1200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "generate",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "image_prompt"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "A genuine authorized Canva image.",
      +    "properties": {
      +      "asset_id": {
      +        "description": "Real Canva asset ID for the user-provided image. If the image was attached in chat, resolve or upload the attachment first and use the returned asset ID. Do not ask the user to provide the same image again, and never invent an asset ID.",
      +        "maxLength": 50,
      +        "minLength": 1,
      +        "pattern": "^[A-Za-z0-9_-]+$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "canva_asset",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "asset_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "An intentionally fictional reference to generate before rendering.",
      +    "properties": {
      +      "image_prompt": {
      +        "description": "Production-ready image direction: subject identity, full silhouette, neutral background where appropriate, light, angle, materials and no unintended lettering.",
      +        "maxLength": 1200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "generate",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "image_prompt"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / video_generation_confirmed
      Added value: +{
      +  "description": "Set to true only when the user has approved this video generation. Before the first generation call in a conversation, approval must follow this heads-up: \"Just a quick heads up - creating a video may use a significant portion or all of your monthly AI limit. Would you like to continue?\" For later calls, do not repeat the heads-up, but require the user to request or approve each new video generation. For retries after a failed job, do not repeat the AI-limit notice. The user's request to retry counts as approval; never retry automatically.",
      +  "type": "boolean"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "production_spec"
      -]New value: +[
      +  "video_generation_confirmed",
      +  "production_spec"
      +]
    • changedOutput schema / properties / polling_policy / properties / instructions / description
      Previous value: -"Instructions on when to poll this job next, in words. They MUST be followed. Relay them to the user while they wait."New value: +"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay the initial generation-time expectation and Canva Uploads link to the user, then continue polling as instructed while polling_policy is present."
  18. Changed3 schema fields changed
    • changedInput schema / properties / production_spec / properties / output / properties / engine / enum
      Previous value: -[
      -  "seedance",
      -  "h3"
      -]New value: +[
      +  "seedance"
      +]
    • changedInput schema / properties / production_spec / properties / output / properties / resolution / description
      Previous value: -"Exact engine-specific value: seedance=720p; h3=768P."New value: +"Seedance production resolution: 720p."
    • changedInput schema / properties / production_spec / properties / output / properties / resolution / enum
      Previous value: -[
      -  "720p",
      -  "768P"
      -]New value: +[
      +  "720p"
      +]
  19. Added

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true and openWorldHint=false; the description adds the materially important behavior that the call consumes a significant portion or all of the user's monthly AI limit, plus a mandatory consent gate and a no-auto-retry rule. It also discloses the return contract (job_id and polling_policy) for tracking generation to completion, which is real operational context beyond the annotations.

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

Conciseness4/5

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

Front-loaded and organized: purpose first, then precondition, then the consent script, then the return value. It loses a point for redundancy — the approval and AI-limit wording is repeated almost verbatim in the video_generation_confirmed schema description, so part of the length duplicates structured data rather than adding to it.

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

Completeness5/5

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

For a high-cost, destructive, deeply nested generation tool, the description covers cost, consent, retry policy, prerequisite guide selection, and the async tracking handle. With an output schema present, return-value detail is not required, and nothing an agent needs before calling is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the nested production_spec schema documents every field in depth, so the description does not need to explain parameters. It adds only the high-level notion that the spec must be "complete" and follow the selected guide; baseline 3 is appropriate when the schema carries this much weight.

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

Purpose5/5

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

The first sentence gives a specific verb and resource ("Produces a Canva video") and scopes the input ("from a complete production specification"). The second sentence adds the precondition that a production guide has already been selected, which cleanly separates this from generate-design, generate-image, and generate-design-candidate in the sibling list.

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

Usage Guidelines5/5

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

It states explicitly when to call (guide selected, inputs and assets available) and when not to (no approval in the current conversation, no reused approval from memory or another conversation). The retry case is also handled — a user retry counts as approval and the AI-limit notice is not repeated — so all the routing decisions an agent faces are covered.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources