Canva
Server Details
The Canva MCP server connects AI assistants (like Claude, ChatGPT, and Cursor) to Canva's API, enabling them to create and manage designs directly within chat conversations. Key capabilities include generating new designs from prompts, autofilling templates, searching and resizing existing designs, importing files from URLs, exporting designs as PDFs or images, and managing folders and comments without switching between tools.
- Status
- Healthy
- Uptime
- 73.9% over 62 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 52 tools
The descriptions work hard to steer callers, but several tools genuinely overlap: create-design vs create-design-from-candidate vs generate-design, and get-create-design-async-job vs get-design-candidates, plus get-design-thumbnail vs get-design-thumbnails. The presence of multiple 'LEGACY-ONLY — DO NOT CALL' tools that duplicate active functionality forces the agent to reason about availability state rather than distinct purpose.
Nearly all 52 tools follow a predictable verb_noun snake_case convention (create-design, get-design-content, list-folder-items, move-item-to-folder, reply-to-comment). The lone outlier 'help' is still readable and idiomatic. The pattern is very stable across the whole set.
52 tools is heavy even for a broad platform. The count is inflated by legacy duplicates (create-design-from-candidate, generate-design, get-design-candidates) and internal-only tools (track-event-lifecycle, get-design-thumbnails), which add surface area without adding capability.
Coverage is broad: generation, editing transactions, autofill, brand kits/templates, folders, comments, uploads, export, video, and image tools are all present. Minor gaps exist around destructive lifecycle operations (no standalone delete-design or delete-folder), but core workflows are well covered.
Available Tools
52 toolsautofill-designAutofill DesignADestructiveInspect
Merge structured text, image, video, or chart values into named autofill fields to populate a Canva design, either as a new design or by overwriting an existing one in place. Use to merge a dataset or spreadsheet; place supplied names, details, or media into template placeholders; populate an existing design; or refill a design whose merged content is out of date.
Only use after you have identified a Brand Template or existing Canva design and confirmed it has fillable data fields. Only overwrite an existing design in place when the user has asked to refill that design rather than create a new one, since the overwrite replaces its content and cannot be undone. Not for creating a blank Brand Template copy.
Requires exactly one source and data that matches its field schema. Returns the populated design's design_id.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Values to merge into the source's autofill fields. Each key must exactly match a field name in the selected source's schema, and each value must use that field's expected type. | |
| title | No | Title for the new populated design. Omit to keep the source title. Ignored when `update_in_place` is true, since the design keeps its own title. | |
| design_id | No | ID of the existing Canva design to autofill, and the design overwritten when `update_in_place` is true. Only provide this after confirming the design has fillable data fields. Provide this or `brand_template_id`, not both. | |
| user_intent | No | Mandatory 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). | |
| update_in_place | No | Overwrite `design_id`'s existing content with the merged values instead of creating a new design. Defaults to false. Only valid alongside `design_id`, and only available to some accounts; where it is unavailable the call fails and a new design has to be created instead. | |
| brand_template_id | No | ID of the Brand Template to autofill. Only provide this after confirming the template has fillable data fields. Provide this or `design_id`, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds substantive context beyond them: the overwrite 'replaces its content and cannot be undone,' update_in_place is only available to some accounts and fails elsewhere, and exactly one source is required. This meaningfully enriches the safety and availability profile the annotations only gesture at.
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, then usage, prerequisites, and return value in three tight paragraphs. Every sentence carries weight, though the dense multi-clause sentences are slightly heavy for the size of the operation.
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 mutation tool with nested objects and no output schema, the description covers prerequisites, source exclusivity, destructive in-place behavior, account limitations, and the return value (design_id). 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 description coverage is 100%, so the schema already documents each parameter, giving a baseline of 3. The description adds a genuine cross-parameter constraint ('Requires exactly one source') and data/schema-match requirement that the per-parameter schema text does not express, lifting it above 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?
States a specific verb+resource: merge structured text/image/video/chart values into named autofill fields to populate a Canva design. It clearly distinguishes itself from siblings like create-design, create-design-from-brand-template, and copy-design by framing the operation as field-based merge rather than design creation.
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 enumerates when to use (merge a dataset/spreadsheet, place placeholders, populate an existing design, refill stale content), states the prerequisite (identify a Brand Template or design and confirm fillable fields), and gives a when-not-to-use exclusion ('Not for creating a blank Brand Template copy') plus the condition governing the in-place overwrite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel-editing-transactionDiscard Design EditsADestructiveInspect
Undo or discard all unsaved changes in an active Canva editing transaction.
Use to cancel a set of in-progress edits or finish editing without saving.
The unsaved changes will be permanently lost, and the transaction_id can no longer be used. Returns confirmation that the changes were discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| user_intent | No | Mandatory 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). | |
| transaction_id | Yes | Exact ID of the active editing transaction whose changes to discard. Use the transaction_id returned when that editing transaction was started. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the destructiveHint annotation by stating that unsaved changes are permanently lost and the transaction_id can no longer be used. It also mentions the return behavior ('confirmation that the changes were discarded'), which is useful since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the core action, and every sentence adds relevant information. There is no filler or repetition beyond what is needed for clarity.
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 cancellation tool with a destructive annotation, the description covers what happens, the side effect on transaction_id, and the confirmation return. With no output schema, a bit more detail about the confirmation response could be useful, but the current description is sufficient for an agent to invoke the tool safely.
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 schema already explains transaction_id and user_intent. The description adds only minor context by calling the transaction 'active' and noting the ID comes from the start operation, but it does not materially improve parameter understanding 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?
The description clearly states the action ('Undo or discard all unsaved changes') and the specific resource ('active Canva editing transaction'). It also signals the opposite of saving, which differentiates it from the sibling commit-editing-transaction without needing to open that tool.
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 explicitly says when to use the tool: 'cancel a set of in-progress edits or finish editing without saving.' It does not name the commit sibling as the alternative for saving, but the context is clear enough for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comment-on-designAdd Comment To DesignAInspect
Leave a new comment on an existing Canva design as a note to self or for collaborators to read.
Use to give feedback, ask a question about a design, flag an issue, or add context for people working on it. The comment is visible to everyone who has access to the design.
Returns the created comment and its comment_id.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | ID of the existing Canva design to comment on. Design IDs start with "D". | |
| user_intent | No | Mandatory 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). | |
| message_plaintext | Yes | The text content of the comment to add. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint=false and destructiveHint=false. The description adds that the comment is visible to all design collaborators and that the call returns the created comment and comment_id, which is important side-effect and outcome information. It could mention permission requirements, but this is adequate.
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 compact and front-loaded with the core action, followed by use cases, visibility, and return value. Every sentence adds useful information without redundancy.
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 create tool with no output schema, the description covers main use cases, visibility, and return shape. A small gap is the absence of explicit guidance to use reply-to-comment when the user is responding to an existing comment, and it doesn't resolve the user_intent 'mandatory' wording in the schema.
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 all three parameters have their own descriptions, so the tool description doesn't need to elaborate on them. It adds no new parameter semantics beyond implying the comment body is message_plaintext; 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 opens with a specific verb and resource: 'Leave a new comment on an existing Canva design.' It also clarifies scope by saying 'new comment' and 'visible to everyone who has access,' which distinguishes this top-level comment action from sibling tools like reply-to-comment.
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 explicitly lists when to use the tool: giving feedback, asking a question, flagging an issue, or adding context for collaborators. It doesn't mention exclusions or direct the agent to reply-to-comment for responses to existing comments, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commit-editing-transactionSave Design EditsADestructiveInspect
Make all draft changes in an active Canva editing transaction permanent.
Use to save a completed set of edits, including text, layout, or media updates.
Show the user a preview of the design and obtain their explicit approval before calling this tool.
Saving applies all draft changes to the design, closes the editing transaction, and makes its transaction_id invalid. Returns confirmation that the changes were saved.
| Name | Required | Description | Default |
|---|---|---|---|
| user_intent | No | Mandatory 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). | |
| transaction_id | Yes | Exact ID of the active editing transaction whose draft changes should be saved. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint: true, so the description adds value by disclosing the concrete consequences: 'apply all draft changes to the design, closes the editing transaction, and makes its transaction_id invalid.' It also mentions return behavior ('Returns confirmation'). This goes beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose, use case, approval requirement, and operational effect. Front-loaded with the main action. No redundancy 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 destructive mutation with two well-documented parameters and no output schema, this description covers purpose, usage gating, behavioral consequences, and return confirmation. It could mention error scenarios (e.g., already-closed transaction) but that is a minor omission given the clarity provided.
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% with clear descriptions for both parameters: transaction_id is 'Exact ID of the active editing transaction' and user_intent is described. The description adds no new parameter-specific details beyond restating that the transaction is active and that the id becomes invalid—context already implied by the schema's phrasing. 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?
States a specific verb ('make permanent'), resource ('all draft changes in an active Canva editing transaction'), and scope ('text, layout, or media updates'). Clearly distinguishes from sibling cancel-editing-transaction by describing the permanent save action and from start-editing-transaction by implying an existing transaction.
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 when to use it ('to save a completed set of edits') and provides a mandatory precondition: 'Show the user a preview of the design and obtain their explicit approval before calling this tool.' This gives the agent clear decision and action guidance, including a human-in-the-loop step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy-designCopy DesignAInspect
Duplicate an existing Canva design, or copy selected pages from it, into a new design.
Use to make a separate working copy, create an independent cloned, forked, or backup version, or preserve the original before making changes. For a single source design only. Not for combining pages from more than one design.
Creates a new design. The source design remains unchanged. Returns the new design's design_id.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | ID of the existing Canva design to copy. | |
| user_intent | No | Mandatory 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). | |
| page_numbers | No | Pages to include in the new design, numbered from 1. For example, use [1, 3, 5] to copy pages 1, 3, and 5. Omit to copy every page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false with no hints about effects, so the description carries the burden. It clearly states that the tool creates a new design, leaves the source unchanged, and returns the new design_id. This meaningfully explains the behavioral outcome beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: the core action is in the first line, usage scenarios follow, and the key side-effect/result is stated last. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with a fully documented schema and no output schema, the description covers what the tool does, when to use it, what it creates, the source immutability, and the returned design_id. Nothing essential is missing 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 design_id and page_numbers thoroughly. The description adds a small hint by mentioning 'copy selected pages', but does not go beyond the schema's explicit parameter documentation.
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 ('Duplicate') and resource ('existing Canva design'), and explains the page-selection variation. It distinguishes itself from siblings by explicitly stating it is not for combining pages from more than one design, setting it apart from merge-designs.
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 explicitly lists when to use the tool: making a separate working copy, cloning, forking, backing up, or preserving the original. It also gives clear exclusion criteria: single source design only and not for combining pages from multiple designs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-brand-template-draftCreate Brand Template DraftAInspect
Creates an editable draft design from a brand template. If a draft already exists for this brand template, the existing draft is returned. Use this tool to get a design that can be edited and later published back as the updated brand template.
For tagging workflows (Autofill setup):
Call this tool to create an editable draft from a brand template.
Use
start-editing-transactionwith the returned design ID to open an editing session and inspect design elements.Use
perform-editing-operationsto tag elements withautofill_field_label(e.g. "email", "logo").Use
commit-editing-transactionto save the tagging changes.Use
publish-brand-templateto publish the tagged design as the updated brand template.
| Name | Required | Description | Default |
|---|---|---|---|
| user_intent | No | Mandatory 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). | |
| brand_template_id | Yes | The ID of the brand template to create a draft from. Use `search-brand-templates` to find available brand templates and their IDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the mutation profile is covered. The description adds genuinely useful non-obvious behavior: idempotency (an existing draft is returned rather than a new one created) and the draft's editability/publiability. No auth or rate-limit context, but the key behavioral trait is disclosed.
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 core purpose and idempotency constraint are front-loaded in the first two sentences, and the numbered workflow is scannable. The workflow list is somewhat long but each step carries distinct routing value, so little is wasted.
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 no output schema, the description compensates by telling the agent that a design ID is returned and consumed by start-editing-transaction. Annotations cover the safety profile, so the combination is nearly complete; only the relationship to create-design-from-brand-template is unaddressed.
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 both parameters are documented in the schema (brand_template_id even points to search-brand-templates). The description adds no additional semantics for brand_template_id or user_intent, 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 (creates an editable draft design from a brand template) and adds the key behavioral distinction that the draft can be edited and published back. It does not explicitly contrast itself with the similarly-named sibling create-design-from-brand-template, so sibling differentiation is left to inference.
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 states when to use it ('to get a design that can be edited and later published back') and provides a full ordered workflow naming the alternative tools (start-editing-transaction, perform-editing-operations, commit-editing-transaction, publish-brand-template) for the Autofill/tagging case. Nothing is left to guesswork.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-designCreate Design with AIAInspect
Generate a new Canva design from a written brief, with any supplied content folded in.
Use to turn a brief, presentation outline, or draft copy into a presentation, doc, sheet, website, poster, flyer, social post, resume, or another text-and-image layout; or to make a first design for a new project.
Do not use this tool for an on-brand request: it cannot apply a brand kit or base a design on a brand template. When the user asks for their brand kit, their brand colours, fonts or logo, or a brand template to base the design on, use the legacy generation tools instead — prepare-design-generation where it is listed, otherwise generate-design or generate-design-structured.
Use this tool only when the requested output itself is an editable Canva page or layout, such as "create an infographic". Do not use it when the user explicitly asks for an image, picture, photo, illustration, artwork, sticker, icon, graphic, or 2d vector; use generate-image instead. Explicit image wording takes priority over design-like content within the image, including text, statistics, labels, callouts, or an infographic-like composition. For example, "create an image about coffee with bold stat callouts" uses generate-image, as does "create an image of an infographic". Do not choose this tool merely because the request uses the words "create" or "design".
Creates a newly generated design rather than editing one that already exists. Not for videos or whiteboards.
Returns a job_id and continuation_token for the generation job. When this tool's UI widget is shown, the widget polls get-create-design-async-job itself and displays the design when ready - do not poll it yourself. Only when no widget is shown, poll get-create-design-async-job with both, waiting the number of seconds each response's polling_policy.wait_seconds gives before the next call, until the job completes, then share the design link with the user.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | What to create, in the user's own words. State the subject, the purpose, and any wording, tone, colours, or brand the user asked for. | |
| format | No | Named Canva format the design is made in, e.g. "Instagram Post", "Presentation", "Flyer (Landscape A4)". Include the orientation whenever the format has one, because a name without it cannot be resolved to an exact size and the design comes out square. Omit it - usually the better choice - to have the format chosen from the brief. | |
| outline | No | Outline for a presentation, when you have one the user has approved or supplied. Only valid when the design is a presentation. Omit to let Canva structure the presentation from the brief. | |
| user_intent | No | Mandatory 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| job_id | No | ID of the design generation job. Pass it to get-create-design-async-job to poll for the result. This value is stable and never changes. |
| status | Yes | Status of the newly created job. 'pending' means the job was created - poll get-create-design-async-job with the job_id and continuation_token for completion, failure, and print details. 'failed' means no job was created and there is nothing to poll; the failure explains why. |
| failure | No | Why no job was created. Only present when status is 'failed', in which case there is no job_id or continuation_token to poll with. |
| polling_policy | No | How and when to poll next. |
| continuation_token | No | Opaque token to pass on the first poll to get-create-design-async-job. Always use the most recent token from the last response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, destructive=false, openWorld=true; the description adds substantial context beyond them — that it creates rather than edits, that it returns job_id and continuation_token, and the exact polling protocol including who polls (widget vs. caller) and the wait_seconds cadence.
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?
Long but front-loaded: the core purpose and the image-vs-design disambiguation come first, followed by routing and polling detail. A few clauses restate the same routing rule (image wording priority is illustrated with two near-identical examples), which trims it below a 5.
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?
Complete for a high-complexity generation tool with nested parameters and an output schema: it covers scope, exclusions, sibling routing, and the async job lifecycle an agent must drive, despite the output schema already existing.
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 brief, format, outline, and user_intent are already fully documented in the schema, including the format-orientation caveat. The description only gestures at this with 'with any supplied content folded in', so it adds no meaning beyond the structured fields — 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?
Opens with a specific verb+resource ('Generate a new Canva design from a written brief') and immediately enumerates the output types it produces, then differentiates itself from generate-image, the brand-template tools, and legacy generation tools by name.
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 explicit when-to-use ('turn a brief, presentation outline, or draft copy into ...'), explicit when-not (on-brand requests, image/vector wording, editing existing designs, videos/whiteboards), and names the alternative tool for each exclusion, including fallback ordering ('prepare-design-generation where it is listed, otherwise generate-design or generate-design-structured').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-design-from-brand-templateCreate Design from Brand TemplateAInspect
Create a new Canva design from a brand template. Optionally select specific pages to include. If the user has already provided a brand template ID (a string starting with "BTM"), call this tool directly with that ID — do NOT call search-brand-templates first. Only use search-brand-templates when no ID has been provided and you need to discover one. If you need to fill template fields with custom data, use the autofill-design tool instead.
| Name | Required | Description | Default |
|---|---|---|---|
| user_intent | No | Mandatory 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). | |
| page_numbers | No | Optional 1-based page numbers to include from the brand template. Omit to use all pages. | |
| brand_template_id | Yes | The ID of the brand template to create a design from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating operation (readOnlyHint=false, destructiveHint=false), so the description doesn't need to restate that. The description adds useful context about page selection and the direct-call behavior, but it doesn't disclose what happens if the template ID is invalid, whether the design is created in a specific folder, or what the response contains. With annotations covering the basic safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core action is stated first, followed by the optional behavior, then the routing guidance. Every sentence earns its place, and the guidance is actionable without being verbose.
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 creation tool with no output schema, the description covers the main decision points: when to call directly, when to search, and when to use autofill. It doesn't describe the return value or error cases, but the routing guidance and parameter semantics are strong enough that an agent can invoke the tool correctly in most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 three parameters. The description adds context for `page_numbers` (optional, 1-based, omit for all pages) and `brand_template_id` (direct-call behavior), but it doesn't add meaning beyond what the schema already provides. Baseline 3 is correct.
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 ('Create') and resource ('a new Canva design from a brand template'), and explicitly distinguishes itself from the sibling `search-brand-templates` and `autofill-design`. It also clarifies the optional page selection behavior, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: call directly when a brand template ID is already known, do NOT call `search-brand-templates` first, and use `autofill-design` instead when custom data needs to be filled. This is strong routing guidance that leaves little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-design-from-candidateCreate Design From CandidateAInspect
LEGACY-ONLY — DO NOT CALL WHEN create-design IS AVAILABLE. If create-design is in the tool list, you MUST NOT call this tool. Call create-design instead. BRAND EXCEPTION: create-design cannot apply a brand kit or base a design on a brand template. When the user asks for an on-brand design — their brand kit, their brand colours, fonts or logo, or a brand template to base the design on — call this tool instead of create-design. All instructions below apply when create-design is absent from the tool list, and whenever the request is an on-brand one. A failed create-design call does not make it unavailable.
Create a new Canva design from a generation job candidate ID. This converts an AI-generated design candidate into an editable Canva design. If successful, returns a design summary containing a design ID that can be used with the editing_transaction_tools. To make changes to the design, first call this tool with the candidate_id from generate-design results, then use the returned design_id with start-editing-transaction and subsequent editing tools.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ID of the design generation job that created the candidate design. This is returned in the generate-design response. | |
| user_intent | No | Mandatory 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). | |
| candidate_id | Yes | ID of the candidate design to convert into an editable Canva design. This is returned in the generate-design response for each design candidate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation profile is covered. The description adds context beyond annotations: the create-then-edit sequential workflow (call this first, then use returned design_id with start-editing-transaction and editing tools), and the requirement to obtain candidate_id from generate-design results. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every block earns its place given the complex routing requirements. The 'LEGACY-ONLY' warning and brand exception are front-loaded before the core workflow. Slight redundancy exists (the DO NOT CALL constraint is stated twice), and the routing block could be tightened, but the structure is effective and information-dense rather than padded.
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 in a 33-sibling ecosystem with no output schema, the description handles the return value itself ('design summary containing a design ID') and the cross-tool sequencing with generate-design and start-editing-transaction. One minor gap: the routing condition references create-design, which is not actually present in this tool list — the conditional is somewhat hypothetical here, though the description does gracefully state it applies 'when create-design is absent from the tool list.'
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 adds value beyond the schema by explaining the provenance of both job_id and candidate_id ('returned in the generate-design response') and the ordering requirement linking them to the generate-design pipeline. This ties each parameter to its upstream source, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Create a new Canva design from a generation job candidate ID' — and clarifies the mechanism: 'converts an AI-generated design candidate into an editable Canva design.' This distinguishes it from generate-design (which produces candidates) and create-design-from-brand-template (brand-templated variants), so an agent can separate it from siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Exceptionally explicit routing: it names the preferred alternative (create-design), forbids calling this tool when that alternative is present, and carves out a precise brand exception ('brand kit, brand colours, fonts or logo, brand template'). It also notes that a failed create-design call does not make this tool available. This is textbook when-to-use vs when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-folderCreate FolderAInspect
Create a Canva folder to organise related work.
Use to set up a project folder, add a subfolder within an existing folder, or keep designs, images, and folders together. Returns the new folder, including its folder_id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the new Canva folder. | |
| user_intent | No | Mandatory 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). | |
| parent_folder_id | Yes | ID of the Canva folder that will contain the new folder. Use "root" to create the folder at the top level. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-destructive mutation. The description adds useful behavioral context by stating that it returns the new folder including its folder_id. It does not discuss permissions or edge cases, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core action. The use-case sentence adds value, though 'keep designs, images, and folders together' slightly overlaps with 'organise related work'. Overall, every sentence earns its place.
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 create operation, the description covers purpose, use cases, and the return value. Since there is no output schema, mentioning the returned folder_id is helpful. The 'root' special value for parent_folder_id is already covered in the schema.
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 parameters are already well documented. The description does not add significant parameter-level meaning beyond what the schema provides, which makes the baseline score of 3 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: 'Create a Canva folder'. It clearly states the purpose ('organise related work') and is distinct from sibling tools like search-folders, list-folder-items, and move-item-to-folder.
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 provides clear context for when to use the tool: setting up a project folder, adding a subfolder, or keeping related items together. It does not explicitly name alternatives or exclusions, but the use cases are specific enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-upload-urlCreate upload URLAInspect
Uploads a file (image, video, audio, PDF, or other document) into Canva. Use when the user wants to add, upload, import, or send a file they have — a chat attachment, a local file, or generated content — to Canva, or wants to use such a file in a design, presentation, or their Canva library. Step 1: call this tool to get a single-use upload_url. Step 2: send the raw file bytes as the body of one HTTP POST to that URL with the header "Content-Type: application/octet-stream" — raw bytes only, no multipart form, no base64, no JSON wrapper. The POST response contains resource IDs for the uploaded file: pass them to other Canva tools to reference the file. Each URL allows exactly one upload and expires after a short period; if the URL has been used, has expired, or the upload was rejected, call this tool again for a fresh URL — never retry a used or expired URL. Only for files whose bytes you can access; for a file already at a public URL, prefer a URL-import tool if one is available.
| Name | Required | Description | Default |
|---|---|---|---|
| user_intent | No | Mandatory 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| uploadUrl | Yes | time-limited URL to upload the file to: send a single HTTP POST with the raw file bytes as the request body and a content-type header of application/octet-stream — no multipart form, no base64, no JSON wrapper. Valid for exactly one upload |
| httpMethod | Yes | HTTP method for the upload request; always 'POST' |
| resultNote | Yes | reminder of what the upload response contains and how to use it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses non-obvious behavior well beyond annotations: URL is single-use, expires after a short period, must be consumed with a raw octet-stream POST, must not be retried, and returns resource IDs. This is exactly the kind of operational detail an agent needs and annotations 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?
Well-structured and front-loaded, with a clear purpose statement followed by Step 1/Step 2 instructions. The first sentence is somewhat long with enumerations, but every part contributes useful guidance for correct invocation.
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?
Covers the full workflow: call this tool, POST raw bytes, handle the response, retry policy, and exclusion of public-URL files. The presence of an output schema means return-value details need not be spelled out, and the description still mentions resource IDs returned by the POST.
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 only parameter, user_intent, is fully documented in the schema with 100% coverage, so the description does not need to repeat it. The description adds context about the broader workflow, but not parameter-level meaning 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 concrete action: creating a single-use upload URL for files whose bytes the user can access, then uploading those bytes to Canva. It clearly distinguishes itself from URL-import alternatives, which are for files already at a public URL.
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 says when to use this tool ('when the user wants to add, upload, import, or send a file they have') and when not to ('for a file already at a public URL, prefer a URL-import tool'). It also provides retry guidance, which is essential for correct use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-videoCreate VideoAInspect
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 approved this video generation. Before the first generation call in a 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?" Wait for their explicit agreement. For later calls, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| user_intent | No | Mandatory 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_title | Yes | 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. | |
| production_spec | Yes | 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. | |
| video_generation_confirmed | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job_id | Yes | ID of the video generation job. Pass it to get-video-generation-status to poll for the result. This value is stable and never changes. |
| status | Yes | 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. |
| polling_policy | Yes | How and when to poll next. |
| continuation_token | Yes | Opaque token to pass on the first poll to get-video-generation-status. Always use the most recent token from the last response. |
| expected_duration_seconds | No | Estimated total generation time in seconds, when available. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (not read-only, openWorld, non-destructive), and the description adds substantial behavior beyond that: the AI-limit consumption heads-up, the per-call approval requirement, forbidden topics (remaining limit, estimates, prices, upgrades), and the returned job_id/polling_policy. This is unusually 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 purpose, then usage, then user-facing policy, then return values. It is longer than typical but each block earns its place against the tool's complexity; some wording is duplicated in the confirmation parameter description, a minor redundancy.
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 high-complexity creation tool with a deep nested schema, existing annotations, and an output schema, the description covers the preconditions (guide selected, assets ready), the approval gate, and the async follow-up, which is everything an agent needs to call it correctly.
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 schema already documents every field exhaustively (production_spec, video_title, video_generation_confirmed). The description adds no syntax or semantic 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 ("Produces a Canva video") and names the input artifact ("a complete production specification"). The precondition "when a production guide has been selected" implicitly separates it from siblings like generate-design and generate-image, but no sibling is named directly, so differentiation is contextual rather than explicit.
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 concrete when-to-use condition ("a production guide has been selected and its required inputs and assets are available") and a hard when-not gate ("Only call after the user has approved"). It spells out the exact approval and disclosure flow, including the first-call vs later-call distinction, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export-designExport DesignARead-onlyInspect
Export an existing Canva design as a downloadable file to save and use outside Canva.
Use when a selected design needs to be printed, attached to an email, sent or shared as a file outside Canva, converted to another file type, or downloaded as selected pages.
Only call after you have confirmed that the selected design supports the requested format. Returns a download URL for the exported file.
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | Export settings for the downloadable file. | |
| design_id | Yes | ID of the existing Canva design to export. Design IDs start with "D". | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real behavioral value beyond that: it states the format-support prerequisite and discloses the return value (a download URL), which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler: purpose first, usage triggers second, prerequisite and return value last. The trigger list is longer than one clause but every item is a distinct, useful signal, so nothing is wasted.
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?
There is no output schema, and the description compensates by stating it returns a download URL. With a fully-documented nested parameter schema and annotations covering safety, an agent has everything needed to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents design_id, format, and the nested export settings including size, pages, width/height, and quality. The description mentions 'selected pages' and 'another file type' but adds no syntax or format 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 (export) and resource (an existing Canva design) plus the outcome (a downloadable file to use outside Canva). It is clearly the export/output tool in a sibling set that otherwise covers editing, listing, and format discovery, so an agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Enumerates concrete when-to-use triggers (printing, email attachments, sharing as a file, format conversion, selected pages) and adds a prerequisite: confirm the design supports the requested format first. It stops short of explicitly naming get-export-formats as the alternative/discovery tool, so the routing hint is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate-designGenerate Design with AIARead-onlyInspect
LEGACY-ONLY — DO NOT CALL WHEN create-design IS AVAILABLE. If create-design is in the tool list, you MUST NOT call this tool. Call create-design instead. BRAND EXCEPTION: create-design cannot apply a brand kit or base a design on a brand template. When the user asks for an on-brand design — their brand kit, their brand colours, fonts or logo, or a brand template to base the design on — call this tool instead of create-design. All instructions below apply when create-design is absent from the tool list, and whenever the request is an on-brand one. A failed create-design call does not make it unavailable.
Generate professionally designed content in Canva including visual designs (posters, social media posts, presentations, flyers) and text-based documents (memos, articles, newsletters, proposals, reports, business plans, requirements documents).
Each extra slide adds significant latency (e.g. 15 slides can take 3x longer than 5). Keep to 1-5 slides unless the user explicitly requests more.
Use this tool when the user asks you to write, create, generate, or draft ANY document or visual design. Examples:
- "Write a memo..." → use this tool to create a Canva Doc
- "Generate a business proposal..." → use this tool to create a Canva Doc
- "Draft a product overview..." → use this tool to create a Canva Doc
DO NOT use this tool for fixed-format visual designs when prepare-design-generation is available.
Do NOT use this tool when the user just wants advice, explanations, or information.
DO NOT use this tool when the user's message contains a URL and their intent is to create a design FROM that URL — use import-design-from-url instead.
Use the 'query' parameter to tell AI what you want to create.
The tool doesn't have context of previous requests. ALWAYS include details from previous queries for each iteration.
The tool provides best results with detailed context. ALWAYS look up the chat history and provide as much context as possible in the 'query' parameter.
Ask for more details when the tool returns this error message 'Common queries will not be generated'.
The generated designs are design candidates for users to select from.
Ask for a preferred design and use 'create-design-from-candidate' tool to add the design to users' account.
The IDs in the URLs are not design IDs. Do not use them to get design or design content.
When using the 'asset_ids' parameter, assets are inserted in the order provided. For small designs with few image slots, only supply the images the user wants. For multi-page designs like presentations, supply images in the order of the slides.
The tool will return a list of generated design candidates, including a candidate ID, preview thumbnail and url.
Before editing, exporting, or resizing a generated design, follow these steps:
1. call 'create-design-from-candidate' tool with 'job_id' and 'candidate_id' of the selected design
2. call other tools with 'design_id' in the response
For presentations, target 1-5 slides by default (length: "short"). Format the query string with these sections in order (use the headers exactly):
1. **Presentation Brief**
Include:
* **Title** (working title for the deck)
* **Topic / Scope** (1–2 lines; include definitions if terms are uncommon)
* **Key Messages** (3–5 crisp takeaways)
* **Constraints & Assumptions** (timebox, brand, data limits, languages, etc.)
* **Style Guide** (tone, color palette, typography hints, imagery style)
2. **Narrative Arc**
A one-paragraph outline of the story flow (e.g., Hook → Problem → Insight → Solution → Proof → Plan → CTA). Keep transitions explicit.
3. **Slide Plan**
Provide numbered slides with **EXACT titles** and detailed content. For each slide, include all of the following subsections in this order (use the labels exactly):
* **Slide {N} — "{Exact Title}"**
* **Goal:** one sentence describing the purpose of the slide.
* **Bullets (3–6):** short, parallel phrasing; facts, examples, or specifics (avoid vague verbs).
* **Visuals:** explicit recommendation (e.g., "Clustered bar chart of X by Y (2022–2025)", "Swimlane diagram", "2×2 matrix", "Full-bleed photo of <subject>").
* **Data/Inputs:** concrete values, sources, or placeholders to be filled (if unknown, propose realistic ranges or example figures).
* **Speaker Notes (2–4 sentences):** narrative details, definitions, and transitions.
* **Asset Hint (optional):** reference to an asset by descriptive name or index if assets exist (e.g., "Use Asset #3: 'logo_dark.svg' as corner mark").
* **Transition:** one sentence that logically leads into the next slide.
> Ensure the Slide Plan forms a **cohesive story** (each slide's Goal and Transition should support the Narrative Arc).
**Quality checklist (the model must self-check before finalizing)**
* Titles are unique, concise (≤ 65 characters), and action-or insight-oriented.
* Each slide has 3–6 bullets; no paragraph walls; numbers are specific where possible.
* Visuals are concrete (chart/diagram names + variables/timeframes); tables are used only when necessary.
* Terminology is defined once and used consistently; acronyms expanded on first use.
* Transitions form an intelligible narrative; the story arc is obvious from titles alone.
* No placeholders like "[TBD]" or "[insert]". If data is unknown, propose realistic figures and label as "example values".
* All required headers and subsections are present, in the exact order above.| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Query describing the design to generate. Ask for more details to avoid errors like 'Common queries will not be generated'. When 'verbatim' is true, this must be the exact markdown text the user wants in the document (do not summarize or reformat it). | |
| length | No | Presentation length. Only provide this for presentations when the user explicitly requests a specific length. "short" = 1-5 slides, "balanced" = 5-15 slides, "comprehensive" = 15+ slides. If omitted, defaults to "short". | |
| verbatim | No | Set this to true whenever the user supplies their own text/markdown and wants it placed into a Canva Doc exactly as written — i.e. they say "verbatim", "as-is", "word for word", "exactly as written", or "don't rewrite/summarize/reword/change it". When true, the query is rendered into the document with NO AI rewriting, so pass the user's literal markdown in "query" (do not summarize or reformat it). Only honoured for design_type "doc"; ignored for any other design type (normal AI-assisted generation is used instead). Supports #/## headings, paragraphs, **bold**, *italics*, and bullet/numbered lists; tables, links, code blocks, and images are not supported. | |
| asset_ids | No | Optional list of asset IDs to insert into the generated design. Assets are inserted in order, so provide them in the intended sequence. For presentations, order should match slide sequence. | |
| design_type | Yes | The design type to generate. Options and their descriptions: - 'business_card': A [business card](https://www.canva.com/create/business-cards/); professional contact information card. - 'card': A [card](https://www.canva.com/create/cards/); for various occasions like birthdays, holidays, or thank you notes. - 'desktop_wallpaper': A desktop wallpaper; background image for computer screens. - 'doc': A [Canva Doc](https://www.canva.com/docs/); Modern, collaborative documents for business communications and written content. Use this for: memos, articles, technical articles, newsletters, requirements documents (product requirements, business requirements), agendas, strategic plans, go-to-market plans, business proposals, solution proposals, event proposals, company announcements, product overviews, summaries, and other text-heavy professional documents. Canva Docs are web-first with dynamic layouts optimized for online collaboration and interactive content. NOT for: Visual proposal templates with graphics (use 'proposal'), data-heavy reports with charts (use 'report'), traditional fixed-layout templates (use 'document'). - 'document': A [document](https://www.canva.com/create/documents/); traditional page-based document template with fixed layouts. For most business writing, use "doc" instead. - 'email': An [email](https://www.canva.com/emails/); use this for designing email newsletters, promotional emails, and marketing campaigns intended to be sent to recipients. - 'facebook_cover': A [Facebook cover](https://www.canva.com/create/facebook-covers/); banner image for your Facebook profile or page. - 'facebook_post': A Facebook post; ideal for sharing content on Facebook. - 'flyer': A [flyer](https://www.canva.com/create/flyers/); single-page promotional material. - 'infographic': An [infographic](https://www.canva.com/create/infographics/); for visualizing data and information. - 'instagram_post': An [Instagram post](https://www.canva.com/create/instagram-posts/); perfect for sharing content on Instagram. Generated at 1080x1350px (portrait, 4:5 ratio). - 'invitation': An invitation; for events, parties, or special occasions. - 'logo': A [logo](https://www.canva.com/create/logos/); for creating brand identity. - 'phone_wallpaper': A phone wallpaper; background image for mobile devices. - 'photo_collage': A [photo collage](https://www.canva.com/create/photo-collages/); for combining multiple photos into one design. - 'pinterest_pin': A Pinterest pin; vertical image optimized for Pinterest. - 'postcard': A [postcard](https://www.canva.com/create/postcards/); for sending greeting cards through the mail. - 'poster': A [poster](https://www.canva.com/create/posters/); large format print for events or decoration. - 'presentation': A [presentation](https://www.canva.com/presentations/); lets you create and collaborate for presenting to an audience. - 'proposal': A [proposal](https://www.canva.com/create/proposals/); visually-designed business proposal template with graphics and structured layouts. For text-focused proposals, use "doc" instead. - 'report': A [report](https://www.canva.com/create/reports/); visually-designed report template with charts, graphics, and data visualization. For text-focused reports, use "doc" instead. - 'resume': A [resume](https://www.canva.com/create/resumes/); professional document for job applications. - 'twitter_post': A Twitter post; optimized for sharing on Twitter/X. - 'your_story': A Story; vertical format for Instagram and Facebook Stories. - 'youtube_banner': A [YouTube banner](https://www.canva.com/create/youtube-banners/); channel header image for YouTube - 'youtube_thumbnail': A [YouTube thumbnail](https://www.canva.com/create/youtube-thumbnails/); eye-catching image for video previews. | |
| user_intent | No | Mandatory 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). | |
| brand_kit_id | No | ID of the brand kit to base the generated design on. IMPORTANT: Before calling this tool, ALWAYS ask the user if they want to create an on-brand design. If they say yes, use the list-brand-kits tool to show available brand kits and let the user select one. Only call this tool after the user has confirmed their brand kit selection. If the user prefers not to use a brand kit, proceed without this parameter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), yet the description adds substantial non-obvious behavior: latency scaling with slide count, that the tool has no memory of prior requests, that output is design candidates not persisted designs, that URL IDs are not design IDs, and that 'Common queries will not be generated' is a detail-seeking signal. This is rich context well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical routing constraint (LEGACY-ONLY, brand exception) is correctly front-loaded, but the definition balloons into a full slide-plan authoring template and self-check checklist that dwarfs the actual tool contract. Much of that guidance is prompt engineering rather than tool selection help, diluting the signal.
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 7-parameter, no-output-schema generation tool, the description covers inputs, return shape (candidate id, thumbnail, url), the required follow-up sequence (create-design-from-candidate then design_id-based tools), and failure signals. Nothing an agent needs to invoke and chain 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 meaningful semantics: query must carry prior context and detailed instructions, asset_ids insertion order maps to slide order, extra slides cost latency, and brand_kit_id requires an explicit user confirmation flow via list-brand-kits. These add value beyond the already-complete 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 and resource: 'Generate professionally designed content in Canva including visual designs... and text-based documents.' It goes further by naming the exact sibling it competes with (create-design) and the conditions that select each, so an agent can distinguish 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?
Explicit when-to-use ('write, create, generate, or draft ANY document or visual design'), when-not (advice/explanation only, URL import via import-design-from-url, fixed-format designs via prepare-design-generation), and named alternatives (create-design, import-design-from-url, create-design-from-candidate). The brand-kit exception and legacy-override rules are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate-imageGenerate ImageAInspect
Generate a standalone image from a text prompt, or edit/restyle images supplied as references.
When to use: Use this tool based on the requested output, not assumed model limitations such as an inability to render text.
If the user explicitly asks for an image, picture, photo, illustration, artwork, sticker, icon, graphic, or 2d vector, use this tool. The explicitly named output takes priority over design-like content within it, including text, statistics, labels, callouts, or an infographic-like composition. For example, "create an image about coffee with bold stat callouts" uses generate-image.
Use create-design when the requested output itself is an editable Canva page or layout, such as "create an infographic". "Create an image of an infographic" still uses generate-image. The verb "create" or "design" alone does not make the request a Canva design.
When not to use: Do not use when the requested output itself is a designed page or layout, such as an infographic, poster, wallpaper, flyer, presentation, or social media post; use create-design. To add, position, resize, or replace content inside an existing design, use the design-editing workflow instead; the image is source media and the design page is the edit target.
Image references and attachments: For image-to-image generation or editing, add one MEDIA entry to imageReferences for every reference image. Pass the ID of an existing Canva MEDIA content reference directly.
Before using a user-provided attachment as a reference, upload it to Canva: call create-upload-url, then send the attachment's raw bytes to the returned upload URL exactly as instructed. Each upload URL is single-use, so call create-upload-url separately for every attachment. Wait for every upload to succeed, then use the mediaId from each upload response as a separate MEDIA entry in imageReferences. For example, after uploading two attachments (replace the illustrative IDs with their returned mediaIds):
{
"prompt": "Restyle both reference images as watercolor illustrations",
"imageReferences": [
{"type": "MEDIA", "id": "MAAAAAAAAAAA"},
{"type": "MEDIA", "id": "MBBBBBBBBBBB"}
]
}Use exactly one imageReferences entry per successfully uploaded attachment. Never combine multiple media IDs into one string or object, and never put an upload URL in imageReferences. Do not pass assistant-hosted attachment URLs directly to this tool. If any attachment cannot be uploaded, do not silently omit it; explain the failure to the user.
Omit imageReferences for pure text-to-image generation.
Result: This call returns only a jobId, not the finished image. When this tool's UI widget is shown, the widget polls get-generate-image-job itself and displays the image when ready - do not poll it yourself. Only when no widget is shown, pass the jobId to get-generate-image-job and keep checking until the job succeeds or fails.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | Text prompt describing the image to generate | |
| aspectRatio | No | Desired output aspect ratio, applied on a best-effort basis. When editing a previously generated image, reuse the exact `aspectRatio` enum value used to generate that image if that value is present in prior conversation or tool-call context, unless the user explicitly requests a different ratio. If the prior enum value is unavailable, omit this argument. For a new image without an explicit ratio, omit this argument. Do not retry solely if the returned image does not exactly match the requested ratio. When provided, `aspectRatio` must be exactly one of the enum values listed below. Translate the user's request into the matching enum value; for example, for `1:1`, send `SQUARE_1_1`. Never send a raw ratio such as `1:1` or a descriptive word such as `square`. If the user provides both an explicit numeric ratio and conflicting descriptive wording, use the numeric ratio to choose the enum value. - `SQUARE_1_1`: Use for "square" or "1:1". - `LANDSCAPE_16_9`: Use for "landscape", "wide", "widescreen", or "16:9". - `LANDSCAPE_5_4`: Use for an explicit "5:4". - `LANDSCAPE_4_3`: Use for an explicit "4:3". - `LANDSCAPE_3_2`: Use for an explicit "3:2". - `LANDSCAPE_2_1`: Use for an explicit "2:1", "panoramic", or "ultra-wide". - `PORTRAIT_9_16`: Use for "portrait", "tall", "vertical", or "9:16". - `PORTRAIT_4_5`: Use for an explicit "4:5". - `PORTRAIT_3_4`: Use for an explicit "3:4". - `PORTRAIT_2_3`: Use for an explicit "2:3". - `PORTRAIT_1_2`: Use for an explicit "1:2". | |
| user_intent | No | Mandatory 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). | |
| imageReferences | No | Optional source images to guide generation, such as for image editing. Each must be a MEDIA content reference. For a GeneratedImageResult, reference its media_id, never its design_id or applied_page_id. Omit for pure text-to-image generation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | Yes | Identifies the job this call started. Pass it to the companion poll tool to check on the job. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, openWorld=true, idempotent=false), and the description adds substantial context beyond them: it returns only a jobId, the widget polls get-generate-image-job so the agent should not poll itself, upload URLs are single-use, and attachments must be uploaded first. This is a rare case of 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?
It is long, but well front-loaded with bolded section headers (When to use / When not to use / Image references / Result) and every section carries non-redundant instructions. It is appropriately sized for a tool with a multi-step upload-and-poll workflow, though some prose could be tightened.
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?
Given the high complexity and the existence of an output schema, the description still supplies the missing operational context: the async jobId flow, widget-driven polling behavior, and the upload prerequisite. Nothing an agent needs to call and follow up correctly is absent.
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 goes further on imageReferences: one MEDIA entry per successfully uploaded attachment, never combine IDs, never pass an upload URL, omit entirely for text-to-image. This is workflow semantics the schema cannot express, though much still lives in the schema's own aspectRatio documentation.
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 opening sentence states a specific verb and resource ('Generate a standalone image from a text prompt, or edit/restyle images supplied as references') and explicitly distinguishes the tool from the sibling create-design, including the edge case 'Create an image of an infographic' vs 'create an infographic'. An agent can select it 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?
It provides explicit when-to-use and when-not-to-use sections, names the alternative tool (create-design) with the precise condition that selects it, and clarifies that the verb 'create'/'design' alone does not route to create-design. Nearly every selection ambiguity is pre-resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-assetsGet Assets MetadataARead-onlyInspect
Get names, tags, types, creation dates, and thumbnails for images and videos in a Canva design.
Use when you need to check which image or video is the target on a page, look up its details, or preview it before changing it.
Not for design metadata or editing the media itself.
Returns the metadata and thumbnail for each item in the same order as the supplied asset_ids.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_ids | Yes | IDs of the images or videos to inspect. When checking which media is the target on a page, include every image and video ID from that page. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it guarantees 'Returns the metadata and thumbnail for each item in the same order as the supplied asset_ids,' which informs the caller about output ordering. This is a meaningful behavioral trait not implied by the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet comprehensive. It opens with the core purpose, then the usage context, then exclusions, and finally the return behavior. Each sentence earns its place without redundancy, 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?
Without an output schema, the description must delineate the return value. It states the tool returns metadata and thumbnails and preserves input order, which covers essentials. While it does not enumerate each metadata field in the response structure (e.g., exact JSON shape), it lists the fields in the opening sentence. Given the tool's read-only nature and the schema's thorough parameter descriptions, it is sufficiently 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%, and the schema already provides detailed descriptions for both parameters. 'asset_ids' includes guidance on usage ('When checking which media is the target on a page, include every image and video ID from that page'), and 'user_intent' is clearly mandatory. The description adds little beyond the schema, so a baseline score of 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 explicitly states the resource (images and videos in a Canva design) and the exact fields returned (names, tags, types, creation dates, thumbnails). It also differentiates from siblings by stating it is 'Not for design metadata or editing the media itself,' making it distinct from get-design-content and perform-editing-operations.
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 provides clear usage context: 'Use when you need to check which image or video is the target on a page, look up its details, or preview it before changing it.' It also gives exclusions: 'Not for design metadata or editing the media itself.' However, it does not explicitly name alternative tool names (e.g., get-design-content or perform-editing-operations), so the guidance is strong but not fully explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-brand-template-datasetGet Brand Template DatasetARead-onlyInspect
Determine whether a Canva Brand Template has fillable data fields and, if so, list their names and types. A Brand Template is a reusable, on-brand layout.
Use to check if the template can be populated with data, whether a reusable template can be autofilled, or see the fields available in a selected Brand Template. Not for an individual existing design.
Requires a brand_template_id. Returns each field's name and data type. An empty object means the Brand Template cannot be autofilled.
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes | ID of the brand template to get the dataset schema for | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint and destructiveHint, so the description correctly avoids repetition. It adds value by disclosing return behavior ('Returns each field's name and data type') and the edge case ('An empty object means...'). It also states the requirement for a brand_template_id, though the param name mismatch with schema is a minor flaw.
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 into three short paragraphs: purpose, usage, and return details. It is front-loaded with the core action and avoids excessive fluff, though the second paragraph could be merged with the first for tighter structure.
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 read-only tool with one required param, the description covers the return format and the empty-object case. It also clarifies scope ('Not for an individual existing design'). The only notable gap is the param name inconsistency ('brand_template_id' vs 'template_id'), which could confuse an agent.
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 fully documents both parameters. The description adds no additional parameter-level meaning beyond restating that 'brand_template_id' is required, which actually conflicts with the schema's 'template_id' naming. This does not improve on schema coverage.
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's purpose with a specific verb ('Determine... list') and resource ('Brand Template'). It explicitly differentiates from sibling tools by noting 'Not for an individual existing design,' which sets it apart from get-design and similar tools.
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 provides clear usage scenarios ('Use to check if the template can be populated with data...') and an exclusion ('Not for an individual existing design'). It does not name a specific alternative sibling, but the guidance is sufficient to route the agent appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-create-design-async-jobGet Create Design JobARead-onlyInspect
Gets the status and result of a design generation job started by create-design. Pass the job_id and continuation_token from the previous create-design or get-async-job response. While the job is still running, wait the number of seconds the response's polling_policy.wait_seconds gives, then poll again with the same job_id and the updated continuation_token. Never poll sooner than that: it returns the same answer and the design arrives no earlier. Follow the polling_policy.instructions in every response, and relay them to the user while they wait. When the job completes, share the design link with them.
When the completed response carries design.print.is_printable as true, and you are replying in text alone — no UI surface of your own rendering the design — then alongside the design link tell the user they can also order this design as a physical print with Canva Print and share design.print.print_url. Otherwise say nothing about printing: when print is absent or is_printable is false, there is nothing to do and nothing to relay. Never tell the user a design cannot be printed.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id returned by create-design. This value is stable and never changes. | |
| user_intent | No | Mandatory 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). | |
| continuation_token | Yes | The continuation_token from the most recent create-design or get-create-design-async-job response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| design | No | The generated design. Only present when the job completed. |
| job_id | Yes | ID of the design generation job. Stable across all responses. |
| status | Yes | Status of the job. While 'pending' or 'in_progress', poll again with the same job_id and the updated continuation_token after waiting polling_policy.wait_seconds. 'completed' carries the design; 'failed' carries the failure. 'polled_too_early' means you called before the wait window elapsed — wait polling_policy.wait_seconds, then poll again with the same job_id and continuation_token. |
| failure | No | Why the job failed. Only present when status is 'failed'. |
| polling_policy | No | How and when to poll next. Only present while the job is still running or when polled too early. |
| continuation_token | No | Opaque token to pass on the next poll. Present while the job is still running or when polled too early. Always use the most recent token. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish it is a safe read. The description goes well beyond that: it discloses the polling cadence contract, the requirement to relay polling_policy.instructions to the user, and precise conditional rules for exposing print.is_printable/print_url versus staying silent. This is rich, non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core polling purpose in the first sentence and keeps sentences purposeful. The print conditional block is dense and long but each clause carries actionable logic, so it earns its space despite the overall length.
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 explained, and the description instead supplies the missing operational contract: polling intervals, instruction relaying, and the exact print-eligibility branch. Nothing an agent needs to poll and report correctly is absent.
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 baseline is 3. The description adds meaning by clarifying that continuation_token must be the updated value from the most recent response and that job_id is stable, which is useful sequencing context the schema alone does not convey.
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 ('Gets the status and result of a design generation job') and names the originating sibling, create-design. An agent can distinguish this polling tool from create-design or other get-* jobs without opening a 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?
Explicitly defines the call sequence: pass job_id and continuation_token from the previous create-design/get-async-job response, wait polling_policy.wait_seconds, then re-poll with the updated token. It also states a negative rule ('Never poll sooner') and routes print behavior conditionally, so the when/when-not is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-designGet Design InformationARead-onlyInspect
Look up the record for one existing Canva design, including what type of design it is (such as doc, presentation, whiteboard, sheet), its title, owner, edit and view links, thumbnail, created and updated times, and page count.
Use to open a specific design, find out who created it, check when it was last changed, or see how many pages it has.
Not for folders or image assets. Do not use for reading or summarizing a design's text or for per-slide thumbnails. Returns the design's metadata and access links.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | ID of the existing Canva design, usually returned by a previous Canva tool. Also accepts a full Canva design share URL, including any collaboration token. Do not extract the ID from a share URL. Does not accept a Canva shortlink; resolve it to its full URL first. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds useful behavioral context: it returns metadata and access links only, does not summarize content, and does not provide per-slide thumbnails. This goes beyond the annotations by clarifying the scope of what the tool can and cannot do, while remaining consistent with the read-only nature.
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 well-organized and front-loaded: it starts with what is returned, then gives usage scenarios, then explicit exclusions. It is slightly verbose in repeating the metadata list and final 'Returns metadata' line, but every sentence earns its place and the structure aids comprehension.
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 no output schema, the description compensates by enumerating the returned fields (type, title, owner, links, thumbnail, timestamps, page count) and explicitly stating limitations. It lacks details on error conditions or permission requirements, but for a read-only lookup tool with rich annotations and sibling context, this is adequate.
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%, with the schema already providing detailed semantics for design_id (including URL acceptance and shortlink caveat) and user_intent. The description adds minimal parameter-level meaning beyond 'one existing Canva design,' so the baseline of 3 is appropriate since the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Look up the record for one existing Canva design') and explicitly enumerates the metadata returned: design type, title, owner, links, thumbnail, timestamps, page count. It also distinguishes itself from siblings by explicitly stating it is not for folders, image assets, text content, or per-slide thumbnails, which clearly separates it from get-design-content, get-design-pages, and get-design-thumbnail.
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 gives clear use cases ('open a specific design, find out who created it, check when it was last changed, or see how many pages it has') and explicit exclusions ('Not for folders or image assets. Do not use for reading or summarizing a design's text or for per-slide thumbnails'). It does not name the specific sibling tools to use instead, but the guidance is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-design-candidatesGet Design CandidatesARead-onlyInspect
LEGACY-ONLY — DO NOT CALL WHEN create-design IS AVAILABLE. If create-design is in the tool list, you MUST NOT call this tool. Call get-create-design-async-job instead. BRAND EXCEPTION: an on-brand design — one using the user's brand kit, their brand colours, fonts or logo, or a brand template — is generated by the legacy tools rather than create-design. Poll that job with this tool. All instructions below apply when create-design is absent from the tool list, and whenever the request is an on-brand one. A failed create-design call does not make it unavailable.
Internal tool for widget UI polling.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job ID returned from generate-design | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, closed-world. The description adds legacy gating, brand exception, and internal-only status, which are valuable behavioral constraints beyond annotations. It does not detail return format or polling behavior, but with annotations covering safety this is strong.
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 critical warning is front-loaded, but the description repeats the create-design availability rule and ends with the actual purpose ('Internal tool for widget UI polling') rather than leading with it. 'All instructions below' is inaccurate since only one sentence follows. Adequate but could be tighter.
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?
Given the routing complexity, the description covers when to use, when not to use, the brand exception, and the failed-call caveat. It lacks return-value detail, but for a polling tool with no output schema the routing completeness is the priority, and it largely delivers.
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 are fully documented in the schema. The description adds no parameter meaning beyond 'Poll that job' and does not mention user_intent. Baseline 3 is correct when the schema does the heavy lifting.
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 it is a legacy-only internal polling tool and distinguishes from create-design and get-create-design-async-job. However the core resource is never named: it does not say it retrieves design candidates or what a 'design candidate' is, so the agent must infer from the tool name.
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-not: do not call when create-design is available; call get-create-design-async-job instead. Gives the brand exception and clarifies that a failed create-design call does not make it unavailable. Very strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-design-contentGet Design Text ContentARead-onlyInspect
Extract rich text from an existing Canva design for read-only use.
Use to read the wording in a design, pull copy from selected pages, summarize a presentation or document, or quote text without making changes.
Not for rewriting, translating, correcting, or updating the text in a design. Does not return presenter notes, sheet cell data, or non-text design content. Returns the rich text content for every page, or specified pages of the selected design.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | Optional array of page numbers to get content from. If not specified, content from all pages will be returned. Pages are indexed using one-based numbering, so the first page in a design has the index value `1`. | |
| design_id | Yes | ID of the existing Canva design whose rich text you want to retrieve, usually returned by a previous Canva tool. You can also provide a full Canva design share URL exactly as received; this preserves any collaboration token needed for access. Resolve Canva shortlinks before using this field. | |
| user_intent | No | Mandatory 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). | |
| content_types | Yes | Types of content to retrieve. Currently, only `richtexts` is supported so use the `start-editing-transaction` tool to get other content types |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with "for read-only use" and "without making changes." It adds behavioral exclusions beyond annotations: it does not return presenter notes, sheet cell data, or non-text content, and it returns content per page or specified pages.
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 compact and front-loaded with the core action, followed by use cases and exclusions. There is minor repetition of the read-only idea ("read-only use" and "without making changes"), but every sentence contributes useful guidance.
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?
Given the tool's moderate complexity bugschema richness, the description covers purpose, scope, exceptions, and return scope. There is no output schema, but the description states that rich text for every page or specified pages is returned. No critical call-blocking information 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%, so the schema already documents design_id, pages, content_types, and user_intent in detail. The description adds no new parameter-specific meaning, but none is needed because the schema carries the burden completely.
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 starts with a specific verb and resource: "Extract rich text from an existing Canva design for read-only use." It clearly distinguishes this from editing tools and from related retrieval tools by explicitly excluding presenter notes and non-text content, so an agent can tell it apart from siblings like get-presenter-notes and perform-editing-operations.
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 gives a clear "Use to" list (read wording, pull copy, summarize, quote) and a clear "Not for" list (rewriting, translating, correcting, updating). It does not explicitly name alternative sibling tools in the description text, but the when/when-not guidance is strong enough to steer an agent away from misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-design-datasetGet Design DatasetARead-onlyInspect
Verify whether a selected existing Canva design has fillable data fields and, if so, list their names and types.
Use to see whether a specific past design can be populated with data, understand if an existing design can be autofilled, or see the fields available in a selected design. Not for a reusable Brand Template.
Requires a design_id. Returns each field's name and data type. An empty object means the design cannot be autofilled.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | ID of the selected existing Canva design whose data fields you want to retrieve. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=false, so the safety profile is handled. The description adds genuine behavioral context beyond that: it returns each field's name and data type, and an empty object signals the design cannot be autofilled. That return-shape disclosure is valuable and not in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior, then usage, then exclusion, then requirements and return shape. Every sentence carries information, though the three near-synonymous use-case phrases are slightly redundant.
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?
Despite having no output schema, the description fully specifies the return value (field names and types) and the critical edge case (empty object = not autofillable), which is the main thing an agent needs to interpret the result. Nothing essential is missing for a 2-param read tool.
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 (including user_intent) are already documented in the schema. The description only restates 'Requires a design_id' without adding format or constraint detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (verify/list) and resource (fillable data fields of a selected existing Canva design), and explicitly distinguishes itself from the sibling get-brand-template-dataset with 'Not for a reusable Brand Template.' An agent can tell exactly what this returns.
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 three concrete use cases ('see whether a specific past design can be populated,' 'understand if an existing design can be autofilled,' 'see the fields available') plus an explicit exclusion for Brand Templates. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-design-pagesGet Design PagesARead-onlyInspect
List the pages in an existing Canva design, including each page's index and individual thumbnail.
Use to browse a design's pages or slides, see each page thumbnail in order, show what a specific page looks like, or get a range of page previews. Do not use to retrieve a thumbnail that reflects uncommitted changes in an active editing transaction.
Requires a design with individual pages; Canva Docs do not have pages. Returns only the requested pages, without the design's total page count.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of pages to return, from 1 to 100. Use with "offset" to retrieve the next range of pages. | |
| offset | No | Page number to start from. Use for pagination; for example, use 21 to start at page 21. | |
| design_id | Yes | ID of the existing Canva design, usually returned by a previous Canva tool. You can also provide a full Canva design share URL, including its collaboration token. Resolve Canva shortlinks before using this field. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and non-destructive, and the description adds valuable behavioral context beyond that: thumbnails do not reflect uncommitted editing-transaction changes, only the requested pages are returned, and the total page count is not included. This sets accurate expectations without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, followed by use cases, exclusions, and return limitations. Every sentence earns its place, and there is no redundant restating of the tool name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation with no output schema, the description sufficiently explains what the agent will get (page index and thumbnail), what it will not get (total page count), and when it is not appropriate. Combined with fully documented parameters and annotations, the agent has enough context to call it correctly.
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 parameters are already well documented; the description adds little parameter-specific detail beyond the notion of ranges and requested pages. Per the baseline for full schema coverage, a 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 opens with a specific verb and resource: 'List the pages in an existing Canva design' and specifies the returned content (page index and thumbnail). It clearly distinguishes itself from sibling get-design-thumbnail by focusing on per-page previews, and it narrows applicability with 'Canva Docs do not have pages.'
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 provides explicit use cases ('browse a design's pages or slides, see each page thumbnail in order, show what a specific page looks like, or get a range of page previews') and explicit exclusions ('Do not use to retrieve a thumbnail that reflects uncommitted changes...' and 'Canva Docs do not have pages'). This tells an agent when to choose the tool and when to avoid it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-design-thumbnailGet Design Page ThumbnailARead-onlyInspect
Get the thumbnail for a particular page of the design in the specified editing transaction. This tool needs to be used with the start-editing-transaction tool to obtain an editing transaction ID. You need to provide the transaction ID and a page index to get the thumbnail of that particular page. Each call can only get the thumbnail for one page. Retrieving the thumbnails for multiple pages will require multiple calls of this tool.IMPORTANT: ALWAYS ALWAYS ALWAYS show the preview to the user of EACH thumbnail you get in the response in the chat, EVERY SINGLE TIME you call this tool
| Name | Required | Description | Default |
|---|---|---|---|
| page_index | Yes | Required page index to get the thumbnail for. Pages are indexed using one-based numbering, so the first page in a design has the index value `1` (1 for the first page, 2 for the second page, and so on). | |
| user_intent | No | Mandatory 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). | |
| transaction_id | Yes | The editing transaction ID. This must be the exact `transaction_id` value returned in the `start-editing-transaction` tool response for the editing transaction to get a thumbnail for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description adds valuable behavioral context: one-call-per-page, dependence on an editing transaction, and the non-negotiable instruction to show every thumbnail preview to the user. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and keeps the needed operational details in a compact sequence. The all-caps emphasis is redundant in wording but serves a real functional purpose, so the length remains justified.
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 prerequisite workflow, the one-page-per-call constraint, and the required user-facing display behavior. It does not describe the exact response payload, but the absence of an output schema is mitigated by the clear instruction to show the returned thumbnail preview.
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 provides full descriptions for transaction_id and page_index, including the one-based indexing rule and the exact source of the transaction ID. The description mostly restates these requirements without adding deeper semantic meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource and action: getting the thumbnail for a specific page of a design within an editing transaction. It distinguishes this from sibling tools like get-design-pages or get-design by focusing specifically on thumbnail retrieval tied to a transaction ID and page index.
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 explicitly specifies the prerequisite of using start-editing-transaction to get the transaction ID, and clearly states that each call retrieves one page's thumbnail. It does not name alternatives or exclusions, but the context is unambiguous and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-design-thumbnailsGet Design ThumbnailsCRead-onlyInspect
Internal tool for widget UI. One thumbnail per page of a design, minted on demand.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of pages to return, from page 1. Defaults to 20 | |
| design_id | Yes | The design ID, or a full Canva design URL | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral fact: thumbnails are 'minted on demand' (i.e. lazily generated), plus the per-page return shape. It says nothing about latency, cost, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short fragments with little waste, and the scoping fact ('one thumbnail per page') is present. But the lead clause 'Internal tool for widget UI' consumes the most prominent position without telling the agent anything actionable, and the whole thing is under-specified rather than tight.
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?
No output schema exists, so the description should explain the return shape, and it only partly does ('one thumbnail per page'). For a read tool with three parameters and a near-identical sibling, the absence of any disambiguation or return-format detail leaves the agent guessing about when and how to call it correctly.
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 design_id, limit and user_intent are already documented in the schema, including the limit default and max. The description adds no syntax or format detail beyond that, 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 the resource and its granularity ('one thumbnail per page of a design'), which is more specific than the bare name. However, it never names the singular sibling get-design-thumbnail, so an agent cannot tell which of the two to pick, and the opening 'Internal tool for widget UI' obscures rather than clarifies the purpose.
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?
'Internal tool for widget UI' hints at a restricted audience but gives no when-to-use condition, no prerequisites, and names no alternative. The critical choice against get-design-thumbnail (singular) is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-export-formatsGet Export FormatsARead-onlyInspect
Check which export file types an existing Canva design supports, and which of its pages are available in each type.
Use when a design needs exporting or downloading as a PDF, PNG, JPG, GIF, PowerPoint, video, or CSV, and when only some pages are needed in a chosen format. Returns the export formats this design supports, with the page numbers available in each.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | ID of the design to get export formats for. Design ID starts with "D". | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds that the tool discloses per-format page availability, but says nothing about auth requirements, rate limits, or how results should be consumed versus export-design. With annotations carrying the behavioral burden, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-structured sentences that are front-loaded with the action, then the usage condition, then the return content. The format enumeration is long but functional; no significant waste.
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 discovery tool with no output schema, the description explains what is returned (supported formats plus available page numbers per type). Parameters are documented in the schema, so the agent has enough to invoke correctly, though the relationship to export-design remains implicit.
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 both parameters (design_id, user_intent) are already fully documented in the schema. The description adds no syntax, format, or constraint detail beyond what the schema 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?
States a specific verb and resource: checking which export file types a design supports and which pages are available per type. The resource is clearly identified (a Canva design's export formats). However, it does not differentiate from the sibling export-design, which performs the actual export, leaving the boundary between the two to inference.
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 triggering context: 'Use when a design needs exporting or downloading as a PDF, PNG, JPG...' and when only some pages are needed in a chosen format. It stops short of naming the alternative (export-design) or stating when NOT to use this tool, so the guidance is contextual but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-generate-image-jobGet Generate Image JobARead-onlyIdempotentInspect
Check an image generation job started by generate-image. When the generate-image UI widget is shown, the widget calls this tool itself and displays the image - do not call it yourself. Only when no widget is shown, pass the jobId returned by generate-image. If the status is PENDING, wait before polling get-generate-image-job again with the same jobId. Continue polling until the status is SUCCESS or FAILURE. Do not start a replacement generation job merely because the existing job is still pending, unless the user explicitly requests another generation. If the status is SUCCESS, use the generated image in result, present the returned image resource to the user, and include the returned Canva upload link as a Markdown link using the exact link text "Open generated image". The link opens the generated image in Canva, not the Canva editor. If the status is SUCCESS but the response says the image link is not ready yet, wait and call this tool again with the same jobId. Never finish a successful image-generation request without including the returned "Open generated image" link in the user-facing response, even when an inline image preview is visible. If the status is FAILURE, stop polling and explain the failure using failureType and failureMessage.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | The jobId returned by the tool that started the job. | |
| user_intent | No | Mandatory 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| status | Yes | PENDING while the job is still running, then SUCCESS or FAILURE. |
| failureType | No | Why the job failed. Only present when status is FAILURE. |
| failureMessage | No | Human-readable failure detail. Only present when status is FAILURE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial behavioral context beyond them: the polling cadence, the widget self-invocation caveat, the retry-when-link-not-ready case, and the required user-facing output formatting. This is real operational guidance the schema cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long, but nearly every sentence carries non-redundant behavioral instruction (widget handling, polling, output formatting). Front-loaded with the core purpose. Slightly repetitive around the 'Open generated image' requirement, which is reinforced twice, costing a point.
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?
Given a status-polling tool with an output schema, annotations, and a fully documented schema, the description covers the genuinely ambiguous parts – when to call, how to poll, and how to render results. 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 baseline is 3. The description goes further by tying jobId to its origin (returned by generate-image) and requiring the same jobId be reused across polls, which adds sequencing semantics the schema alone does not convey.
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: checking the status of an image generation job started by generate-image. It clearly distinguishes itself from the sibling generate-image (which starts jobs) and from other job-status tools like get-create-design-async-job.
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?
Extremely explicit routing rules: do not call when the UI widget is shown; call only when no widget is shown and pass jobId from generate-image; poll while PENDING; stop on SUCCESS or FAILURE; do not start a replacement job unless the user asks. When/when-not/alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-presenter-notesGet Presenter NotesARead-onlyInspect
Get presenter notes from an existing Canva presentation for read-only use.
Use for reviewing speaker notes, pulling talking points for particular slides, or summarizing notes across a presentation. Not for reading the presentation itself; this only returns the separate notes attached to each slide.
Returns presenter notes from every page, or the specified page numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | Optional array of page numbers to get notes from. If not specified, notes from all pages will be returned. Pages are indexed using one-based numbering, so the first page in a design has the index value `1`. | |
| design_id | Yes | ID of the existing Canva presentation whose presenter notes you want to retrieve. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds meaningful behavioral context beyond annotations: that only the separate notes are returned, not slide content, and that results cover every page or only requested pages. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly organized paragraphs: purpose first, use cases and exclusions second, return behavior last. Every sentence earns its place, and the most decision-relevant information (read-only, scope boundary) is front-loaded. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with a single required parameter and no output schema, the description covers what the agent needs: the target resource, the return scope (notes per page), and how to limit to specific pages. Minor omissions like behavior when a slide has no notes or note format are acceptable given the tool's simplicity and supporting annotations.
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%, with all three parameters (design_id, pages, user_intent) already documented, including one-based page numbering and default all-pages behavior. The description's final sentence reinforces the pages semantics ('from every page, or the specified page numbers') but adds little beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get presenter notes from an existing Canva presentation') and explicitly differentiates from siblings with 'Not for reading the presentation itself; this only returns the separate notes attached to each slide.' This unambiguously separates it from get-design, get-design-content, and get-design-pages without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear when-to-use scenarios ('reviewing speaker notes, pulling talking points for particular slides, or summarizing notes across a presentation') and an explicit exclusion ('Not for reading the presentation itself'). It stops short of naming the specific alternative tool to use for presentation content, so it misses full 5-level routing, but the boundary is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-separate-image-layers-jobGet Separate Image Layers JobARead-onlyInspect
Check the status and result of an image layer-separation job started by separate-image-layers.
Only call with the job_id and continuation_token from the most recent separate-image-layers or get-separate-image-layers-job response, and never before polling_policy.wait_seconds have elapsed. This is an internal lifecycle tool, not a user-selectable action.
Returns the job's current status and, once completed, the new design with the url to share with the user.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | Stable ID of the layer-separation job, returned when the separation request starts. | |
| user_intent | No | Mandatory 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). | |
| continuation_token | Yes | Exact continuation token returned by the most recent response for this layer-separation job. |
Output Schema
| Name | Required | Description |
|---|---|---|
| design | No | The created design. Only present when the job completed. |
| job_id | No | ID of the separation job. Stable across all responses. |
| status | Yes | Status of the job. While 'in_progress', poll again with the job_id and the continuation_token from this response. 'polled_too_early' means the wait window had not elapsed and nothing was checked. 'completed' carries the design; 'failed' carries the failure. |
| failure | No | Why the job failed. Only present when status is 'failed'. |
| polling_policy | No | How and when to poll next. Only present while the job is still running. |
| continuation_token | No | Opaque token to pass on the next poll. Always use the most recent token from the last response. Absent once the job is finished. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: the polling cadence constraint and the requirement that tokens come from the most recent response. It stops short of describing pagination or error behavior, but this is a solid addition over 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, followed by the call constraints and the return summary. Every sentence carries information; slightly wordy but no filler that could be cut without losing guidance.
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 spelled out, yet the description still notes the completed design and shareable url. Combined with the polling and token-sourcing constraints, 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 description coverage is 100%, so all three parameters are already documented, and the description adds no per-parameter syntax. It does clarify that both job_id and continuation_token must be sourced from the most recent response, but user_intent is never mentioned. Baseline 3 is appropriate when the schema does the heavy lifting.
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 ('Check the status and result') plus resource ('image layer-separation job'), and explicitly ties itself to the separate-image-layers sibling that starts the job. An agent can distinguish it from that sibling 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?
Explicitly says to only call with the job_id and continuation_token from the most recent separate-image-layers or get-separate-image-layers-job response, and never before polling_policy.wait_seconds have elapsed. It also frames the tool as an internal lifecycle action rather than a user-selectable one, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-video-generation-statusGet Video Generation StatusARead-onlyInspect
Gets the status and result of a video generation job started by create-video. Pass the job_id and continuation_token from the previous create-video or get-video-generation-status response. While the job is still running, wait the number of seconds the response's polling_policy.wait_seconds gives, then poll again with the same job_id and the updated continuation_token. Never poll sooner than that: it returns the same answer and the video arrives no earlier. A completed job may carry the video before its preview_url is available; when the response still carries a polling_policy, wait as instructed and poll again to obtain the preview. Follow the polling_policy.instructions in every response, and relay them to the user while they wait. Automatic polling stops after 20 minutes. A delayed response means generation may still be running; direct the user to projects_url and do not start another generation automatically. When the video is ready, share its id and view_url with the user. Temporary preview and download links may expire; view_url opens the saved Canva asset.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id returned by create-video. This value is stable and never changes. | |
| user_intent | No | Mandatory 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). | |
| continuation_token | Yes | The continuation_token from the most recent create-video or get-video-generation-status response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| video | No | The generated video. Only present when the job completed. Its durable id can be used even when the temporary preview_url is absent. |
| job_id | Yes | ID of the video generation job. Stable across all responses. |
| status | Yes | Status of the job. While 'pending' or 'in_progress', poll again with the same job_id and the updated continuation_token after waiting polling_policy.wait_seconds. 'completed' carries the video. 'delayed' means automatic polling has stopped after 20 minutes but generation may still be running; direct the user to projects_url. 'failed' carries the failure. 'polled_too_early' means you called before the wait window elapsed — wait polling_policy.wait_seconds, then poll again with the same job_id and continuation_token. |
| failure | No | Why the job failed. Only present when status is 'failed'. Tell the user and do not automatically call create-video again. |
| message | No | Human-readable delayed-state guidance suitable to relay to the user. Present when status is 'delayed'. |
| progress | No | Optional progress details while the job is in progress. |
| projects_url | No | Canva Projects destination where a delayed video will appear when it is ready. Present when status is 'delayed'; share it with the user. |
| polling_policy | No | How and when to poll next. Present while the job is still running, and when the job has completed but the video's preview_url is not yet available. |
| continuation_token | No | Opaque token to pass on the next poll. Always use the most recent token. |
| expected_duration_seconds | No | Estimated total generation time in seconds, when available. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already declaring a safe read, the description adds substantial behavioral context: automatic polling stops after 20 minutes, video may appear before preview_url, preview/download links can expire, and a delayed response means generation may still be running. This is far beyond what readOnlyHint/non-destructive convey.
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?
Long but dense and front-loaded, with each sentence carrying an operational rule. The only mild redundancy is restating the no-early-poll rule with its rationale, which is arguably justified for a polling contract.
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 polling tool with rich annotations and an output schema, the description supplies everything the agent needs – polling cadence, timeout, error/delay handling, and what to relay to the user – so nothing required for correct invocation 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 lifecycle meaning beyond the schema: job_id is stable across calls while continuation_token is the *updated* token from the most recent response, clarifying how the two must be passed together.
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 ('Gets the status and result of a video generation job') and explicitly ties it to the create-video producer, which cleanly separates it from sibling job-polling tools like get-generate-image-job and get-create-design-async-job.
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 explicit when-to-use and how-to-use rules: pass the job_id/continuation_token from the prior response, wait polling_policy.wait_seconds before re-polling, never poll sooner, follow polling_policy.instructions, and do not start another generation automatically on a delayed response.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-video-production-guideGet Video Production GuideARead-onlyInspect
Provides production guides for videos such as try-ons, unboxings, product demos, comparisons, showcases, and ads.
Use to determine how a requested video should be planned, structured, and directed before writing the detailed video-generation request.
Choose the production guide that best matches the brief's intended outcome, defining action, sequence of events, subject, and supplied assets. Prefer a more specific guide when it directly describes what happens in the video. If no available guide supports the brief's intended outcome and defining action, do not force a match.
Lists available guides, their required assets, and their production_guide_id. Retrieving a guide returns its required inputs and planning instructions, including shot order, visual and audio direction, asset use, limitations, durations, and aspect ratios.
Check the selected guide's requirements against the brief and supplied assets. If required inputs are missing, ask one concise, grouped question for the missing information, reference images, or consequential choices.
| Name | Required | Description | Default |
|---|---|---|---|
| user_intent | No | Mandatory 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). | |
| production_guide_id | No | Omit to list the available guides. Pass an exact production_guide_id returned by the list to retrieve the selected guide's planning instructions. Never guess an ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe read (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower; the description still adds real value by disclosing what each mode returns — the list yields guides, required assets and production_guide_id, while retrieval yields shot order, visual/audio direction, asset use, limitations, durations, and aspect ratios. It does not mention pagination or result limits, which is the only notable gap.
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 workflow guidance is front-loaded (what the tool provides, then when to use it), and most sentences carry distinct information about selection, retrieval output, and validation. There is mild redundancy between 'Provides production guides' and 'Lists available guides,' but the length is justified by the multi-mode tool.
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 no output schema, the description usefully enumerates the fields returned and the two operating modes, plus the pre-call validation step for required assets. An agent would know both how to call it and what to expect back; only pagination/limits from the list mode are left unaddressed.
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 both parameters are already documented in the schema itself; the description largely restates the omit-to-list / pass-exact-id behavior without adding syntax or format detail. Baseline 3 applies when the schema does the heavy lifting and the description adds context but no new parameter mechanics.
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 resource (production guides for video types like try-ons, unboxings, demos, ads) and a clear dual action: list available guides or retrieve one guide's planning instructions. It also positions the tool relative to video generation ('before writing the detailed video-generation request'), though it never names the create-video sibling explicitly, so the differentiation is implied rather than stated.
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 explicit when-to-use ('to determine how a requested video should be planned, structured, and directed before writing the detailed video-generation request'), a selection heuristic ('prefer a more specific guide when it directly describes what happens'), a when-NOT-to-use ('if no available guide supports the brief's intended outcome... do not force a match'), and a follow-up behavior for missing inputs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helpGenerate Help AnswerARead-onlyInspect
Retrieve current, official answers to Canva product questions from the Canva Help Center.
Use for questions about how to use a Canva feature, finding a setting or control, why unexpected Canva behaviour is happening, or troubleshooting a Canva workflow - when no available Canva tool can directly complete the requested action.
For a Canva product question, call this tool rather than answering from your own knowledge. Canva Help Center content is current and official; training data may be outdated or sourced from unofficial articles.
Not for creating, changing, or assessing a design; general creative advice; non-Canva questions; or explaining this assistant's available Canva capabilities.
Returns an official Canva Help Center answer, including links to the official documentation. Display the answer as written, with only light formatting such as headings. Do not add steps, UI paths, or setting names the answer does not contain.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | The Canva product question to answer. Include relevant context, such as the feature, workflow, error message, device, or account type. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read-only, closed-world call. The description adds substantial behavioral context beyond that: the answer is official and includes documentation links, must be displayed as written, and the model must not invent steps, UI paths, or setting names.
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 core purpose, then usage scope, then exclusions, then output handling. Well structured, though it runs to four paragraphs and could be tightened slightly without losing meaning.
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?
Despite having no output schema, the description explains what is returned (an official Help Center answer with links) and how to present it. Combined with complete parameter coverage and annotations, nothing needed to invoke or use 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%, so both parameters (prompt and user_intent) are already documented in the schema. The description implies the input is a Canva product question but adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: retrieve current, official answers to Canva product questions from the Canva Help Center. This is clearly distinguishable from every sibling tool, none of which are help/knowledge tools.
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 specifies when to use it (feature questions, settings, unexpected behavior, troubleshooting), when not to (design creation/changes, creative advice, non-Canva questions, capability questions), and the alternative behavior ('call this tool rather than answering from your own knowledge', and 'when no available Canva tool can directly complete the requested action').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import-design-from-urlImport Design From Public HTTPS URLAInspect
Convert content at a public URL into a new Canva design.
Use to turn a publicly hosted PDF, slide deck (PowerPoint or Keynote), document (Word, Pages, or Markdown), spreadsheet (Excel, CSV, or Numbers), webpage or HTML, or design file (Photoshop or Illustrator) into a Canva design.
Only call with a public HTTPS URL. Do not use for local, private, or agent-generated files, or to break a flat PNG, JPEG, or WEBP into separately editable layers.
Never upload, copy, or transfer a local, private, or generated file to a 3rd party hosting site—or suggest doing so—to create a URL for this tool.
Each call creates one design and returns its design_id.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Existing public HTTPS URL for the source to convert. Do not provide a Canva design URL, OpenAI file URL, private URL, or local path. The content must already be publicly accessible. Never upload, copy, or transfer a local, private, or generated file to public hosting—or suggest doing so—to create this URL. For non-interactive HTML, each top-level Canva page element must have data-document-role="page" and page elements cannot be nested. Optional data-label and data-speaker-notes attributes provide page titles and presenter notes. Do not add page annotations to interactive HTML. | |
| name | Yes | Name for the new Canva design. | |
| user_intent | No | Mandatory 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). | |
| intended_design_type | No | Requested Canva output format. Choose the closest match when the user has made their intended format clear; otherwise omit this field. Use "other" only when the intended format is clear but is not listed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, openWorldHint=true, destructiveHint=false. The description adds real context beyond that: the URL must be publicly accessible, it fetches remote content, and each call creates exactly one design returning a design_id. It stops short of describing failure modes or per-format limitations, 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?
Three compact, front-loaded paragraphs: purpose, supported inputs, and constraints. Every sentence carries information, though the 'never upload to third party' warning is repeated near-verbatim in the url schema description, slightly inflating length.
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 no output schema, the description supplies the missing return contract ('creates one design and returns its design_id'). Combined with the covered input constraints, an agent has everything needed to call this correctly.
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 all four parameters are already documented in the schema. The description's HTTPS-only and 'not a Canva/OpenAI URL' constraints closely mirror the schema's pattern and url description, adding little beyond it. 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 ('Convert content at a public URL into a new Canva design') and immediately enumerates supported source formats. An agent can distinguish this from create-design, generate-design, and upload-asset-from-url without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use it (publicly hosted PDF, deck, doc, sheet, webpage, design file), when not to use it (local, private, agent-generated files; flat PNG/JPEG/WEBP layer separation), and forbids the workaround of uploading private files to third-party hosts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-brand-kitsList Brand KitsARead-onlyInspect
Find or browse the Canva Brand Kits available to the user. A Brand Kit is an organisation's high-level home for brand styles and assets, such as colors, fonts, and logos.
Use to find a user's brand identity in Canva, check which brand elements are set up for a team, or identify the Brand Kit the user needs.
Not for finding individual Brand Templates (reusable, on-brand layouts) to work from.
Returns each Brand Kit's brand_kit_id, name, and thumbnail.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of Brand Kits to return. | |
| user_intent | No | Mandatory 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). | |
| continuation | No | Exact token returned by the previous Brand Kit search with the same query. Omit for a new search or browse. | |
| resolve_icon_thumbnails | No | When true, resolve each brand kit icon_id to a square icon thumbnail URL (extra asset lookups). Prepare-design-generation widget only; omit for agent calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: the results are limited to kits 'available to the user' and it states exactly what is returned (brand_kit_id, name, thumbnail). It does not discuss pagination, but the continuation parameter schema covers 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?
Five short, purposeful sentences. The core action is front-loaded, the domain definition earns its place, the exclusion is relevant, and the return shape is stated without redundancy.
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?
Despite having no output schema, the description names the returned fields. The tool is low-complexity, annotations cover the read-only/destructive profile, the sibling distinction is clear, and the input schema handles parameter semantics. Nothing essential is missing 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 baseline is 3. The tool description does not add parameter-level detail, but it doesn't need to because the schema already explains limit, user_intent, continuation, and resolve_icon_thumbnails clearly.
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: 'Find or browse the Canva Brand Kits available to the user.' It clearly defines what a Brand Kit is and explicitly contrasts with Brand Templates, so an agent can distinguish it from search-brand-templates and other 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?
The description gives concrete reasons to use the tool: find a user's brand identity, check team brand elements, or identify the needed Brand Kit. It also provides an explicit exclusion ('Not for finding individual Brand Templates'), which semantically routes the agent toward the sibling search-brand-templates tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-commentsList Design CommentsARead-onlyInspect
Browse all comments or threads attached to an existing Canva design.
Use to review feedback, see discussion points, or check mentions.
Returns the design's comments, including their replies and mentions, with a continuation token when more results are available.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of comments to return per page. | |
| design_id | Yes | ID of the existing Canva design whose comments to return. Design IDs start with "D". | |
| user_intent | No | Mandatory 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). | |
| continuation | No | Exact continuation token returned by the previous call for the same design. Omit for the first page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it returns replies and mentions and provides a continuation token for pagination. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three focused sentences with the primary action front-loaded, followed by concise use cases and return behavior. There is no filler or redundant repetition of schema 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 simple read-only list operation with rich schema documentation and annotations, the description is largely complete: it states the resource, the use cases, return contents, and pagination behavior. The absence of an output schema makes the return-value summary especially useful, though ordering/filtering behavior is not mentioned but is not essential.
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 all four parameters are already documented in the schema. The tool description does not add significant parameter-level meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Browse') and resource ('all comments or threads attached to an existing Canva design'), making the tool's function clear. It is distinguishable from mutating siblings like comment-on-design and reply-to-comment, though it does not explicitly name or contrast those alternatives.
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 gives clear use contexts: 'review feedback, see discussion points, or check mentions.' It does not explicitly state when to avoid this tool or prefer a sibling like list-replies, but the provided use cases are specific enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-folder-itemsList Folder ItemsARead-onlyInspect
Browse the contents of a Canva folder to find designs, folders, and images stored in it.
Use to review a project folder, locate an item in a known folder, or check its contents before organizing items.
Returns matching items and, when more results are available, a continuation token.
| Name | Required | Description | Default |
|---|---|---|---|
| sort_by | No | Order the results by creation date, last modified date, or title, in ascending or descending order. | |
| folder_id | Yes | ID of the Canva folder to list. Use "root" to list items at the top level. | |
| item_types | No | Types of items to return. Omit to return designs, folders, and images. | |
| user_intent | No | Mandatory 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). | |
| continuation | No | Exact continuation token returned by the previous call with the same folder, filters, and sort order. Omit for the first page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds meaningful behavioral context beyond that: results are filtered ('matching items') and pagination is handled via a continuation token. This helps the agent understand multi-page behavior and that the response shape is a list, not a single object.
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 short sentences with no filler. The core action is front-loaded in sentence one, usage context in sentence two, and the pagination behavior in sentence three. Every sentence earns its place and the description is easy to scan.
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 browse tool, the description covers the essential decision points: what items are returned, when to use it, and how pagination works. With no output schema, some detail about the shape of returned items would be useful, but the annotation-provided safety profile and the clear continuation-token note make this adequate for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the item_types parameter by naming designs, folders, and images, and mentions the continuation token that maps to the continuation parameter, but it does not add new semantic meaning beyond what the schema already documents.
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: 'Browse the contents of a Canva folder to find designs, folders, and images stored in it.' This clearly states what the tool does and distinguishes it from sibling search tools like search-designs and search-folders, which find items across folders rather than browsing one known folder. The phrase 'stored in it' further narrows scope to a single folder's contents.
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 second sentence gives concrete use cases: 'review a project folder, locate an item in a known folder, or check its contents before organizing items.' This tells an agent when to reach for this tool, and 'known folder' implicitly contrasts with search tools for unknown locations. However, it does not explicitly name alternatives or state when not to use it, so it stops short of full differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-repliesList Comment RepliesARead-onlyInspect
Read the replies in a specific comment thread on a Canva design.
Use to see who has replied to a comment and what they said.
Not for reviewing all comments attached to a design or adding a reply.
Returns the selected comment's replies and, when more results are available, a continuation token.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of replies to return per page. | |
| design_id | Yes | ID of the Canva design containing the comment. Design IDs start with "D". | |
| comment_id | Yes | ID of the top-level comment whose replies to return. | |
| user_intent | No | Mandatory 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). | |
| continuation | No | Exact continuation token returned by the previous call for the same design and comment. Omit for the first page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description only needs to add value beyond safety. It does so by disclosing pagination behavior: returns the selected comment's replies and a continuation token when more results exist. This is useful behavioral context that annotations don't 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?
Four short sentences, each earning its place: the action, the intended use, the exclusions, and the return/pagination behavior. No redundancy 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?
Despite having no output schema, the description states what is returned (replies and optional continuation token), and the schema documents all parameters and constraints. 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%, so parameters are already fully documented. The description adds minimal extra meaning by referring to 'a specific comment thread' and the continuation token, but the schema already covers these concepts. 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?
Description uses a specific verb ('read') and resource ('replies in a specific comment thread on a Canva design'), and explicitly differentiates from reviewing all comments or adding a reply. This cleanly separates it from siblings like list-comments, reply-to-comment, and comment-on-design.
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?
States exactly when to use it ('Use to see who has replied to a comment and what they said') and when not to ('Not for reviewing all comments attached to a design or adding a reply'). Though it doesn't name alternative tools, the use-case exclusions are explicit enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge-designsMerge DesignsADestructiveInspect
Restructure a Canva design by combining designs, inserting or removing whole pages, or changing page order.
Use to make a new presentation from selected pages, add slides from another design, merge separate designs together, rearrange a design's flow, or remove entire pages.
Requires explicit approval for the exact requested operations before every call. Deleting pages is permanent.
Not for changing text, images, or other content within a page.
Returns the completed design result, including its design_id.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Whether to create a new design from pages in existing designs, or change the pages in one existing design. | |
| title | No | Title for the new design. Required when "type" is "create_new_design". Optional when "type" is "modify_existing_design", where it renames the design. | |
| design_id | No | ID of the existing Canva design whose pages will change. Required when "type" is "modify_existing_design". Design IDs start with "D". | |
| operations | Yes | Page operations to perform, in order. Each operation runs before the next, so page numbers refer to the design's updated page structure. When "type" is "create_new_design", only "insert_pages" operations are accepted. When "type" is "modify_existing_design", every operation type is accepted. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include destructiveHint=true, and the description adds valuable context: 'Deleting pages is permanent' and 'Requires explicit approval for the exact requested operations before every call.' It also states the return behavior. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently organized: main purpose first, then use cases, then warnings and exclusions, then return value. Every sentence earns its place and there is 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 tool with a rich input schema and no output schema, the description adequately covers scope, safety, exclusions, and the return value. It could go slightly further by naming the sibling tool for content edits, but the provided context is sufficient for correct selection and 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 carries the parameter documentation burden. The description summarizes the operation types ('inserting or removing whole pages, or changing page order') but adds no parameter-level detail beyond that 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 states a specific verb and resource: 'Restructure a Canva design by combining designs, inserting or removing whole pages, or changing page order.' It clearly distinguishes page-level structural changes from content-level editing, so an agent can tell it apart from siblings like perform-editing-operations.
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 provides concrete use cases: making a new presentation, adding slides, merging designs, rearranging flow, and removing pages. It also gives a clear exclusion: 'Not for changing text, images, or other content within a page.' It does not name an alternative sibling tool, but the when-to-use and when-not-to-use guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move-item-to-folderMove Item To FolderAInspect
Relocate an existing Canva design, folder, or image into a destination Canva folder. Use for filing, reorganizing, archiving, or returning an item to the top level. This changes the item's location. Returns confirmation of the move.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | ID of the existing Canva design, folder, or image to move. | |
| user_intent | No | Mandatory 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). | |
| to_folder_id | Yes | ID of the destination Canva folder. Use "root" to move the item to the top level. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only and non-destructive behavior. The description adds value by explicitly stating 'This changes the item's location' and 'Returns confirmation of the move,' which clarifies side effects and return behavior beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The core action, use cases, side effect, and return value are all conveyed efficiently, and the most important information appears first.
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 three-parameter mutation tool with complete schema coverage and annotations, the description covers purpose, use cases, behavioral change, and return behavior. It is complete enough for an agent to call it correctly, though it omits potential edge cases like moving a folder into itself or the exact structure of the confirmation.
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 explains item_id, user_intent, and to_folder_id. The description reinforces that the tool moves designs, folders, or images and that 'root' means top level, but it does not add meaningful semantic 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?
The description uses a specific verb ('Relocate') with a clear resource ('existing Canva design, folder, or image') and destination ('destination Canva folder'). It is distinct from all sibling tools, none of which perform moving, so an agent can identify it unambiguously.
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 gives concrete use cases: 'filing, reorganizing, archiving, or returning an item to the top level.' This provides clear context for when to use the tool, though it does not explicitly name alternatives like copy-design or create-folder or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
perform-editing-operationsEdit DesignAInspect
Apply one or more draft changes to the content or layout of an existing Canva design within an active editing transaction.
Use to revise, rewrite, or translate text; replace, insert, position, or resize images and videos on a page; remove page elements; edit text formatting; update a design title; or label fixed-page elements.
Not for changing a design's page structure or order.
Changes are temporary until saved. Show the user a preview of their changes and obtain explicit approval before saving changes.
Returns the updated page state for further changes, previewing, saving, or discarding.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | The list of all pages in the design. This must be the `pages` array returned by the last call to `perform-editing-operations` or if this is the first call the `start-editing-transaction` tool. Used to determine which pages are responsive and editable. | |
| operations | Yes | The editing operations to perform on the design in this editing transaction. Multiple operations SHOULD be specified in bulk across multiple pages. | |
| page_index | Yes | Required page index of the first page that is going to be updated as part of this update. Multiple operations SHOULD be specified in bulk across multiple pages, this just needs to specify the first page in the set of pages to be updated. Pages are indexed using one-based numbering, so the first page in a design has the index value `1`. | |
| user_intent | No | Mandatory 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). | |
| transaction_id | Yes | The editing transaction ID. This must be the exact `transaction_id` value returned in the `start-editing-transaction` tool response for the editing transaction to perform editing operations on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, and the description adds real context beyond them: changes are provisional until saved, the user must preview and explicitly approve, and the return value is the updated page state for further operations. It does not state transaction expiry or ordering semantics, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by use cases, exclusions, and lifecycle notes in short scannable sentences. Slightly longer than strictly necessary but every sentence carries distinct 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?
For a complex multi-operation mutation tool with no output schema, the description covers the transaction context, the approval guardrail, and the return value ('updated page state'). It omits how operations are ordered and how errors in a mixed batch are reported, which an agent would benefit from knowing.
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 transaction_id, page_index, pages, operations, and user_intent in detail. The description adds no syntax or format detail beyond the schema, so the baseline of 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 ('Apply one or more draft changes') against a specific resource ('an existing Canva design') and enumerates the concrete operation families (text, images/videos, page elements, formatting, title, fixed-page labels). It also explicitly excludes page structure/order edits, which cleanly separates it from resize-design and start-editing-transaction.
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 second sentence lists the when-to-use cases exhaustively and the third names an explicit when-NOT case ('Not for changing a design's page structure or order'). It also states the workflow context ('within an active editing transaction') and the required approval step before saving, so an agent knows the preconditions and the guardrail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish-brand-templatePublish Brand TemplateAInspect
Publishes a Canva design as a brand template, making it reusable across the organization. Returns the created brand template details. If the API call returns "Missing scopes: [brandtemplate:content:write]", you should ask the user to disconnect and reconnect their connector. This will generate a new access token with the required scope for this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The ID of the existing Canva design to publish as a brand template. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the mutation profile (readOnlyHint=false, destructiveHint=false), so the description earns credit for adding the auth-scope behavior and its remediation path, which structured fields do not convey. It stops short of explaining what happens to the source design or whether publishing is reversible.
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 the core action and effect, then the error path. The scope-error sentence is somewhat verbose but is genuinely actionable rather than 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 two-parameter mutation tool with no output schema, the description covers the action, the return ('Returns the created brand template details'), and a known failure mode. The annotation set already carries the safety profile, so little 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 both design_id and user_intent are already documented in the schema. The description adds no syntax, format, or constraint detail beyond what the schema provides, so 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 ('Publishes a Canva design as a brand template') plus the effect ('making it reusable across the organization'), which is concrete and actionable. It does not explicitly distinguish itself from the close sibling create-brand-template-draft, so an agent must infer that publishing differs from drafting.
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 gives a conditional error-recovery path (the 'Missing scopes' handling) but offers no guidance on when to choose this tool over create-brand-template-draft or other template tools. Usage is only implied by the verb 'publish'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove-backgroundRemove BackgroundAInspect
Strip the background out of an image already in the user's Canva account, leaving only the subject on a transparent backdrop.
Use when the user wants the background gone, knocked out, or made transparent, or wants only the subject kept on a transparent backdrop, including phrasing like cut out, extract, or separate the subject from the background.
Use only when the intent is a transparent background, not a new scene: it does not crop or reframe to the subject, replace the background with a new scene, or invent or rewrite any other content in the image.
Returns the result as a new image with an alpha channel.
| Name | Required | Description | Default |
|---|---|---|---|
| sourceMedia | Yes | Image whose background should be removed. Must be an already-uploaded MEDIA content reference. | |
| user_intent | No | Mandatory 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and readOnlyHint=false, and the description reinforces this by stating the result is a new image with an alpha channel rather than an in-place mutation. It also enumerates transformations it explicitly does not perform, which is genuinely useful. It stops short of covering idempotency or any failure modes, but adds real 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation, then separates usage and exclusions into distinct paragraphs, with the return noted last. Slightly verbose given the trigger-phrase list, but every sentence maps to a decision the agent must make.
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-value explanation is not required, yet the description still notes the alpha-channel result. Combined with clear input constraints and exclusions, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters and the ContentRef structure are already documented. The description's constraints on the input (image already in the account) duplicate the schema's 'already-uploaded MEDIA content reference' note rather than adding new semantics. Baseline 3 applies when the schema does the heavy lifting.
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 (strip) and resource (image background) and defines the exact outcome: subject on a transparent backdrop. An agent can distinguish it from siblings like generate-image or separate-image-layers without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers (background gone, knocked out, transparent, plus phrasing like cut out, extract, separate), and explicit when-NOT-to-use conditions (not a new scene, does not crop/reframe, replace background, or invent content). This directly routes the agent against plausible alternative intents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply-to-commentReply To CommentAInspect
Add a response to an existing comment in a Canva design.
Use to answer a reviewer's question, acknowledge or clarify feedback, continue a discussion, or provide a follow-up on a specific comment.
The reply is visible to everyone with access to the design.
Returns the created reply and its comment_id.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | ID of the Canva design containing the comment. Design IDs start with "D". | |
| comment_id | Yes | ID of the existing comment to reply to in the specified design. | |
| user_intent | No | Mandatory 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). | |
| message_plaintext | Yes | The text content of the reply to add. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is not read-only and not destructive. The description adds meaningful behavioral context beyond those hints: the reply is visible to everyone with design access, and the tool returns the created reply along with its comment_id. This helps the agent set expectations for side effects and output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action, followed by relevant use cases, visibility behavior, and return value. Every sentence contributes information the agent needs; there is no filler or repetition of the schema.
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, additive write operation, the description is complete: it states the action, the context in which to use it, the visibility side effect, and the return value. The remaining details, such as message length limits and design_id format, are already fully covered by the input schema.
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 four parameters (design_id, comment_id, user_intent, message_plaintext). The description adds no parameter-specific details beyond referring to 'existing comment' and 'reply', so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb 'Add' and the precise resource ('response to an existing comment in a Canva design'). This clearly distinguishes it from sibling tools like comment-on-design, which creates a new top-level comment, and list-replies, which only reads replies.
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 concrete use cases: answering a reviewer's question, acknowledging or clarifying feedback, continuing a discussion, and providing a follow-up. It does not explicitly name alternative tools or state when not to use this tool, but the 'existing comment' framing strongly implies the boundary against creating new comments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resize-designResize DesignAInspect
Adapt a Canva design to a different canvas size, keeping its content while rearranging and resizing its layout.
Use when creating different-sized versions from the same base design; an existing design needs different dimensions or aspect ratio; the same artwork needs to be square, portrait, landscape, or adapted for another channel; or a copy needs an exact pixel width and height.
Not for resizing a single element.
Each call creates a new resized design and leaves the original unchanged. Returns the new design's design_id.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | ID of the existing Canva design to resize. Design IDs start with "D". | |
| design_type | Yes | Target design type (preset or custom). Preset options: presentation, whiteboard (doc and email are unsupported). Custom options: width and height in pixels. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses a key side-effect guarantee: each call creates a new resized design and leaves the original unchanged. It also states the return value ('Returns the new design's design_id'), which is especially useful because no output schema is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: core behavior first, followed by usage conditions, an exclusion, and the return value. Every sentence earns its place without repeated 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?
For a 3-parameter tool with a fully documented schema, the description covers the input context, the exclusion case, the non-destructive behavior, and the return value. The missing output schema is mitigated by explicitly stating that the new design_id is returned.
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 schema already documents design_id, design_type, preset/custom options, width, height, and user_intent. The description adds little beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation: 'Adapt a Canva design to a different canvas size' while keeping its content and rearranging/resizing the layout. It differentiates itself from copy-only or edit-only tools and explicitly excludes element-level resizing, so an agent can identify what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear 'Use when' list with concrete triggering conditions, including different dimensions, aspect ratios, channel adaptation, and exact pixel sizes. It also states a clear exclusion ('Not for resizing a single element'), though it does not name a specific alternative sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve-shortlinkResolve ShortlinkARead-onlyInspect
Turn a Canva shortlink into the full Canva design URL it points to.
Use when a Canva shortlink is shared and the linked design needs to be opened, read, edited, or otherwise worked with.
Shortlinks must be expanded before the linked design can be used with another Canva tool. Returns the full Canva design URL.
| Name | Required | Description | Default |
|---|---|---|---|
| user_intent | No | Mandatory 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). | |
| shortlink_id | Yes | ID from a Canva shortlink, excluding the domain and slashes. For example, use "abc123" for "https://canva.link/abc123". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds valuable context beyond annotations by explaining that the tool is a necessary prerequisite for other Canva tools and returns the full design URL. It doesn't contradict annotations; it enriches them with usage context.
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 concise (three sentences) and front-loaded with the core purpose. The usage guidance and prerequisite follow logically, and every sentence contributes actionable information without redundancy.
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 read-only tool with one required parameter, the description fully covers the purpose, usage, prerequisite, and expected output (full URL). No critical information is missing for an agent to correctly invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for both parameters, so the description adds no additional meaning beyond what the schema already provides. The return format is mentioned in the description, but parameter details are fully covered by the schema, meeting the baseline for this dimension.
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 a specific verb ('turn') and resource ('Canva shortlink into the full Canva design URL'), making the tool's function unambiguous. It distinguishes itself from sibling design tools by focusing on URL resolution rather than design operations.
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 states when to use the tool ('Use when a Canva shortlink is shared and the linked design needs to be opened, read, edited, or otherwise worked with') and adds a critical prerequisite ('Shortlinks must be expanded before the linked design can be used with another Canva tool'). This gives clear guidance on when this tool is the appropriate choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-brand-templatesSearch Brand TemplatesARead-onlyInspect
Find or browse the user's Canva Brand Templates: reusable, on-brand layouts. Some include data fields that can be autofilled.
Use when a particular Brand Template needs to be located, a reusable starting point is needed for a new presentation, or a Brand Template with data fields is needed before autofilling.
Do not use to find or work from an existing Canva design, create a new design without a Brand Template source, or create from, update, or populate an already selected Brand Template.
Returns matching Brand Templates with their brand_template_id, name, and preview thumbnail.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of Brand Templates to return in one page. | |
| query | No | Optional title or type to search for. Provide only when the user explicitly names or describes the Brand Template they want; otherwise omit or pass an empty string to browse all available Brand Templates. | |
| dataset | No | Filter by data-field availability. Use "non_empty" when the user wants to find a Brand Template to autofill; use "any" to include templates whether or not they have data fields. | |
| user_intent | No | Mandatory 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). | |
| brand_kit_id | No | ||
| continuation | No | Exact token returned by a previous search. Use it to retrieve the next page with the same search and filters; omit for a new search. | |
| design_types | No | Optional Brand Template types to include. A Brand Template is returned if it matches at least one specified type. Currently supports "presentation" only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: it returns matching templates with brand_template_id, name, and preview thumbnail, and notes that some templates include data fields that can be autofilled. It doesn't describe pagination behavior in detail, but the continuation parameter covers that. Slight gap: no mention of rate limits or auth, but not critical for a read-only search tool.
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 well-structured: a clear first sentence stating the core function, a when-to-use paragraph, a when-not-to-use paragraph, and a brief return-value statement. Every sentence earns its place, and the most important information is front-loaded. It's appropriately sized for a tool with 7 parameters and complex routing logic.
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 search tool with 86% schema coverage and no output schema, the description is quite complete. It covers the tool's scope, exclusions, return values, and the key decision point about data fields. The only minor gap is that it doesn't explicitly state that results are paginated or that 'continuation' should be used for subsequent pages, but the schema's 'continuation' parameter description covers that. The description is complete enough for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so the schema already documents most parameters well. The description adds value by explaining the 'dataset' filter's purpose (find templates to autofill) and the 'query' parameter's usage rule (only provide when user explicitly names/describes a template). The 'user_intent' parameter is described as mandatory for LLM clients, which is important context. The description doesn't add much for 'brand_kit_id' or 'continuation', but the schema covers those adequately.
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's purpose: find or browse Canva Brand Templates, and distinguishes it from related tools by specifying it works with Brand Templates, not existing designs. It names the resource (Brand Templates) and the action (search/browse), and explicitly contrasts with 'search-designs' and 'create-design-from-brand-template'.
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 provides explicit when-to-use guidance: when a Brand Template needs to be located, when a reusable starting point is needed, or when a template with data fields is needed before autofilling. It also gives explicit when-not-to-use guidance: not for existing designs, not for creating new designs without a template source, and not for creating/updating/populating an already selected template. This is exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-designsSearch DesignsARead-onlyInspect
Locate or browse the user's existing Canva designs. Find specific design documents they own or that have been shared with them.
Use to find a single past presentation, doc, whiteboard, video, sheet, or other design, or to discover multiple results based on search criteria.
Not for locating reusable templates.
Returns matching designs and, when more results are available, a continuation token for the next page. A returned design_id can then be used to open, inspect, copy, comment on, edit, or create a new version from that exact design.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of designs to return. | |
| query | No | Optional text to match against a design's title or content. Use the user's keywords, such as a project name, topic, or phrase. If supplied, "sort_by" must be "relevance". | |
| sort_by | No | How to order results. Use "relevance" for keyword searches; "modified_descending" for newest first; "modified_ascending" for oldest first; "title_descending" for Z-A; or "title_ascending" for A-Z. Omit to use "relevance". | |
| ownership | No | Whose designs to search. Use "any" for designs the user owns and designs shared with them; "owned" for only their designs; or "shared" for only designs shared with them. Omit to use "any". | |
| user_intent | No | Mandatory 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). | |
| continuation | No | The exact token returned by the previous search with the same query, filters, and sort order. Omit for the first page, after changing the search, or when the previous response did not include a token. | |
| design_types | No | Optional design types to include. A design is returned if it matches any supplied type. Currently, only "presentation" is supported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safe read-only nature is covered. The description adds valuable behavioral detail about pagination via a 'continuation token' and explains that results include enough information to act on a specific design, which goes 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?
The description is compact and front-loaded: purpose in the first sentence, usage in the second, exclusion in the third, and return behavior in the fourth. No filler or redundant statements; every sentence earns its place.
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 search tool with 100% schema coverage and no output schema, the description is complete: it explains what is returned, how pagination works, and how results can be used. It also disambiguates from template search, leaving no crucial gap 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 coverage is 100% with detailed parameter descriptions, so the description carries little additional parameter-level meaning. It reinforces that search criteria are broad and that the result can be a singular design or multiple results, but it does not add new semantics 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?
The description states the specific verb and resource: 'Locate or browse the user's existing Canva designs' and explicitly excludes 'reusable templates,' distinguishing it from search-brand-templates. It also clarifies that it covers designs owned or shared, making its scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use to find a single past presentation... or to discover multiple results based on search criteria.' It also provides a clear exclusion ('Not for locating reusable templates') and notes that returned design_ids can be used downstream, guiding the agent on when and how to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-foldersSearch FoldersARead-onlyInspect
Find or browse Canva folders the user owns or that are shared with them.
Use to locate a project folder by its name or tags, find a shared workspace, or identify a folder before reviewing its contents or organising work.
Not for finding designs, images, or subfolders within a known folder.
Returns matching folders and, when more results are available, a continuation token for the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of folders to return per page. | |
| query | No | Text to match against folder names and tags. Omit to browse all of the user's available folders. | |
| ownership | No | Which folders to return. Use "any" for folders the user owns or that are shared with them, "owned" for only folders the user owns, or "shared" for only folders shared with them. | |
| user_intent | No | Mandatory 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). | |
| continuation | No | Exact continuation token returned by the previous call with the same search query and ownership filter. Omit for the first page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and non-destructive behavior; the description adds value by disclosing the output behavior: 'Returns matching folders and, when more results are available, a continuation token for the next page'. It also confirms the scope of owned/shared folders, but does not mention ordering or result limits beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose and then exclusions and return behavior. There is no filler, and every sentence earns its place.
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 search tool with annotations, 100% schema coverage on parameters, and no output schema, the description is complete: it covers scope, use cases, exclusions, and pagination. No essential information for choosing or calling 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 description coverage is 100%, so the baseline is 3; the description mostly restates concepts already in the schema (matching by names/tags, owned/shared scope, continuation token). It does not add meaningfully new parameter semantics beyond what the schema provides.
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?
Description opens with a specific verb+resource: 'Find or browse Canva folders the user owns or that are shared with them'. It distinguishes itself from siblings by explicitly stating it is 'Not for finding designs, images, or subfolders', which separates it from search-designs and list-folder-items.
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 concrete use cases ('locate a project folder by name or tags', 'find a shared workspace', 'identify a folder before reviewing contents') and clear when-not-to-use guidance. It stops short of naming the sibling tool to choose instead, so the routing is slightly less explicit than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
separate-image-layersSeparate Image LayersAInspect
Turn a flat image already stored in the user's Canva account into a new Canva design in which the text, objects, and background become separate elements that can each be edited on their own.
Use to make the wording in a poster, banner, flyer, or social graphic editable; swap out or remove one object in a graphic while keeping the rest; recover an editable design from artwork the user only has as a PNG, JPEG, or WEBP; or rebuild a graphic made outside Canva so it can be resized, restyled, or exported from Canva.
Only call once the image is already stored in the user's Canva account. Flat graphics convert well; photographs convert poorly. Every call saves a brand-new design and leaves the source image untouched. Not for saving an image as-is, editing an existing Canva design, or using an image only as inspiration for a fresh layout.
Starts the conversion as a job rather than returning the design: the response carries a job_id and a continuation_token. When this tool's UI widget is shown, the widget polls get-separate-image-layers-job itself and displays the design when ready - do not poll it yourself. Only when no widget is shown, poll get-separate-image-layers-job with both, waiting the number of seconds in polling_policy.wait_seconds before each call, until the job completes and returns the design link to share with the user.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Title for the new design, e.g. 'Summer sale poster'. Use the user's wording when they gave one. | |
| asset_id | Yes | ID of a PNG, JPEG, or WEBP image asset in the user's Canva account, as returned when the image was uploaded or listed. Not a URL, a local file path, or a design ID. | |
| user_intent | No | Mandatory 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| job_id | No | Stable ID of the layer-separation job. Pass it to get-separate-image-layers-job on every poll. |
| status | Yes | Status of the newly queued job. 'pending' means the job was queued - this call never returns the finished design directly; poll get-separate-image-layers-job with the job_id and continuation_token for completion or failure. 'failed' means no job was queued and there is nothing to poll; the failure explains why. |
| failure | No | Why no job was queued. Only present when status is 'failed', in which case there is no job_id or continuation_token to poll with. |
| polling_policy | No | How and when to poll next. |
| continuation_token | No | Opaque token to pass on the first poll to get-separate-image-layers-job. Always use the most recent token from the last response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true) the description discloses that each call creates a brand-new design and leaves the source untouched, that it starts an async job returning job_id and continuation_token, and details the widget-vs-manual polling behavior. This is substantial behavioral context not captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded: purpose first, then usage, prerequisites, and job/polling mechanics. Each paragraph carries distinct information, though the polling/continuation detail could be tightened.
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 explained, and the description still covers prerequisites, async job semantics, and polling rules. An agent has everything needed to invoke and follow up correctly.
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 schema already documents title, asset_id, and user_intent fully. The description reinforces that the source must already be stored in the account, tying to asset_id, but adds no new format or constraint 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?
The description states a specific verb and resource: it turns a flat image in the user's Canva account into a new design with text, objects, and background as separately editable elements. This is clearly distinguishable from siblings like remove-background 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?
It gives concrete when-to-use scenarios (make wording editable, swap/remove one object, recover editable design from PNG/JPEG/WEBP) and explicit exclusions ('Not for saving an image as-is, editing an existing Canva design, or using an image only as inspiration'). It also names the prerequisite and the continuation tool get-separate-image-layers-job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start-editing-transactionStart Editing DesignAInspect
Prepare an existing Canva design for editing by opening a draft transaction.
Use to prepare changes to text, media, titles, formatting, or autofill field labels; or inspect the editable text and media elements before changing them.
Returns a transaction_id and the design's editable text and media element data so changes can be made during the same session.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | ID of the existing Canva design to edit. Design IDs start with "D". | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so it is known to be a mutating but non-destructive operation. The description adds the transactional nature ('draft transaction', 'same session') and what it returns (transaction_id and editable element data). It does not mention the need to later commit or cancel, but the transaction concept is adequately disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences totaling about 60 words, with the core purpose front-loaded in the first sentence. Every sentence contributes: purpose, usage scenarios, and return value. No fluff or redundant phrasing.
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?
Given there is no output schema, the description covers what is returned (transaction_id and editable data). It does not spell out the transaction lifecycle (commit/cancel) or error conditions, but the sibling tools make the next steps predictable, and the description is sufficient for an agent to initiate the intended workflow.
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% for both parameters (design_id and user_intent), and each has a clear description in the schema. The tool description does not add new parameter-specific guidance beyond reiterating that it returns element data, which is output-related. Since the schema already documents parameters, a 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 opens with a specific verb ('Prepare') and resource ('an existing Canva design'), then states the outcome ('opening a draft transaction'). It enumerates exact use cases (text, media, titles, formatting, autofill labels) and clarifies it is for preparing changes or inspecting elements, distinguishing it from read-only tools like get-design-content and from the commit/cancel 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?
The description explicitly says 'Use to prepare changes...' and 'or inspect the editable text and media elements before changing them,' which gives clear when-to-use context. It does not explicitly name alternatives or exclusions, but the phrasing implies this is the prerequisite step before modification, and the sibling list makes the transaction flow obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track-event-lifecycleTrack event lifecycleCInspect
Internal tool for widget lifecycle telemetry.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | Job the widget was polling. Omit when the mount had no job. | |
| item_id | No | Stable slug from widget config, never free text. | |
| item_type | No | Kind of item that was clicked. | |
| event_type | Yes | ||
| job_status | No | What the widget displayed. Omit when the widget has no job. | |
| print_shown | No | True when this mount showed the Order Prints button. | |
| user_intent | No | Mandatory 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). | |
| widget_name | No | Wire name of the widget that rendered, e.g. "create-design". | |
| event_payload | No | JSON encoded lifecycle event payload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the safety profile is known. The description only adds that the writes are 'telemetry' about 'widget lifecycle' — no detail on side effects, permissions, ordering, or whether events are append-only. It does not contradict the annotations, but it adds little beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero padding or redundancy, so there is nothing to trim. However, one terse sentence is arguably undersized for a nine-parameter telemetry tool, so it sits at adequate rather than strong.
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 nine-parameter, three-enum event-tracking tool with no output schema, the description omits the lifecycle semantics it promises — what the three event types mean, ordering expectations, and the role of user_intent and event_payload. The rich schema covers field-level meaning, but the agent gets no conceptual frame for the tool.
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 89%, so the schema already documents nearly all nine parameters, including the enums for event_type and item_type. The description adds no parameter-level information at all, which is acceptable given the high coverage — baseline 3.
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 largely restates the name and title: 'track-event-lifecycle' becomes 'widget lifecycle telemetry.' The only added signal is the noun 'widget' and the word 'internal,' which narrows the domain slightly but does not state a concrete verb+resource action or distinguish it from anything.
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?
There is no when-to-use guidance, no preconditions, and no mention of alternatives among the ~48 sibling tools. The phrase 'Internal tool' is a faint hint that this is not for general client use, but it does not tell an agent when to invoke it versus, say, generate-design or get-design.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload-asset-from-urlUpload Asset From URLAInspect
Import media from an existing public URL into Canva.
Use to upload a publicly hosted image, photo, logo, graphic, or video into Canva; add it to the user's Canva library or uploads; or save it for later use in a Canva design.
Only call with a public HTTPS URL whose content is already publicly accessible. Do not use for local, private, or agent-generated files. Does not place the imported media into a Canva design.
Returns a media_id for the imported file.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Existing public HTTPS URL of the image, photo, logo, graphic, or video to import into Canva. The media must already be publicly accessible at this URL. | |
| name | Yes | Name to give the imported media in Canva. | |
| user_intent | No | Mandatory 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, so it's a non-destructive write. The description adds meaningful context: it imports media, adds to library/uploads, returns a media_id, and does not place into a design. It also warns about URL accessibility, which is beyond the annotations. Slight gap: no mention of what happens on failure or whether it overwrites, but that's not critical.
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 four sentences, each earning its place: opening purpose, typical use cases, explicit constraints and exclusions, and return value. It is front-loaded with the core action and avoids fluff. Efficient and well-structured.
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 3-parameter tool with no output schema, the description covers the essentials: what it does, when to use it, constraints, and the return value (media_id). It also clarifies what it doesn't do. No critical missing information for an agent to call it correctly, though it could optionally mention error conditions or file type limitations.
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 provides 100% description coverage for all three parameters, including detailed descriptions for 'url' and 'name'. The tool description largely reiterates the URL requirement and adds the return of media_id, but doesn't add substantial new meaning beyond the schema. Baseline of 3 is appropriate given the high schema coverage.
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 action and resource: 'Import media from an existing public URL into Canva.' It clearly differentiates itself from siblings by noting 'Does not place the imported media into a Canva design,' which distinguishes it from import-design-from-url. The verb 'import' and the resource 'media' are unambiguous.
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 gives explicit guidance: 'Use to upload a publicly hosted image...' and 'Only call with a public HTTPS URL whose content is already publicly accessible. Do not use for local, private, or agent-generated files.' It also clarifies what the tool does not do (place into design). This is direct when-to-use and when-not-to-use guidance without requiring 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.
2 tool updates
- Changed
create-video1 field changed- changed
Output schema / properties / polling_policy / properties / instructions / descriptionPrevious 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."
- Changed
get-video-generation-status1 field changed- changed
Output schema / properties / polling_policy / properties / instructions / descriptionPrevious value: -"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay the 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. Follow the polling instructions, but do not repeat the initial generation-time notice unless explicitly instructed. While the status is pending or in_progress, continue polling and do not tell the user the video is available in Canva Projects; it appears there only after generation finishes."
2 tool updates
- Changed
create-video1 field changed- changed
Input schema / properties / video_title / descriptionPrevious 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."
- Changed
import-design-from-url1 field changed- changed
Input schema / properties / url / descriptionPrevious value: -"Public HTTPS URL for the source to convert. Does not accept Canva design URLs, OpenAI file URLs, local paths, private files, or agent-generated files. For static HTML, each top-level Canva page element must have data-document-role=\"page\" and page elements cannot be nested. Use optional data-label and data-speaker-notes attributes for page titles and presenter notes. Do not add page annotations to interactive HTML."New value: +"Existing public HTTPS URL for the source to convert. Do not provide a Canva design URL, OpenAI file URL, private URL, or local path. The content must already be publicly accessible. Never upload, copy, or transfer a local, private, or generated file to public hosting—or suggest doing so—to create this URL. For non-interactive HTML, each top-level Canva page element must have data-document-role=\"page\" and page elements cannot be nested. Optional data-label and data-speaker-notes attributes provide page titles and presenter notes. Do not add page annotations to interactive HTML."
1 tool update
- Changed
create-video2 fields changed- added
Input schema / properties / video_titleAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "video_generation_confirmed", - "production_spec" -]New value: +[ + "video_generation_confirmed", + "production_spec", + "video_title" +]
2 tool updates
- Changed
create-video3 fields changed- added
Output schema / properties / continuation_tokenAdded 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" +} - changed
Output schema / properties / polling_policy / properties / instructions / descriptionPrevious 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." - changed
Output schema / requiredPrevious value: -[ - "job_id", - "status", - "polling_policy" -]New value: +[ + "job_id", + "status", + "polling_policy", + "continuation_token" +]
- Changed
get-video-generation-status8 fields changed- added
Input schema / properties / continuation_tokenAdded value: +{ + "description": "The continuation_token from the most recent create-video or get-video-generation-status response.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "job_id" -]New value: +[ + "job_id", + "continuation_token" +] - added
Output schema / properties / continuation_tokenAdded value: +{ + "description": "Opaque token to pass on the next poll. Always use the most recent token.", + "type": "string" +} - added
Output schema / properties / messageAdded value: +{ + "description": "Human-readable delayed-state guidance suitable to relay to the user. Present when status is 'delayed'.", + "type": "string" +} - changed
Output schema / properties / polling_policy / properties / instructions / descriptionPrevious value: -"Instructions for polling this job and communicating what happens next. They MUST be followed. Relay the 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 generation-time expectation and Canva Projects link to the user, then continue polling as instructed while polling_policy is present." - added
Output schema / properties / projects_urlAdded value: +{ + "description": "Canva Projects destination where a delayed video will appear when it is ready. Present when status is 'delayed'; share it with the user.", + "format": "uri", + "type": "string" +} - changed
Output schema / properties / status / descriptionPrevious value: -"Status of the job. While 'pending' or 'in_progress', poll again with the same job_id\nafter waiting polling_policy.wait_seconds. 'completed' carries the video; 'failed'\ncarries the failure."New value: +"Status of the job. While 'pending' or 'in_progress', poll again with the same job_id\nand the updated continuation_token after waiting polling_policy.wait_seconds. 'completed' carries the video. 'delayed'\nmeans automatic polling has stopped after 20 minutes but generation may still be\nrunning; direct the user to projects_url. 'failed' carries the failure.\n'polled_too_early' means you called before the wait window elapsed — wait polling_policy.wait_seconds, then poll again with the same job_id and continuation_token." - changed
Output schema / properties / status / enumPrevious value: -[ - "pending", - "in_progress", - "completed", - "failed" -]New value: +[ + "pending", + "in_progress", + "polled_too_early", + "completed", + "delayed", + "failed" +]
4 tool updates
- Changed
create-video6 fields changed- changed
Input schema / properties / production_spec / descriptionPrevious 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." - changed
Input schema / properties / production_spec / properties / audio / anyOfPrevious 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" + } +] - changed
Input schema / properties / production_spec / properties / reference_images / items / properties / source / anyOfPrevious 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" + } +] - added
Input schema / properties / video_generation_confirmedAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "production_spec" -]New value: +[ + "video_generation_confirmed", + "production_spec" +] - changed
Output schema / properties / polling_policy / properties / instructions / descriptionPrevious 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."
- Changed
get-video-generation-status3 fields changed- changed
Output schema / properties / failure / descriptionPrevious value: -"Why the job failed. Only present when status is 'failed'."New value: +"Why the job failed. Only present when status is 'failed'. Tell the user and do not automatically call create-video again." - changed
Output schema / properties / polling_policy / properties / instructions / descriptionPrevious 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 generation-time expectation and Canva Uploads link to the user, then continue polling as instructed while polling_policy is present." - changed
Output schema / properties / polling_policy / properties / wait_seconds / descriptionPrevious value: -"The number of seconds you MUST wait before calling get-video-generation-status again. Polling sooner returns the same answer and does not make the video arrive sooner. The value falls as the job advances, so read it from every response rather than assuming a fixed interval."New value: +"The number of seconds you MUST wait before calling get-video-generation-status again. Polling sooner returns the same answer and does not make the video arrive sooner. Read it from every response."
- Changed
get-video-production-guide1 field changed- changed
Input schema / properties / production_guide_id / descriptionPrevious value: -"Exact production_guide_id returned by this tool's catalog. Omit to discover patterns; provide to read the detailed director guide. Never guess an ID."New value: +"Omit to list the available guides. Pass an exact production_guide_id returned by the list to retrieve the selected guide's planning instructions. Never guess an ID."
- Changed
perform-editing-operations1 field changed- changed
Input schema / properties / operations / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "title": { - "description": "The new title for the design", - "type": "string" - }, - "type": { - "const": "update_title", - "type": "string" - } - }, - "required": [ - "type", - "title" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the element to replace the text of.", - "type": "string" - }, - "text": { - "description": "The new text to replace the existing text with.", - "type": "string" - }, - "type": { - "const": "replace_text", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "alt_text": { - "description": "The alternate text of the new asset", - "type": "string" - }, - "asset_id": { - "description": "ID of the asset", - "maxLength": 50, - "minLength": 1, - "pattern": "^[a-zA-Z0-9_-]+$", - "type": "string" - }, - "asset_type": { - "description": "The type of the new asset", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "element_id": { - "description": "The ID of the image or video element whose fill should be replaced.", - "type": "string" - }, - "type": { - "const": "update_fill", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "asset_type", - "asset_id", - "alt_text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "alt_text": { - "description": "The alternate text of the asset", - "type": "string" - }, - "asset_id": { - "description": "ID of the asset", - "maxLength": 50, - "minLength": 1, - "pattern": "^[a-zA-Z0-9_-]+$", - "type": "string" - }, - "asset_type": { - "description": "The type of the asset to insert", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "height": { - "description": "Height in pixels. Must be > 0. If not specified, a default height will be used", - "exclusiveMinimum": 0, - "type": "number" - }, - "left": { - "description": "Left position in pixels. If not specified, a default position will be used", - "type": "number" - }, - "opacity": { - "description": "Opacity value. Range: [0, 1], default: 1", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "page_id": { - "description": "The ID of the page to insert the fill into", - "type": "string" - }, - "rotation": { - "description": "Rotation in degrees. Range: [-180.0, 180.0], default: 0", - "maximum": 180, - "minimum": -180, - "type": "number" - }, - "top": { - "description": "Top position in pixels. If not specified, a default position will be used", - "type": "number" - }, - "type": { - "const": "insert_fill", - "type": "string" - }, - "width": { - "description": "Width in pixels. Must be > 0. If not specified, a default width will be used", - "exclusiveMinimum": 0, - "type": "number" - } - }, - "required": [ - "type", - "page_id", - "asset_type", - "asset_id", - "alt_text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the element to delete.", - "type": "string" - }, - "type": { - "const": "delete_element", - "type": "string" - } - }, - "required": [ - "type", - "element_id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the element to find and replace the text in.", - "type": "string" - }, - "find_text": { - "description": "The text that is needs to be found to be replaced.", - "type": "string" - }, - "replace_text": { - "description": "The new text to replace the existing text with.", - "type": "string" - }, - "type": { - "const": "find_and_replace_text", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "find_text", - "replace_text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the element to reposition.", - "type": "string" - }, - "left": { - "description": "Left position in pixels (relative to page).", - "type": "number" - }, - "top": { - "description": "Top position in pixels (relative to page).", - "type": "number" - }, - "type": { - "const": "position_element", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "top", - "left" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Resizes an existing element (image, video, text, etc.) to a new size on the page. IMPORTANT: For TEXT elements, only specify width (height is auto-calculated). For IMAGE/VIDEO elements: if preserve_aspect_ratio=true, specify ONLY width OR height (the other is calculated); if preserve_aspect_ratio=false, specify both width and height.", - "properties": { - "element_id": { - "description": "The ID of the element to resize.", - "type": "string" - }, - "height": { - "description": "The height in pixels of the element. For TEXT elements: do NOT provide height - it will be automatically calculated. For other elements: if preserve_aspect_ratio is true, provide either width OR height (not both) - the other dimension will be calculated. If preserve_aspect_ratio is false, provide both width and height.", - "type": "number" - }, - "preserve_aspect_ratio": { - "default": false, - "description": "Whether to preserve the aspect ratio of the element. If true, provide only ONE dimension (width or height) - the other will be calculated automatically. If false, provide both dimensions.", - "type": "boolean" - }, - "type": { - "const": "resize_element", - "type": "string" - }, - "width": { - "description": "The width in pixels of the element. Required unless preserve_aspect_ratio is true and height is provided.", - "type": "number" - } - }, - "required": [ - "type", - "element_id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the text element to format.", - "type": "string" - }, - "formatting": { - "additionalProperties": false, - "description": "The formatting options to apply to the text", - "properties": { - "color": { - "description": "Text color in hex format", - "pattern": "^#[0-9A-Fa-f]{6}$", - "type": "string" - }, - "decoration": { - "description": "Text decoration: none or underline", - "enum": [ - "none", - "underline" - ], - "type": "string" - }, - "font_size": { - "description": "The size of text in pixels. Must be between 1 and 800", - "maximum": 800, - "minimum": 1, - "type": "integer" - }, - "font_style": { - "description": "Font style: normal or italic", - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "font_weight": { - "description": "Font weight: normal or bold", - "enum": [ - "normal", - "bold" - ], - "type": "string" - }, - "line_height": { - "description": "Line height multiplier. Range: [0.5, 2.5]", - "maximum": 2.5, - "minimum": 0.5, - "type": "number" - }, - "link": { - "anyOf": [ - { - "const": "", - "type": "string" - }, - { - "format": "uri", - "type": "string" - } - ], - "description": "URL string. Setting to empty string removes any existing link" - }, - "list_level": { - "description": "List nesting level. 0 removes list formatting (not a list item). 1 is the outermost level, with higher values (e.g., 2, 3, etc.) increasing the nesting depth.", - "minimum": 0, - "type": "integer" - }, - "list_marker": { - "description": "List marker style (only applies when list_level > 0): none, disc, circle, square, decimal, lower-alpha, or lower-roman", - "enum": [ - "none", - "disc", - "circle", - "square", - "decimal", - "lower-alpha", - "lower-roman" - ], - "type": "string" - }, - "strikethrough": { - "description": "Strikethrough style: none or strikethrough", - "enum": [ - "none", - "strikethrough" - ], - "type": "string" - }, - "text_align": { - "description": "Text alignment: start, center, or end", - "enum": [ - "start", - "center", - "end" - ], - "type": "string" - } - }, - "type": "object" - }, - "type": { - "const": "format_text", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "formatting" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Connects or removes an autofill field label on a text or image element. This is only supported on fixed-page designs.", - "properties": { - "autofill_field_label": { - "description": "The autofill field label to connect to the element. Omit this property to remove an existing autofill field mapping.", - "type": "string" - }, - "element_id": { - "description": "The ID of the text or image element to connect to an autofill field.", - "type": "string" - }, - "type": { - "const": "update_autofill_field", - "type": "string" - } - }, - "required": [ - "type", - "element_id" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "title": { + "description": "The new title for the design", + "type": "string" + }, + "type": { + "const": "update_title", + "type": "string" + } + }, + "required": [ + "type", + "title" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the element to replace the text of.", + "type": "string" + }, + "text": { + "description": "The new text to replace the existing text with.", + "type": "string" + }, + "type": { + "const": "replace_text", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "alt_text": { + "description": "The alternate text of the new asset", + "maxLength": 250, + "type": "string" + }, + "asset_id": { + "description": "ID of the asset", + "maxLength": 50, + "minLength": 1, + "pattern": "^[a-zA-Z0-9_-]+$", + "type": "string" + }, + "asset_type": { + "description": "The type of the new asset", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "element_id": { + "description": "The ID of the image or video element whose fill should be replaced.", + "type": "string" + }, + "type": { + "const": "update_fill", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "asset_type", + "asset_id", + "alt_text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "alt_text": { + "description": "The alternate text of the asset", + "maxLength": 250, + "type": "string" + }, + "asset_id": { + "description": "ID of the asset", + "maxLength": 50, + "minLength": 1, + "pattern": "^[a-zA-Z0-9_-]+$", + "type": "string" + }, + "asset_type": { + "description": "The type of the asset to insert", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "height": { + "description": "Height in pixels. Must be > 0. If not specified, a default height will be used", + "exclusiveMinimum": 0, + "type": "number" + }, + "left": { + "description": "Left position in pixels. If not specified, a default position will be used", + "type": "number" + }, + "opacity": { + "description": "Opacity value. Range: [0, 1], default: 1", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "page_id": { + "description": "The ID of the page to insert the fill into", + "type": "string" + }, + "rotation": { + "description": "Rotation in degrees. Range: [-180.0, 180.0], default: 0", + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "top": { + "description": "Top position in pixels. If not specified, a default position will be used", + "type": "number" + }, + "type": { + "const": "insert_fill", + "type": "string" + }, + "width": { + "description": "Width in pixels. Must be > 0. If not specified, a default width will be used", + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "type", + "page_id", + "asset_type", + "asset_id", + "alt_text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the element to delete.", + "type": "string" + }, + "type": { + "const": "delete_element", + "type": "string" + } + }, + "required": [ + "type", + "element_id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the element to find and replace the text in.", + "type": "string" + }, + "find_text": { + "description": "The text that is needs to be found to be replaced.", + "type": "string" + }, + "replace_text": { + "description": "The new text to replace the existing text with.", + "type": "string" + }, + "type": { + "const": "find_and_replace_text", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "find_text", + "replace_text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the element to reposition.", + "type": "string" + }, + "left": { + "description": "Left position in pixels (relative to page).", + "type": "number" + }, + "top": { + "description": "Top position in pixels (relative to page).", + "type": "number" + }, + "type": { + "const": "position_element", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "top", + "left" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Resizes an existing element (image, video, text, etc.) to a new size on the page. IMPORTANT: For TEXT elements, only specify width (height is auto-calculated). For IMAGE/VIDEO elements: if preserve_aspect_ratio=true, specify ONLY width OR height (the other is calculated); if preserve_aspect_ratio=false, specify both width and height.", + "properties": { + "element_id": { + "description": "The ID of the element to resize.", + "type": "string" + }, + "height": { + "description": "The height in pixels of the element. For TEXT elements: do NOT provide height - it will be automatically calculated. For other elements: if preserve_aspect_ratio is true, provide either width OR height (not both) - the other dimension will be calculated. If preserve_aspect_ratio is false, provide both width and height.", + "type": "number" + }, + "preserve_aspect_ratio": { + "default": false, + "description": "Whether to preserve the aspect ratio of the element. If true, provide only ONE dimension (width or height) - the other will be calculated automatically. If false, provide both dimensions.", + "type": "boolean" + }, + "type": { + "const": "resize_element", + "type": "string" + }, + "width": { + "description": "The width in pixels of the element. Required unless preserve_aspect_ratio is true and height is provided.", + "type": "number" + } + }, + "required": [ + "type", + "element_id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the text element to format.", + "type": "string" + }, + "formatting": { + "additionalProperties": false, + "description": "The formatting options to apply to the text", + "properties": { + "color": { + "description": "Text color in hex format", + "pattern": "^#[0-9A-Fa-f]{6}$", + "type": "string" + }, + "decoration": { + "description": "Text decoration: none or underline", + "enum": [ + "none", + "underline" + ], + "type": "string" + }, + "font_size": { + "description": "The size of text in pixels. Must be between 1 and 800", + "maximum": 800, + "minimum": 1, + "type": "integer" + }, + "font_style": { + "description": "Font style: normal or italic", + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "font_weight": { + "description": "Font weight: normal or bold", + "enum": [ + "normal", + "bold" + ], + "type": "string" + }, + "line_height": { + "description": "Line height multiplier. Range: [0.5, 2.5]", + "maximum": 2.5, + "minimum": 0.5, + "type": "number" + }, + "link": { + "anyOf": [ + { + "const": "", + "type": "string" + }, + { + "format": "uri", + "type": "string" + } + ], + "description": "URL string. Setting to empty string removes any existing link" + }, + "list_level": { + "description": "List nesting level. 0 removes list formatting (not a list item). 1 is the outermost level, with higher values (e.g., 2, 3, etc.) increasing the nesting depth.", + "minimum": 0, + "type": "integer" + }, + "list_marker": { + "description": "List marker style (only applies when list_level > 0): none, disc, circle, square, decimal, lower-alpha, or lower-roman", + "enum": [ + "none", + "disc", + "circle", + "square", + "decimal", + "lower-alpha", + "lower-roman" + ], + "type": "string" + }, + "strikethrough": { + "description": "Strikethrough style: none or strikethrough", + "enum": [ + "none", + "strikethrough" + ], + "type": "string" + }, + "text_align": { + "description": "Text alignment: start, center, or end", + "enum": [ + "start", + "center", + "end" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": { + "const": "format_text", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "formatting" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Connects or removes an autofill field label on a text or image element. This is only supported on fixed-page designs.", + "properties": { + "autofill_field_label": { + "description": "The autofill field label to connect to the element. Omit this property to remove an existing autofill field mapping.", + "type": "string" + }, + "element_id": { + "description": "The ID of the text or image element to connect to an autofill field.", + "type": "string" + }, + "type": { + "const": "update_autofill_field", + "type": "string" + } + }, + "required": [ + "type", + "element_id" + ], + "type": "object" + } +]
1 tool update
- Changed
create-video3 fields changed- changed
Input schema / properties / production_spec / properties / output / properties / engine / enumPrevious value: -[ - "seedance", - "h3" -]New value: +[ + "seedance" +] - changed
Input schema / properties / production_spec / properties / output / properties / resolution / descriptionPrevious value: -"Exact engine-specific value: seedance=720p; h3=768P."New value: +"Seedance production resolution: 720p." - changed
Input schema / properties / production_spec / properties / output / properties / resolution / enumPrevious value: -[ - "720p", - "768P" -]New value: +[ + "720p" +]
3 tool updates
- Added
create-video - Added
get-video-generation-status - Added
get-video-production-guide
1 tool update
- Added
autofill-design
1 tool update
- Changed
track-event-lifecycle1 field changed- added
Input schema / properties / print_shownAdded value: +{ + "description": "True when this mount showed the Order Prints button.", + "type": "boolean" +}
4 tool updates
- Added
create-brand-template-draft - Added
get-design-dataset - Added
help - Added
publish-brand-template
1 tool update
- Changed
get-create-design-async-job2 fields changed- changed
Output schema / properties / failure / properties / code / descriptionPrevious value: -"Why the job failed. 'moderation_blocked' means the brief or a reference was declined by content moderation - tell the user and do not retry the same input. 'quota_exceeded' means the user is out of AI credits. 'throttled' means too many requests - retry later. 'invalid_input' will not succeed on retry without changing the request."New value: +"Why the job failed. 'moderation_blocked' means the brief or a reference was declined by content moderation - tell the user and do not retry the same input. 'feature_disabled' means design creation has been disabled by the user's admin - ask the user to contact their admin to enable it before trying again. 'quota_exceeded' means the user is out of AI credits. 'throttled' means too many requests - retry later. 'invalid_input' will not succeed on retry without changing the request." - changed
Output schema / properties / failure / properties / code / enumPrevious value: -[ - "moderation_blocked", - "quota_exceeded", - "throttled", - "invalid_input", - "internal_error" -]New value: +[ + "moderation_blocked", + "feature_disabled", + "quota_exceeded", + "throttled", + "invalid_input", + "internal_error" +]
9 tool updates
- Added
create-design - Added
generate-image - Added
get-create-design-async-job - Added
get-design-thumbnails - Added
get-generate-image-job - Added
get-separate-image-layers-job - Added
remove-background - Added
separate-image-layers - Added
track-event-lifecycle
1 tool update
- Changed
export-design2 fields changed- changed
Input schema / properties / format / properties / pages / descriptionPrevious value: -"Use for types: pdf, png, jpg, gif, pptx, mp4, csv. Page numbers to export (1-based). If not specified, all pages will be exported."New value: +"Page numbers to export (1-based). Draw these from the pages \"get-export-formats\" reported as available for this \"type\" on this design; when it reported no specific pages for this \"type\", any page is valid. Omit this field to export every page." - changed
Input schema / properties / format / properties / type / descriptionPrevious value: -"Format to export as. Use a type confirmed as supported by the selected design."New value: +"Format to export as. Use only a format that \"get-export-formats\" reported as supported for this design."
27 tool updates
- Changed
cancel-editing-transaction1 field changed- changed
Input schema / properties / transaction_id / descriptionPrevious value: -"The transaction ID of the editing transaction to cancel. This must be the exact `transaction_id` value returned in the `start-editing-transaction` tool response for the editing transaction to cancel."New value: +"Exact ID of the active editing transaction whose changes to discard. Use the transaction_id returned when that editing transaction was started."
- Changed
comment-on-design2 fields changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design to comment on. You can find the design ID by using the `search-designs` tool."New value: +"ID of the existing Canva design to comment on. Design IDs start with \"D\"." - changed
Input schema / properties / message_plaintext / descriptionPrevious value: -"The text content of the comment to add"New value: +"The text content of the comment to add."
- Changed
commit-editing-transaction1 field changed- changed
Input schema / properties / transaction_id / descriptionPrevious value: -"The transaction ID of the editing transaction to commit. This must be the exact `transaction_id` value returned in the `start-editing-transaction` tool response for the editing transaction to commit."New value: +"Exact ID of the active editing transaction whose draft changes should be saved."
- Changed
copy-design2 fields changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"The ID of the source design to copy."New value: +"ID of the existing Canva design to copy." - changed
Input schema / properties / page_numbers / descriptionPrevious value: -"Optional 1-based page numbers to include in the copy. Omit to copy all pages."New value: +"Pages to include in the new design, numbered from 1. For example, use [1, 3, 5] to copy pages 1, 3, and 5. Omit to copy every page."
- Changed
create-folder2 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"Name of the folder to create"New value: +"Name for the new Canva folder." - changed
Input schema / properties / parent_folder_id / descriptionPrevious value: -"ID of the parent folder. Use 'root' to create at the top level"New value: +"ID of the Canva folder that will contain the new folder. Use \"root\" to create the folder at the top level."
- Changed
export-design10 fields changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design to export. Design ID starts with \"D\"."New value: +"ID of the existing Canva design to export. Design IDs start with \"D\"." - changed
Input schema / properties / format / descriptionPrevious value: -"Format options for the export"New value: +"Export settings for the downloadable file." - changed
Input schema / properties / format / properties / as_single_image / descriptionPrevious value: -"Use for types: png. When true, multi-page designs are merged into a single image"New value: +"Optional PNG setting. True merges a multi-page design into one image." - changed
Input schema / properties / format / properties / export_quality / descriptionPrevious value: -"Use for types: pdf, png, jpg, gif, pptx, mp4. Export quality (regular or pro)"New value: +"Optional export quality for PDF, PNG, JPG, GIF, PPTX, or MP4." - changed
Input schema / properties / format / properties / height / descriptionPrevious value: -"Use for types: png, jpg, gif. Height of the exported image in pixels"New value: +"Optional output height in pixels for PNG, JPG, or GIF exports." - changed
Input schema / properties / format / properties / lossless / descriptionPrevious value: -"Use for types: png. Whether to use lossless compression (default: true)"New value: +"Optional PNG compression setting. True uses lossless compression; defaults to true." - changed
Input schema / properties / format / properties / size / descriptionPrevious value: -"Use for types: pdf. Paper size for PDF export"New value: +"Optional paper size for PDF exports." - changed
Input schema / properties / format / properties / transparent_background / descriptionPrevious value: -"Use for types: png. Whether to use a transparent background (default: false)"New value: +"Optional PNG background setting. True exports a transparent background; defaults to false." - changed
Input schema / properties / format / properties / type / descriptionPrevious value: -"Format to export the design as."New value: +"Format to export as. Use a type confirmed as supported by the selected design." - changed
Input schema / properties / format / properties / width / descriptionPrevious value: -"Use for types: png, jpg, gif. Width of the exported image in pixels"New value: +"Optional output width in pixels for PNG, JPG, or GIF exports."
- Changed
get-assets2 fields changed- changed
Input schema / properties / asset_ids / descriptionPrevious value: -"Required array of asset IDs to get the asset metadatas of, as part of this call."New value: +"IDs of the images or videos to inspect. When checking which media is the target on a page, include every image and video ID from that page." - changed
Input schema / properties / asset_ids / items / descriptionPrevious value: -"ID of the asset"New value: +"ID of an image or video to inspect."
- Changed
get-design1 field changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design to get information for, or a full Canva design share URL"New value: +"ID of the existing Canva design, usually returned by a previous Canva tool. Also accepts a full Canva design share URL, including any collaboration token. Do not extract the ID from a share URL. Does not accept a Canva shortlink; resolve it to its full URL first."
- Changed
get-design-content1 field changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design to get content of, or a full Canva design share URL"New value: +"ID of the existing Canva design whose rich text you want to retrieve, usually returned by a previous Canva tool. You can also provide a full Canva design share URL exactly as received; this preserves any collaboration token needed for access. Resolve Canva shortlinks before using this field."
- Changed
get-design-pages3 fields changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"The design ID to get pages from, or a full Canva design share URL"New value: +"ID of the existing Canva design, usually returned by a previous Canva tool. You can also provide a full Canva design share URL, including its collaboration token. Resolve Canva shortlinks before using this field." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of pages to return (for pagination)"New value: +"Maximum number of pages to return, from 1 to 100. Use with \"offset\" to retrieve the next range of pages." - changed
Input schema / properties / offset / descriptionPrevious value: -"The page index to start the range of pages to return, for pagination. The first page in a design has an index value of 1"New value: +"Page number to start from. Use for pagination; for example, use 21 to start at page 21."
- Changed
get-presenter-notes1 field changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design to get presenter notes from"New value: +"ID of the existing Canva presentation whose presenter notes you want to retrieve."
- Changed
import-design-from-url3 fields changed- changed
Input schema / properties / intended_design_type / descriptionPrevious value: -"The design type the user appears to want to create from this URL. Choose the closest match based on the user request and the URL. If unclear, omit this field. Use other only when the intended design type is clear but none of the listed options fit."New value: +"Requested Canva output format. Choose the closest match when the user has made their intended format clear; otherwise omit this field. Use \"other\" only when the intended format is clear but is not listed." - changed
Input schema / properties / name / descriptionPrevious value: -"Name for the new design"New value: +"Name for the new Canva design." - changed
Input schema / properties / url / descriptionPrevious value: -"Public HTTPS URL to the file to import. MUST START WITH https://. Examples: https://example.com/file.pdf, https://example.com/site.zip, https://raw.githubusercontent.com/user/repo/main/design.zip CRITICAL: If user input is a local path (starts with /, C:\\, file://, or mentions Downloads/Documents/Desktop), DO NOT USE THIS TOOL. If it looks like a Canva design URL, DO NOT call this tool."New value: +"Public HTTPS URL for the source to convert. Does not accept Canva design URLs, OpenAI file URLs, local paths, private files, or agent-generated files. For static HTML, each top-level Canva page element must have data-document-role=\"page\" and page elements cannot be nested. Use optional data-label and data-speaker-notes attributes for page titles and presenter notes. Do not add page annotations to interactive HTML."
- Changed
list-brand-kits2 fields changed- changed
Input schema / properties / continuation / descriptionPrevious value: -"Token for getting the next page of results. Use the continuation token from the previous response."New value: +"Exact token returned by the previous Brand Kit search with the same query. Omit for a new search or browse." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of brand kits to return."New value: +"Maximum number of Brand Kits to return."
- Changed
list-comments3 fields changed- changed
Input schema / properties / continuation / descriptionPrevious value: -"\n Pagination token for the current search context.\n\n CRITICAL RULES:\n - ONLY set this parameter if the previous response included a continuation token.\n - If no continuation token was returned → OMIT this parameter completely. NEVER EVER fabricate a token.\n - Do not set to null, empty string, or any other value when no token was provided.\n\n Usage:\n - First request: omit this parameter\n - Previous response had continuation token: use that exact token\n - Previous response had NO continuation token: omit this parameter\n - New search query: omit this parameter\n "New value: +"Exact continuation token returned by the previous call for the same design. Omit for the first page." - changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design to get comments for. You can find the design ID using the `search-designs` tool."New value: +"ID of the existing Canva design whose comments to return. Design IDs start with \"D\"." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of comments to return (1-100). Defaults to 50 if not specified."New value: +"Maximum number of comments to return per page."
- Changed
list-folder-items4 fields changed- changed
Input schema / properties / continuation / descriptionPrevious value: -"\n Pagination token for the current search context.\n\n CRITICAL RULES:\n - ONLY set this parameter if the previous response included a continuation token.\n - If no continuation token was returned → OMIT this parameter completely. NEVER EVER fabricate a token.\n - Do not set to null, empty string, or any other value when no token was provided.\n\n Usage:\n - First request: omit this parameter\n - Previous response had continuation token: use that exact token\n - Previous response had NO continuation token: omit this parameter\n - New search query: omit this parameter\n "New value: +"Exact continuation token returned by the previous call with the same folder, filters, and sort order. Omit for the first page." - changed
Input schema / properties / folder_id / descriptionPrevious value: -"ID of the folder to list items from. Use 'root' to list items at the top level"New value: +"ID of the Canva folder to list. Use \"root\" to list items at the top level." - changed
Input schema / properties / item_types / descriptionPrevious value: -"Filter items by type. Can be 'design', 'folder', or 'image'"New value: +"Types of items to return. Omit to return designs, folders, and images." - changed
Input schema / properties / sort_by / descriptionPrevious value: -"Sort the items by creation date, modification date, or title"New value: +"Order the results by creation date, last modified date, or title, in ascending or descending order."
- Changed
list-replies4 fields changed- changed
Input schema / properties / comment_id / descriptionPrevious value: -"ID of the comment to list replies from. You can find comment IDs using the `list-comments` tool."New value: +"ID of the top-level comment whose replies to return." - changed
Input schema / properties / continuation / descriptionPrevious value: -"\n Pagination token for the current search context.\n\n CRITICAL RULES:\n - ONLY set this parameter if the previous response included a continuation token.\n - If no continuation token was returned → OMIT this parameter completely. NEVER EVER fabricate a token.\n - Do not set to null, empty string, or any other value when no token was provided.\n\n Usage:\n - First request: omit this parameter\n - Previous response had continuation token: use that exact token\n - Previous response had NO continuation token: omit this parameter\n - New search query: omit this parameter\n "New value: +"Exact continuation token returned by the previous call for the same design and comment. Omit for the first page." - changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design containing the comment. You can find the design ID using the `search-designs` tool."New value: +"ID of the Canva design containing the comment. Design IDs start with \"D\"." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of replies to return (1-100). Defaults to 50 if not specified."New value: +"Maximum number of replies to return per page."
- Changed
merge-designs8 fields changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design to modify (required for modify_existing_design, must start with \"D\")."New value: +"ID of the existing Canva design whose pages will change. Required when \"type\" is \"modify_existing_design\". Design IDs start with \"D\"." - added
Input schema / properties / design_id / maxLengthAdded value: +11 - added
Input schema / properties / design_id / minLengthAdded value: +11 - added
Input schema / properties / design_id / patternAdded value: +"^D[a-zA-Z0-9_-]+$" - changed
Input schema / properties / operations / descriptionPrevious value: -"List of operations to perform. For create_new_design, only insert_pages operations are allowed. For modify_existing_design, all operation types are allowed."New value: +"Page operations to perform, in order. Each operation runs before the next, so page numbers refer to the design's updated page structure. When \"type\" is \"create_new_design\", only \"insert_pages\" operations are accepted. When \"type\" is \"modify_existing_design\", every operation type is accepted." - changed
Input schema / properties / operations / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "after_page_number": { - "description": "Insert after this page number (0 to insert at beginning, omit to append at end)", - "minimum": 0, - "type": "integer" - }, - "source": { - "additionalProperties": false, - "properties": { - "design_id": { - "description": "ID of the source design (must start with \"D\")", - "type": "string" - }, - "page_numbers": { - "description": "One-based page numbers to insert. If omitted, all pages are inserted.", - "items": { - "exclusiveMinimum": 0, - "type": "integer" - }, - "type": "array" - }, - "type": { - "const": "design", - "type": "string" - } - }, - "required": [ - "type", - "design_id" - ], - "type": "object" - }, - "type": { - "const": "insert_pages", - "type": "string" - } - }, - "required": [ - "type", - "source" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "from_page_numbers": { - "description": "One-based page numbers to move", - "items": { - "exclusiveMinimum": 0, - "type": "integer" - }, - "minItems": 1, - "type": "array" - }, - "to_after_page_number": { - "description": "Move pages to after this page number (0 to move to beginning)", - "minimum": 0, - "type": "integer" - }, - "type": { - "const": "move_pages", - "type": "string" - } - }, - "required": [ - "type", - "from_page_numbers", - "to_after_page_number" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "page_numbers": { - "description": "One-based page numbers to delete", - "items": { - "exclusiveMinimum": 0, - "type": "integer" - }, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "delete_pages", - "type": "string" - } - }, - "required": [ - "type", - "page_numbers" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "after_page_number": { + "description": "Insert after this 1-based page number. Use 0 to insert at the beginning, or omit to append to the end.", + "minimum": 0, + "type": "integer" + }, + "source": { + "additionalProperties": false, + "properties": { + "design_id": { + "description": "ID of the source design (must start with \"D\")", + "maxLength": 11, + "minLength": 11, + "pattern": "^D[a-zA-Z0-9_-]+$", + "type": "string" + }, + "page_numbers": { + "description": "One-based page numbers to insert. If omitted, all pages are inserted.", + "items": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "type": "array" + }, + "type": { + "const": "design", + "type": "string" + } + }, + "required": [ + "type", + "design_id" + ], + "type": "object" + }, + "type": { + "const": "insert_pages", + "type": "string" + } + }, + "required": [ + "type", + "source" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "from_page_numbers": { + "description": "Pages to move, using 1-based page numbers.", + "items": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "minItems": 1, + "type": "array" + }, + "to_after_page_number": { + "description": "Move the pages after this 1-based page number. Use 0 to move them to the beginning.", + "minimum": 0, + "type": "integer" + }, + "type": { + "const": "move_pages", + "type": "string" + } + }, + "required": [ + "type", + "from_page_numbers", + "to_after_page_number" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "page_numbers": { + "description": "One-based page numbers to delete", + "items": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "delete_pages", + "type": "string" + } + }, + "required": [ + "type", + "page_numbers" + ], + "type": "object" + } +] - changed
Input schema / properties / title / descriptionPrevious value: -"Title for the new design (required for create_new_design). Optional for modify_existing_design to rename the design."New value: +"Title for the new design. Required when \"type\" is \"create_new_design\". Optional when \"type\" is \"modify_existing_design\", where it renames the design." - changed
Input schema / properties / type / descriptionPrevious value: -"Whether to create a new design or modify an existing one. Use \"create_new_design\" to combine pages from multiple designs into a new design. Use \"modify_existing_design\" to insert, move, or delete pages in an existing design."New value: +"Whether to create a new design from pages in existing designs, or change the pages in one existing design."
- Changed
move-item-to-folder2 fields changed- changed
Input schema / properties / item_id / descriptionPrevious value: -"ID of the item to move (design, folder, or image)"New value: +"ID of the existing Canva design, folder, or image to move." - changed
Input schema / properties / to_folder_id / descriptionPrevious value: -"ID of the destination folder. Use 'root' to move to the top level"New value: +"ID of the destination Canva folder. Use \"root\" to move the item to the top level."
- Changed
perform-editing-operations1 field changed- changed
Input schema / properties / operations / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "title": { - "description": "The new title for the design", - "type": "string" - }, - "type": { - "const": "update_title", - "type": "string" - } - }, - "required": [ - "type", - "title" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the element to replace the text of.", - "type": "string" - }, - "text": { - "description": "The new text to replace the existing text with.", - "type": "string" - }, - "type": { - "const": "replace_text", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "alt_text": { - "description": "The alternate text of the new asset", - "type": "string" - }, - "asset_id": { - "description": "ID of the asset", - "maxLength": 50, - "minLength": 1, - "pattern": "^[a-zA-Z0-9_-]+$", - "type": "string" - }, - "asset_type": { - "description": "The type of the new asset", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "element_id": { - "description": "The ID of the element to replace the text of.", - "type": "string" - }, - "type": { - "const": "update_fill", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "asset_type", - "asset_id", - "alt_text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "alt_text": { - "description": "The alternate text of the asset", - "type": "string" - }, - "asset_id": { - "description": "ID of the asset", - "maxLength": 50, - "minLength": 1, - "pattern": "^[a-zA-Z0-9_-]+$", - "type": "string" - }, - "asset_type": { - "description": "The type of the asset to insert", - "enum": [ - "image", - "video" - ], - "type": "string" - }, - "height": { - "description": "Height in pixels. Must be > 0. If not specified, a default height will be used", - "exclusiveMinimum": 0, - "type": "number" - }, - "left": { - "description": "Left position in pixels. If not specified, a default position will be used", - "type": "number" - }, - "opacity": { - "description": "Opacity value. Range: [0, 1], default: 1", - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "page_id": { - "description": "The ID of the page to insert the fill into", - "type": "string" - }, - "rotation": { - "description": "Rotation in degrees. Range: [-180.0, 180.0], default: 0", - "maximum": 180, - "minimum": -180, - "type": "number" - }, - "top": { - "description": "Top position in pixels. If not specified, a default position will be used", - "type": "number" - }, - "type": { - "const": "insert_fill", - "type": "string" - }, - "width": { - "description": "Width in pixels. Must be > 0. If not specified, a default width will be used", - "exclusiveMinimum": 0, - "type": "number" - } - }, - "required": [ - "type", - "page_id", - "asset_type", - "asset_id", - "alt_text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the element to delete.", - "type": "string" - }, - "type": { - "const": "delete_element", - "type": "string" - } - }, - "required": [ - "type", - "element_id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the element to find and replace the text in.", - "type": "string" - }, - "find_text": { - "description": "The text that is needs to be found to be replaced.", - "type": "string" - }, - "replace_text": { - "description": "The new text to replace the existing text with.", - "type": "string" - }, - "type": { - "const": "find_and_replace_text", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "find_text", - "replace_text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the element to reposition.", - "type": "string" - }, - "left": { - "description": "Left position in pixels (relative to page).", - "type": "number" - }, - "top": { - "description": "Top position in pixels (relative to page).", - "type": "number" - }, - "type": { - "const": "position_element", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "top", - "left" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Resizes an existing element (image, video, text, etc.) to a new size on the page. IMPORTANT: For TEXT elements, only specify width (height is auto-calculated). For IMAGE/VIDEO elements: if preserve_aspect_ratio=true, specify ONLY width OR height (the other is calculated); if preserve_aspect_ratio=false, specify both width and height.", - "properties": { - "element_id": { - "description": "The ID of the element to resize.", - "type": "string" - }, - "height": { - "description": "The height in pixels of the element. For TEXT elements: do NOT provide height - it will be automatically calculated. For other elements: if preserve_aspect_ratio is true, provide either width OR height (not both) - the other dimension will be calculated. If preserve_aspect_ratio is false, provide both width and height.", - "type": "number" - }, - "preserve_aspect_ratio": { - "default": false, - "description": "Whether to preserve the aspect ratio of the element. If true, provide only ONE dimension (width or height) - the other will be calculated automatically. If false, provide both dimensions.", - "type": "boolean" - }, - "type": { - "const": "resize_element", - "type": "string" - }, - "width": { - "description": "The width in pixels of the element. Required unless preserve_aspect_ratio is true and height is provided.", - "type": "number" - } - }, - "required": [ - "type", - "element_id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "element_id": { - "description": "The ID of the text element to format.", - "type": "string" - }, - "formatting": { - "additionalProperties": false, - "description": "The formatting options to apply to the text", - "properties": { - "color": { - "description": "Text color in hex format", - "pattern": "^#[0-9A-Fa-f]{6}$", - "type": "string" - }, - "decoration": { - "description": "Text decoration: none or underline", - "enum": [ - "none", - "underline" - ], - "type": "string" - }, - "font_size": { - "description": "The size of text in pixels. Must be between 1 and 800", - "maximum": 800, - "minimum": 1, - "type": "integer" - }, - "font_style": { - "description": "Font style: normal or italic", - "enum": [ - "normal", - "italic" - ], - "type": "string" - }, - "font_weight": { - "description": "Font weight: normal or bold", - "enum": [ - "normal", - "bold" - ], - "type": "string" - }, - "line_height": { - "description": "Line height multiplier. Range: [0.5, 2.5]", - "maximum": 2.5, - "minimum": 0.5, - "type": "number" - }, - "link": { - "anyOf": [ - { - "const": "", - "type": "string" - }, - { - "format": "uri", - "type": "string" - } - ], - "description": "URL string. Setting to empty string removes any existing link" - }, - "list_level": { - "description": "List nesting level. 0 removes list formatting (not a list item). 1 is the outermost level, with higher values (e.g., 2, 3, etc.) increasing the nesting depth.", - "minimum": 0, - "type": "integer" - }, - "list_marker": { - "description": "List marker style (only applies when list_level > 0): none, disc, circle, square, decimal, lower-alpha, or lower-roman", - "enum": [ - "none", - "disc", - "circle", - "square", - "decimal", - "lower-alpha", - "lower-roman" - ], - "type": "string" - }, - "strikethrough": { - "description": "Strikethrough style: none or strikethrough", - "enum": [ - "none", - "strikethrough" - ], - "type": "string" - }, - "text_align": { - "description": "Text alignment: start, center, or end", - "enum": [ - "start", - "center", - "end" - ], - "type": "string" - } - }, - "type": "object" - }, - "type": { - "const": "format_text", - "type": "string" - } - }, - "required": [ - "type", - "element_id", - "formatting" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Connects or removes an autofill field label on a text or image element. This is only supported on fixed-page designs.", - "properties": { - "autofill_field_label": { - "description": "The autofill field label to connect to the element. Omit this property to remove an existing autofill field mapping.", - "type": "string" - }, - "element_id": { - "description": "The ID of the text or image element to connect to an autofill field.", - "type": "string" - }, - "type": { - "const": "update_autofill_field", - "type": "string" - } - }, - "required": [ - "type", - "element_id" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "title": { + "description": "The new title for the design", + "type": "string" + }, + "type": { + "const": "update_title", + "type": "string" + } + }, + "required": [ + "type", + "title" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the element to replace the text of.", + "type": "string" + }, + "text": { + "description": "The new text to replace the existing text with.", + "type": "string" + }, + "type": { + "const": "replace_text", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "alt_text": { + "description": "The alternate text of the new asset", + "type": "string" + }, + "asset_id": { + "description": "ID of the asset", + "maxLength": 50, + "minLength": 1, + "pattern": "^[a-zA-Z0-9_-]+$", + "type": "string" + }, + "asset_type": { + "description": "The type of the new asset", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "element_id": { + "description": "The ID of the image or video element whose fill should be replaced.", + "type": "string" + }, + "type": { + "const": "update_fill", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "asset_type", + "asset_id", + "alt_text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "alt_text": { + "description": "The alternate text of the asset", + "type": "string" + }, + "asset_id": { + "description": "ID of the asset", + "maxLength": 50, + "minLength": 1, + "pattern": "^[a-zA-Z0-9_-]+$", + "type": "string" + }, + "asset_type": { + "description": "The type of the asset to insert", + "enum": [ + "image", + "video" + ], + "type": "string" + }, + "height": { + "description": "Height in pixels. Must be > 0. If not specified, a default height will be used", + "exclusiveMinimum": 0, + "type": "number" + }, + "left": { + "description": "Left position in pixels. If not specified, a default position will be used", + "type": "number" + }, + "opacity": { + "description": "Opacity value. Range: [0, 1], default: 1", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "page_id": { + "description": "The ID of the page to insert the fill into", + "type": "string" + }, + "rotation": { + "description": "Rotation in degrees. Range: [-180.0, 180.0], default: 0", + "maximum": 180, + "minimum": -180, + "type": "number" + }, + "top": { + "description": "Top position in pixels. If not specified, a default position will be used", + "type": "number" + }, + "type": { + "const": "insert_fill", + "type": "string" + }, + "width": { + "description": "Width in pixels. Must be > 0. If not specified, a default width will be used", + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "type", + "page_id", + "asset_type", + "asset_id", + "alt_text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the element to delete.", + "type": "string" + }, + "type": { + "const": "delete_element", + "type": "string" + } + }, + "required": [ + "type", + "element_id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the element to find and replace the text in.", + "type": "string" + }, + "find_text": { + "description": "The text that is needs to be found to be replaced.", + "type": "string" + }, + "replace_text": { + "description": "The new text to replace the existing text with.", + "type": "string" + }, + "type": { + "const": "find_and_replace_text", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "find_text", + "replace_text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the element to reposition.", + "type": "string" + }, + "left": { + "description": "Left position in pixels (relative to page).", + "type": "number" + }, + "top": { + "description": "Top position in pixels (relative to page).", + "type": "number" + }, + "type": { + "const": "position_element", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "top", + "left" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Resizes an existing element (image, video, text, etc.) to a new size on the page. IMPORTANT: For TEXT elements, only specify width (height is auto-calculated). For IMAGE/VIDEO elements: if preserve_aspect_ratio=true, specify ONLY width OR height (the other is calculated); if preserve_aspect_ratio=false, specify both width and height.", + "properties": { + "element_id": { + "description": "The ID of the element to resize.", + "type": "string" + }, + "height": { + "description": "The height in pixels of the element. For TEXT elements: do NOT provide height - it will be automatically calculated. For other elements: if preserve_aspect_ratio is true, provide either width OR height (not both) - the other dimension will be calculated. If preserve_aspect_ratio is false, provide both width and height.", + "type": "number" + }, + "preserve_aspect_ratio": { + "default": false, + "description": "Whether to preserve the aspect ratio of the element. If true, provide only ONE dimension (width or height) - the other will be calculated automatically. If false, provide both dimensions.", + "type": "boolean" + }, + "type": { + "const": "resize_element", + "type": "string" + }, + "width": { + "description": "The width in pixels of the element. Required unless preserve_aspect_ratio is true and height is provided.", + "type": "number" + } + }, + "required": [ + "type", + "element_id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "element_id": { + "description": "The ID of the text element to format.", + "type": "string" + }, + "formatting": { + "additionalProperties": false, + "description": "The formatting options to apply to the text", + "properties": { + "color": { + "description": "Text color in hex format", + "pattern": "^#[0-9A-Fa-f]{6}$", + "type": "string" + }, + "decoration": { + "description": "Text decoration: none or underline", + "enum": [ + "none", + "underline" + ], + "type": "string" + }, + "font_size": { + "description": "The size of text in pixels. Must be between 1 and 800", + "maximum": 800, + "minimum": 1, + "type": "integer" + }, + "font_style": { + "description": "Font style: normal or italic", + "enum": [ + "normal", + "italic" + ], + "type": "string" + }, + "font_weight": { + "description": "Font weight: normal or bold", + "enum": [ + "normal", + "bold" + ], + "type": "string" + }, + "line_height": { + "description": "Line height multiplier. Range: [0.5, 2.5]", + "maximum": 2.5, + "minimum": 0.5, + "type": "number" + }, + "link": { + "anyOf": [ + { + "const": "", + "type": "string" + }, + { + "format": "uri", + "type": "string" + } + ], + "description": "URL string. Setting to empty string removes any existing link" + }, + "list_level": { + "description": "List nesting level. 0 removes list formatting (not a list item). 1 is the outermost level, with higher values (e.g., 2, 3, etc.) increasing the nesting depth.", + "minimum": 0, + "type": "integer" + }, + "list_marker": { + "description": "List marker style (only applies when list_level > 0): none, disc, circle, square, decimal, lower-alpha, or lower-roman", + "enum": [ + "none", + "disc", + "circle", + "square", + "decimal", + "lower-alpha", + "lower-roman" + ], + "type": "string" + }, + "strikethrough": { + "description": "Strikethrough style: none or strikethrough", + "enum": [ + "none", + "strikethrough" + ], + "type": "string" + }, + "text_align": { + "description": "Text alignment: start, center, or end", + "enum": [ + "start", + "center", + "end" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": { + "const": "format_text", + "type": "string" + } + }, + "required": [ + "type", + "element_id", + "formatting" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Connects or removes an autofill field label on a text or image element. This is only supported on fixed-page designs.", + "properties": { + "autofill_field_label": { + "description": "The autofill field label to connect to the element. Omit this property to remove an existing autofill field mapping.", + "type": "string" + }, + "element_id": { + "description": "The ID of the text or image element to connect to an autofill field.", + "type": "string" + }, + "type": { + "const": "update_autofill_field", + "type": "string" + } + }, + "required": [ + "type", + "element_id" + ], + "type": "object" + } +]
- Changed
reply-to-comment3 fields changed- changed
Input schema / properties / comment_id / descriptionPrevious value: -"The ID of the comment to reply to. You can find comment IDs using the `list-comments` tool."New value: +"ID of the existing comment to reply to in the specified design." - changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design containing the comment. You can find the design ID by using the `search-designs` tool."New value: +"ID of the Canva design containing the comment. Design IDs start with \"D\"." - changed
Input schema / properties / message_plaintext / descriptionPrevious value: -"The text content of the reply to add"New value: +"The text content of the reply to add."
- Changed
resize-design2 fields changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design to resize. Design ID starts with \"D\"."New value: +"ID of the existing Canva design to resize. Design IDs start with \"D\"." - changed
Input schema / properties / design_type / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "Use this when resizing to a preset design type. Provide 'type: preset' and 'name'.", - "properties": { - "name": { - "description": "The preset design type name. Options: 'presentation', 'whiteboard'.", - "enum": [ - "presentation", - "whiteboard" - ], - "type": "string" - }, - "type": { - "const": "preset", - "type": "string" - } - }, - "required": [ - "type", - "name" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "Use this when resizing to custom dimensions. Provide 'type: custom', 'width', and 'height'.", - "properties": { - "height": { - "description": "Height of the design in pixels. Must be at least 1.", - "minimum": 1, - "type": "number" - }, - "type": { - "const": "custom", - "type": "string" - }, - "width": { - "description": "Width of the design in pixels. Must be at least 1.", - "minimum": 1, - "type": "number" - } - }, - "required": [ - "type", - "width", - "height" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "description": "Use this when resizing to a preset design type. Provide 'type: preset' and 'name'.", + "properties": { + "name": { + "description": "Preset canvas size for the new design. Use \"presentation\" for slides or \"whiteboard\" for a whiteboard.", + "enum": [ + "presentation", + "whiteboard" + ], + "type": "string" + }, + "type": { + "const": "preset", + "type": "string" + } + }, + "required": [ + "type", + "name" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Use this when resizing to custom dimensions. Provide 'type: custom', 'width', and 'height'.", + "properties": { + "height": { + "description": "Height of the new design in pixels.", + "minimum": 1, + "type": "number" + }, + "type": { + "const": "custom", + "type": "string" + }, + "width": { + "description": "Width of the new design in pixels.", + "minimum": 1, + "type": "number" + } + }, + "required": [ + "type", + "width", + "height" + ], + "type": "object" + } +]
- Changed
resolve-shortlink1 field changed- changed
Input schema / properties / shortlink_id / descriptionPrevious value: -"The shortlink ID to resolve (e.g., \"abc123\" from https://canva.link/abc123)"New value: +"ID from a Canva shortlink, excluding the domain and slashes. For example, use \"abc123\" for \"https://canva.link/abc123\"."
- Changed
search-brand-templates5 fields changed- changed
Input schema / properties / continuation / descriptionPrevious value: -"Token for getting the next page of results. Use the continuation token from the previous response."New value: +"Exact token returned by a previous search. Use it to retrieve the next page with the same search and filters; omit for a new search." - changed
Input schema / properties / dataset / descriptionPrevious value: -"Filter brand templates based on their dataset definition: 'any' for all templates, 'non_empty' for templates with dataset fields"New value: +"Filter by data-field availability. Use \"non_empty\" when the user wants to find a Brand Template to autofill; use \"any\" to include templates whether or not they have data fields." - changed
Input schema / properties / design_types / descriptionPrevious value: -"Filter brand templates by design type; a brand template is returned if it matches any of the given types. Currently only 'presentation' is supported."New value: +"Optional Brand Template types to include. A Brand Template is returned if it matches at least one specified type. Currently supports \"presentation\" only." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of brand templates to return per page."New value: +"Maximum number of Brand Templates to return in one page." - changed
Input schema / properties / query / descriptionPrevious value: -"Optional search query to filter brand templates"New value: +"Optional title or type to search for. Provide only when the user explicitly names or describes the Brand Template they want; otherwise omit or pass an empty string to browse all available Brand Templates."
- Changed
search-designs5 fields changed- changed
Input schema / properties / continuation / descriptionPrevious value: -"\n Pagination token for the current search context.\n\n CRITICAL RULES:\n - ONLY set this parameter if the previous response included a continuation token.\n - If no continuation token was returned → OMIT this parameter completely. NEVER EVER fabricate a token.\n - Do not set to null, empty string, or any other value when no token was provided.\n\n Usage:\n - First request: omit this parameter\n - Previous response had continuation token: use that exact token\n - Previous response had NO continuation token: omit this parameter\n - New search query: omit this parameter\n "New value: +"The exact token returned by the previous search with the same query, filters, and sort order. Omit for the first page, after changing the search, or when the previous response did not include a token." - changed
Input schema / properties / design_types / descriptionPrevious value: -"Filter designs by design type; a design is returned if it matches any of the given types. Currently only 'presentation' is supported."New value: +"Optional design types to include. A design is returned if it matches any supplied type. Currently, only \"presentation\" is supported." - changed
Input schema / properties / ownership / descriptionPrevious value: -"Filter designs by ownership: 'any' for all designs owned by and shared with you (default), 'owned' for designs you created, 'shared' for designs shared with you"New value: +"Whose designs to search. Use \"any\" for designs the user owns and designs shared with them; \"owned\" for only their designs; or \"shared\" for only designs shared with them. Omit to use \"any\"." - changed
Input schema / properties / query / descriptionPrevious value: -"Optional search term to filter designs by title or content. If it is used, 'sortBy' must be set to 'relevance'."New value: +"Optional text to match against a design's title or content. Use the user's keywords, such as a project name, topic, or phrase. If supplied, \"sort_by\" must be \"relevance\"." - changed
Input schema / properties / sort_by / descriptionPrevious value: -"Sort results by: 'relevance' (default), 'modified_descending' (newest first), 'modified_ascending' (oldest first), 'title_descending' (Z-A), 'title_ascending' (A-Z). Optional sort order for results. If 'query' is used, 'sortBy' must be set to 'relevance'."New value: +"How to order results. Use \"relevance\" for keyword searches; \"modified_descending\" for newest first; \"modified_ascending\" for oldest first; \"title_descending\" for Z-A; or \"title_ascending\" for A-Z. Omit to use \"relevance\"."
- Changed
search-folders4 fields changed- changed
Input schema / properties / continuation / descriptionPrevious value: -"\n Pagination token for the current search context.\n\n CRITICAL RULES:\n - ONLY set this parameter if the previous response included a continuation token.\n - If no continuation token was returned → OMIT this parameter completely. NEVER EVER fabricate a token.\n - Do not set to null, empty string, or any other value when no token was provided.\n\n Usage:\n - First request: omit this parameter\n - Previous response had continuation token: use that exact token\n - Previous response had NO continuation token: omit this parameter\n - New search query: omit this parameter\n "New value: +"Exact continuation token returned by the previous call with the same search query and ownership filter. Omit for the first page." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of folders to return per query"New value: +"Maximum number of folders to return per page." - changed
Input schema / properties / ownership / descriptionPrevious value: -"Filter folders by ownership type: 'any' (default), 'owned' (user-owned only), or 'shared' (shared with user only)"New value: +"Which folders to return. Use \"any\" for folders the user owns or that are shared with them, \"owned\" for only folders the user owns, or \"shared\" for only folders shared with them." - changed
Input schema / properties / query / descriptionPrevious value: -"Search query to match against folder names and tags"New value: +"Text to match against folder names and tags. Omit to browse all of the user's available folders."
- Changed
start-editing-transaction1 field changed- changed
Input schema / properties / design_id / descriptionPrevious value: -"ID of the design to start an editing transaction for"New value: +"ID of the existing Canva design to edit. Design IDs start with \"D\"."
- Changed
upload-asset-from-url2 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"Name for the uploaded asset"New value: +"Name to give the imported media in Canva." - changed
Input schema / properties / url / descriptionPrevious value: -"URL of the asset to upload into Canva"New value: +"Existing public HTTPS URL of the image, photo, logo, graphic, or video to import into Canva. The media must already be publicly accessible at this URL."
1 tool update
- Added
create-upload-url
1 tool update
- Added
get-design
1 tool update
- Removed
get-design
Publisher details
- Operator
- Canva · Publisher source
- Operator website
- https://www.canva.com/ · Publisher source
- Vendor relationship
- Not applicable
- Documentation
- https://www.canva.dev/docs/apps/mcp/ · Publisher source
- Trust center
- https://trust.canva.com/ · Publisher source
- Restrictions
- Rate limits and plan requirements provided by tool · Publisher source
Related MCP Connectors
Meta Ads and Google Ads MCP server: 250+ tools for Claude, ChatGPT, Cursor and Codex.
The Figma MCP server brings Figma design context directly into your AI workflow.
The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
- FlicenseDqualityDmaintenanceA comprehensive Model Context Protocol (MCP) server for interacting with Canva's API. It enables managing designs, brands, assets, and users through natural language.98-
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for Canva integration. Connect Claude Code or any MCP-compatible AI client to your Canva account to search designs, generate AI designs, edit content, manage folders, and collaborate through comments.2MIT
- AlicenseAqualityCmaintenanceEducational MCP server that connects AI agents to the Canva Connect API, enabling design search, creation, and export through natural language.3MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with the Canva Connect REST API, supporting design creation, brand template autofill, asset uploads, folder management, and design exports to PDF, PNG, JPG, PPTX, and MP4.-
Glama MCP Gateway
Add one secure layer between your agents and this server.