Canvora MCP
OfficialA conversational design assistant that creates, edits, localizes, and exports on-brand visuals in 100+ formats and 150+ languages.
Chat & plan — stateful conversation with Canvora's AI to turn an idea, text, or URL into a visual plan with suggested formats
Generate visuals — confirm and run a generation with overrides for formats, brand kit, style, language, resolution (2K/4K), slide counts, logo, CTA, exact content, embedded photos, and workspace
Track & retrieve — poll generation status and fetch output URLs (omit ID for the most recent generation)
Edit images — two-step natural-language edits for text, colour, layout, and brand changes
Variations — produce fresh design takes on an existing generation (count applies per visual)
Localize — translate a generation into up to 10 languages (150+, incl. RTL/CJK) with layout preserved
Export & download — PDF, PPTX, or ZIP exports; direct image URLs; JPG/WebP/PNG conversion
Edit history — view versions and revert edits (free)
Photos & assets — upload base64 photos to embed; list formats, brand kits, and workspaces; check credit balance
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Canvora MCPgenerate a LinkedIn carousel from our latest blog post using the brand kit"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Install as a skill
npx skills add canvora/canvora-mcpCanvora — visuals for AI agents
Give your agent a design department. Turn any idea, URL, doc, or PDF into finished, on-brand visuals: 100+ formats (posts, carousels, decks, PDFs, ads, infographics, landing-page kits), generated natively in 150+ languages — including RTL and CJK. Brand kits keep every output in the client's colors, fonts, logo, and tone.
canvora generate --idea "5 tips for remote work" \
--format linkedin_carousel --slides linkedin_carousel=5 \
--brand $BRAND_ID --wait --json
# → 5 finished branded slides on CDN URLsYour agent writes the brief. Canvora does the design. The outputs are stable CDN URLs ready to post, embed, or hand to a scheduler (works great upstream of Postiz or any posting tool: generate → schedule, end to end agentic).
This repo is the agent-facing toolkit for Canvora:
Agent skills —
skills/: 12 task-specific skills, onenpx skills addinstalls all of them into Claude Code, Cursor, Codex, OpenCode, OpenClaw and 60+ agents.Skill
For
core: setup, generate loop, credits, refinement
Instagram carousels / swipe posts
LinkedIn document carousels + safe zones
pitch/sales/training decks, document → slides
multi-page PDFs: brochures, reports, one-pagers
a whole page's visual kit from its URL
paid social + display ad sets and variants
header, OG image and promo set from one post
process flows, comparisons, timelines, stats
one campaign → many languages
designs built around the user's own photos
edit, vary, localize and revert what exists
Remote MCP server — for Claude, ChatGPT, Cursor, and any MCP client. Nothing to install.
canvoraCLI — for shell-native agents, cron jobs, and CI. Zero dependencies.
The Canvora service itself is hosted; this repo contains client tooling, skills, and docs.
Related MCP server: designforyou
Option 1 — Skills + CLI (Claude Code, Cursor, Codex, OpenClaw, shell-native agents)
npx skills add canvora/canvora-mcp # installs the skills (they set up the CLI on first use)
# or just the CLI:
npm install -g @canvora/cli
export CANVORA_API_KEY=vd_... # create at canvora.ai → Integrations → API Keys (all plans, incl. Free)
# one atomic command: generates, polls, exits with the output URLs
canvora generate \
--idea "5 tips for remote work" \
--format linkedin_carousel --slides linkedin_carousel=5 \
--wait --jsonMore runnable recipes: examples/
Commands
Command | What it does |
| Create visuals from an |
| Same design, new language: translates an existing generation's visuals, layout untouched |
| Fresh takes on an existing generation's visuals |
| Natural-language edit of one visual (previews the change; |
| Check a generation and list its output URLs |
| Save all output files locally |
| All format IDs with dimensions (live catalog) |
| Your brand kits (pass one via |
| Credit balance (10 credits per visual, 15 per carousel/deck slide) |
Every command takes --json for machine-readable stdout; progress and errors go to stderr, so piping stays clean. Exit codes: 0 success, 1 failure, 2 usage error.
Generate flags
--idea "concept" short concept - Canvora develops it into content
--input "text" your full content text, used as the source material
--url <url> extract content from a webpage
--file-url <pdf-url> extract content from a PDF
--format <id>[,<id>...] output formats (see: canvora formats)
--slides <format>=<n> slide count for carousel/deck formats (1-10, default 5); match it to the item count your idea promises
--brand <uuid> apply a brand kit
--style <name> modern | minimal | bold | elegant | playful | corporate | creative | dark
--resolution 2K|4K 4K on paid plans
--language <code-or-name> visual text language ("es", "Spanish"); default: matches your input's language
--exact use --input text verbatim, no rewording (quotes, taglines)
--logo place the brand kit's logo on the visual (needs --brand)
--cta end a carousel/deck on a call-to-action slide
--no-text pure visual, no typography (backgrounds, hero imagery)
--freeform ignore format-specific art direction, use dimensions only
--landing-page with --url: read the page's sections and produce a matching
landingPage-* visual kit (Starter plan or higher)
--project <uuid> group outputs into a project/campaign
--workspace <uuid> bill a team workspace pool instead of your personal credits
--wait poll until done (--timeout 600, --poll 5 seconds)
--json machine-readable outputOption 2 — MCP (Claude, ChatGPT, any MCP client)
One remote server, OAuth sign-in, 16 tools your agent discovers on connect:
Server URL |
|
Claude | Settings → Connectors → Add custom connector → OAuth Client ID |
Claude Code plugin |
|
ChatGPT | Apps → search Canvora → Connect, then start a message with |
Registry |
|
Step-by-step: canvora.ai/help/integrations/mcp-setup
stdio-only clients: mcp/ is a small stdio server that forwards every call to the remote server with your API key (same 16 tools, nothing generated locally):
{
"mcpServers": {
"canvora": {
"command": "node",
"args": ["/path/to/canvora-mcp/mcp/server.js"],
"env": { "CANVORA_API_KEY": "vd_..." }
}
}
}Run npm install in mcp/ first, or use the Dockerfile: docker build -t canvora-mcp . && docker run -i -e CANVORA_API_KEY=vd_... canvora-mcp.
Option 3 — Raw REST
curl -X POST https://api.canvora.ai/api/generations \
-H "X-API-Key: vd_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"inputType": "text",
"inputContent": "5 tips for remote work",
"outputFormats": ["linkedin_carousel"],
"carouselCounts": {"linkedin_carousel": 5}
}'Full API guide: canvora.ai/help/integrations/api-keys
What agents build with this
Client content pipelines — brief in, branded multi-format campaign out, scheduled by your posting tool
Multilingual campaigns — generate once,
canvora localizeinto 10 markets; layout survives, text goes native (skill)Save-optimized carousels — hook-first structure and per-slide art direction encoded as a skill (skill)
Docs → decks — point
--file-urlat a PDF report, get presentation slidesAd sets —
ad_square,ad_landscape,ad_portraitfrom one product URL, all placements covered
Built to be called by software
Predictable costs — flat credit pricing (10/visual, 15/slide);
canvora creditsbefore big jobs; failed generations auto-refund.Human in the loop — everything your agent creates also lands in your Canvora dashboard, ready for review, editing, and export before it goes anywhere.
Scoped, revocable keys — hashed at rest, per-key usage tracking, one-click revoke.
Outputs on a CDN — stable URLs your agent can post, embed, or hand to a scheduler.
Works on every plan — API and MCP access included on Free (free credits, no card).
Links
canvora.ai/for-agents — the agent overview
MIT licensed (CLI, skills, and docs in this repo).
Available Tools
16 toolschatChat with CanvoraAInspect
Send a message to Canvora's AI visual creation assistant. This is the primary tool for CREATING visuals — describe what you want (text content, a URL, an idea) and Canvora will analyze it, suggest formats, and prepare a generation.
Do NOT use this tool to retrieve or display existing/past generations — use get_generation instead (omit generation_id to fetch the user's most recent generation). Do NOT use it for variations (create_variation), translations (localize_generation), or exports (export_visuals) of existing work.
The conversation is stateful — Canvora remembers context across messages. When ready, it returns generation parameters that you should present to the user for review before confirming with confirm_generation.
Examples:
"Create a LinkedIn carousel about remote work benefits"
"Make an infographic from https://myblog.com/article"
"I need social media visuals for a product launch"
"Make it 5 slides instead, use bold style"
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| workspace_id | No | ||
| conversation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, openWorld=true, idempotent=false, destructive=false; the description adds that the conversation is stateful across messages and that the tool returns generation parameters requiring a confirm_generation step before anything is produced. That is real workflow context beyond the annotations, though it says nothing about credit consumption or failure behavior for a non-idempotent, open-world call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then exclusions, then workflow note, then compact examples. No filler sentences and each block carries distinct routing or behavioral 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?
Without an output schema, the description does well to explain that generation parameters come back and must be reviewed before confirm_generation. It is nearly complete for the create flow, but leaves the conversation/workspace parameters and the cost implications unexplained.
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 0% and the description never explains the three parameters: message is only implied through examples, while workspace_id and conversation_id are completely undocumented. The statefulness sentence hints that conversations persist but never tells the agent to pass conversation_id to continue one, which is a significant gap.
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 ("Send a message to Canvora's AI visual creation assistant") and explicitly scopes it as the primary creation entry point, which separates it from get_generation, create_variation, localize_generation and export_visuals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (describe text/URL/idea to create visuals) plus concrete when-NOT-to-use with each named sibling and the condition that selects it, including the tip to omit generation_id on get_generation for the latest result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_creditsCheck Credit BalanceARead-onlyIdempotentInspect
Check your current Canvora credit balance. Only call this when the user explicitly asks about their credits or balance.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds a genuine behavioral constraint (no proactive checks) beyond annotations. It does not describe what the response contains (balance units, remaining quota), leaving a small 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?
Two short sentences, zero filler, with the purpose front-loaded and the invocation constraint immediately following. Nothing could be removed 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?
For a zero-parameter read tool with full annotation coverage, the description covers purpose and gating adequately. The only absent detail is what the tool returns (e.g., numeric balance), which matters slightly since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics for the description to explain; the baseline applies. There is nothing incorrect or missing here.
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 ('Check your current Canvora credit balance') with clear scope. None of the siblings (list_formats, get_generation, list_workspaces, etc.) deal with credits, so the tool is unambiguously distinguishable.
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 gates invocation: 'Only call this when the user explicitly asks about their credits or balance.' This is a clear when-to-use rule rather than an implied one, which prevents speculative polling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_generationConfirm & Generate VisualsADestructiveInspect
Confirm and start a visual generation after the chat tool returns "READY TO GENERATE". Call this only after the user has reviewed and approved the generation settings.
You can pass overrides for in-place tweaks — style, brand, language, resolution, slide counts. Any parameter not provided uses the values from the chat conversation.
To CHANGE the format (especially to or from a carousel) or the content, call the chat tool again rather than overriding formats here — chat re-plans the design and recomputes the content-appropriate slide count. If you do override to a carousel format, you MUST include its carousel_counts, or the slide count won't match the content.
Returns a generation ID immediately. Generation runs in the background (30-120 seconds). You MUST then call get_generation with the returned ID to poll for completion — wait 15 seconds before the first call, then poll every 10-15 seconds until status is "completed".
IMPORTANT: Do NOT call confirm_generation again if it seems slow — that creates a duplicate generation and charges credits twice. Always use get_generation to check status instead.
The finished visuals are saved to the user's Canvora workspace (account and brand kit at canvora.ai) and are also returned as preview/downloadable URLs; poll get_generation to retrieve them.
| Name | Required | Description | Default |
|---|---|---|---|
| formats | No | ||
| brand_id | No | ||
| language | No | ||
| embed_logo | No | ||
| resolution | No | ||
| include_cta | No | ||
| visual_style | No | ||
| workspace_id | No | ||
| carousel_counts | No | ||
| conversation_id | Yes | ||
| design_style_id | No | ||
| embedding_photos | No | ||
| use_exact_content | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/openWorld/non-idempotent, and the description substantiates all three: it explains that duplicate calls create duplicate generations and double-charge credits, that work runs in the background for 30-120 seconds, and that a generation ID is returned immediately. It adds a concrete polling protocol (wait 15s, then every 10-15s until status "completed") and names the output destination (Canvora workspace plus preview/downloadable URLs) — none of which is inferable from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger condition and the override model, then the critical anti-duplication warning. It is long but nearly every sentence carries operational weight; the only waste is mild repetition of the get_generation polling instruction, which appears three times in slightly different framings.
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 credit-charging, non-idempotent mutation tool with 13 params and no output schema, the description gives a complete operational picture: trigger condition, override scope, re-plan escape hatch, async lifecycle, polling cadence, and where artifacts land. The remaining gap is per-parameter meaning, which is real but secondary to calling 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 description coverage is 0% across 13 parameters, so the description carries the full burden. It does name several in prose (style, brand, language, resolution, slide counts, formats implied via the carousel rule) and explains the default behavior of omitted params, but roughly half — conversation_id, workspace_id, design_style_id, embed_logo, include_cta, embedding_photos, use_exact_content — are never mentioned, including the sole required parameter.
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 — confirm and start a visual generation — and pins the precondition to an exact sentinel string returned by the chat tool ("READY TO GENERATE"). It is clearly distinguished from the chat sibling, which is named as the tool for re-planning design/content.
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-call (only after user reviewed and approved), explicit when-not (never re-call when slow), and an explicit alternative for a distinct case: format or content changes go back to chat, not to overrides here. It even states a hard constraint on the override path (carousel format requires carousel_counts).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_imageConvert Image FormatBInspect
Convert an image to JPG, WebP, or PNG format. Returns the converted image as a downloadable URL.
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | ||
| quality | No | ||
| image_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, open-world, non-idempotent, non-destructive, so the safety profile is covered. The description usefully adds that the result is returned as a downloadable URL rather than inline bytes, but says nothing about whether the converted file is persisted, whether repeated calls create duplicates, or any cost/latency implications.
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 tight sentences with the action and output front-loaded and no padding. It is arguably too short rather than verbose, but 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?
No output schema exists, and the description does cover the return (downloadable URL), which is the most important gap filled. However, with three undocumented parameters, no input constraints, and no mention of persistence or cost, an agent lacks enough to invoke it confidently beyond the happy path.
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 0%, so the description carries full burden, yet it never mentions the 'quality' parameter (default 90) or its valid range, nor what form image_url must take. Only the format enum is discoverable from the schema itself; the description adds nothing about any of the three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource ('Convert an image') with the target formats enumerated, which cleanly separates it from siblings like edit_image, upload_photo, and download_visual. It omits 'jpeg' though the schema enum accepts it, a small inconsistency an agent could trip on.
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?
No indication of when to prefer this over edit_image, export_visuals, or download_visual, and no preconditions (e.g., whether the source image must be hosted/accessible, or whether conversion consumes credits per the check_credits sibling). The agent must infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_variationCreate VariationsADestructiveInspect
Create fresh visual variations of an existing generation. Use this tool whenever the user asks for "variations", "alternatives", "different versions", or "more options" for an existing generation.
IMPORTANT: This is NOT the same as creating a new generation. This tool takes an existing generation_id and creates new visual designs from the same content. Do NOT use confirm_generation for variations — always use this tool.
SEMANTICS: variations are created for EVERY visual in the generation, and count applies PER VISUAL — count=2 on a generation with 2 visuals produces 4 new images. Tell the user the real total before or when starting. (To vary just one specific visual, the user can use the per-visual Variations option in their Canvora dashboard.)
Costs 10 credits per single image variation, 15 per carousel slide.
New variations are saved to the user's Canvora workspace (account and brand kit at canvora.ai) and are also returned as preview/downloadable URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| generation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing credit cost (10/image, 15/carousel slide), the multiplicative count semantics, where artifacts land (user's Canvora workspace) and that URLs are returned. This makes the non-idempotent, cost-incurring, destructiveHint=true profile actionable rather than just flagged.
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 action and trigger words, then behavior, then semantics and cost, with labeled sections. Slightly long and the IMPORTANT/confirm_generation warning partially repeats the opening distinction, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, yet the description covers return values (preview/downloadable URLs), persistence to the workspace, cost, and the visual multiplication rule. For a 2-parameter mutation tool this is sufficient to call correctly and set user expectations.
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 0%, so the description must carry the load and largely does: 'count applies PER VISUAL' with a concrete worked example (count=2 on 2 visuals yields 4 images) removes the main ambiguity, and the tool's purpose makes generation_id self-evident. Minor gap: no note on valid generation_id sources or bounds on count.
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 (create variations of an existing generation) and immediately separates itself from the two most confusable siblings: 'creating a new generation' and confirm_generation. An agent can route correctly from the first two sentences alone.
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 triggering language ('variations', 'alternatives', 'different versions', 'more options') plus a hard exclusion ('Do NOT use confirm_generation for variations') and points to the dashboard per-visual option for the narrower case. When-to-use, when-not-to-use, and the alternative are all spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_visualDownload VisualBRead-onlyIdempotentInspect
Get the download URL for a specific output from a completed generation. Returns the direct image URL that can be opened or downloaded. The visual stays stored in the Canvora workspace (canvora.ai).
| Name | Required | Description | Default |
|---|---|---|---|
| output_index | No | ||
| generation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive behavior. The description adds real value by clarifying that only a URL is returned (not the binary) and that the visual remains stored in the workspace — i.e., nothing is moved or deleted. It stops short of covering URL lifetime or auth requirements.
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, front-loaded with the core action, then the return value, then storage semantics. Little waste, though the third sentence is slightly tangential.
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 correctly tells the agent the return is a direct image URL, which is the key missing piece. However, for a two-parameter tool with 0% parameter documentation, the meaning of output_index and any URL expiry behavior are left unexplained.
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 0% and the description does not compensate: 'a specific output' hints at output_index but never states that it is a zero-based index defaulting to 0, and nothing explains the expected generation_id format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: get the download URL for a specific output of a completed generation. This is distinguishable from get_generation (metadata) and export_visuals (bulk export), though the differentiation is implied rather than stated explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from a completed generation' implies a prerequisite, but the description never names alternatives such as get_generation or export_visuals, nor says when to prefer one over the other. Usage is inferable rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_imageEdit ImageADestructiveInspect
Edit a visual in the user's Canvora workspace with a design operation. Pick the operation and describe the change in the instruction:
text: change, fix, translate, resize or restyle text on the design (e.g. "change the headline to 'Summer Sale'")
colour: colours, background colour, gradients, theme (e.g. "make the background dark blue")
layout: move, resize, align or remove elements, spacing, aspect ratio, decorative shapes or icons (e.g. "move the logo to the top right")
brand: add, move or replace the logo, apply brand colours or fonts (e.g. "apply our brand colours")
Edits that change what the image depicts — the subject, people, products or scene, or adding new imagery — are not available through this connector and are declined with a link to the Canvora editor.
This is a two-step flow:
First call with the operation and instruction — Canvora checks the edit and returns a refined edit plan for review
Second call with confirmed=true and the confirmed_instruction — executes the edit
Always show the user the edit plan before confirming.
The edited visual is saved to the user's Canvora workspace (account and brand kit at canvora.ai) and is also returned as a preview/downloadable URL.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | ||
| confirmed | No | ||
| operation | Yes | ||
| output_id | No | ||
| instruction | Yes | ||
| output_index | No | ||
| generation_id | No | ||
| source_image_url | No | ||
| confirmed_instruction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as destructive, open-world and non-idempotent; the description adds genuine context beyond them by disclosing the refine-then-confirm flow, that out-of-scope edits are declined with a link to the editor, and that the artifact is persisted to the user's workspace and returned as a URL. It stops short of mentioning credit consumption or that a sibling (revert_edit) exists to undo a destructive edit, which would have completed the risk picture.
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 cleanly organized into an operation bullet list, an exclusion note, the two-step flow, and an output note — each block earns its place. Slightly verbose in the closing sentence about accounts and brand kits, but no sentence 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?
For a nine-parameter destructive mutation with no output schema, the description covers the workflow, the safety gate, the scope limits and the return destination well. The one material hole is how to point the tool at an existing visual (source_image_url vs generation_id vs output_id), which no structured field explains and the description never addresses.
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 0%, so the description must carry the load, and it does well for the two required parameters — operation's four enum values are each defined with examples, and instruction is explained by analogy. But six of nine parameters (source_image_url, generation_id, output_id, output_index, format, and the instruction/confirmed_instruction relationship) are never explained, including the critical question of how the agent identifies which visual to edit.
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 ('Edit') and resource ('a visual in the user's Canvora workspace') and then enumerates the exact operation categories with examples, so an agent can tell this apart from convert_image, create_variation or localize_generation. It also explicitly bounds scope by naming what the tool will NOT do (subject/scene changes are declined), which is rare and useful.
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 per-operation selection guidance with concrete example instructions for each of the four enum values, states the mandatory two-step call sequence, and adds a hard procedural rule ('Always show the user the edit plan before confirming'). An agent has essentially no inference left to do about when and how to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_visualsExport VisualsAInspect
Export a completed generation as PDF, PowerPoint, or ZIP.
PDF: Ideal for LinkedIn carousel uploads (document posts)
PPTX: PowerPoint/Google Slides presentations
ZIP: Bulk download all images as PNG files
Returns a downloadable file URL; the source visuals remain in the user's Canvora workspace (account at canvora.ai).
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | ||
| generation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Useful additions beyond the annotations: the return value is a downloadable file URL, and the source visuals stay in the workspace, which supports the non-destructive read of annotations. But for an openWorldHint, non-idempotent export against an external account, nothing is said about credit consumption (despite a check_credits sibling), URL expiry, or repeated-export cost. The description adds context without covering the operational traits an agent would want.
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 purpose sentence followed by tightly scoped bullets; nothing is padded. Minor redundancy in listing the three formats in the header and then again as bullet labels, but each bullet adds decision-relevant 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?
With only two required params, no output schema, and no nested objects, the description covers the essentials: what comes back (a file URL) and what happens to source assets. It falls short on obtaining the generation_id, credit/cost implications, and the boundary with download_visual.
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 0%, so the description must carry the parameter meaning: it explains all three format enum values with use cases, which is exactly the missing information. generation_id is only implicitly defined as a 'completed generation' reference, with no hint on where to obtain it (get_generation/confirm_generation siblings), leaving half the parameter set partially specified.
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?
A specific verb (export) plus resource (a completed generation) and explicit output formats, so the agent knows precisely what the tool produces. However, it never distinguishes itself from the sibling download_visual, which appears to overlap on retrieving generated assets.
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 'completed generation' precondition and the per-format guidance ('Ideal for LinkedIn carousel uploads', 'PowerPoint/Google Slides presentations', 'Bulk download all images as PNG') tell the agent which format to pick in which situation. No exclusions are stated and no alternative tool is named for cases where the generation isn't complete or the user just wants a single image.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_edit_historyGet Image Edit HistoryARead-onlyIdempotentInspect
Get the edit history of a generated image — original version plus every applied edit, with which version is current. Use before reverting an edit.
| Name | Required | Description | Default |
|---|---|---|---|
| output_id | No | ||
| output_index | No | ||
| generation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context by explaining what the result contains: original version, applied edits, and current version.
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 tight sentences with no wasted wording. The core purpose and the key usage rule are front-loaded.
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 adequately explains the conceptual return value despite there being no output schema. However, for a tool with three undocumented parameters, it leaves the agent without enough information to choose or supply identifiers 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?
The schema has 3 parameters with 0% description coverage and no required fields, yet the description does not explain what output_id, output_index, or generation_id mean or how they should be used. It therefore fails to compensate for the missing schema semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: get the edit history of a generated image. It also clarifies the return scope — original version plus every applied edit and the current version — and distinguishes it from the sibling revert_edit by tying its use to reverting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear usage condition: 'Use before reverting an edit.' This explicitly links the tool to the sibling revert_edit, but it does not spell out when not to use this tool or name other alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_generationGet Generation StatusARead-onlyIdempotentInspect
Get the status and outputs of a generation. Pass a generation_id to fetch that generation, or OMIT it to fetch the user's most recent generation (use this for "show me my last generation"). After calling confirm_generation, use this tool to poll for completion — poll every 10-15 seconds until status is "completed". Returns output image URLs when ready (outputs may arrive incrementally while status is "processing"). The visuals stay stored in the Canvora workspace (canvora.ai); the returned URLs can be previewed or downloaded in the chat.
| Name | Required | Description | Default |
|---|---|---|---|
| generation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description explains polling cadence, that outputs may arrive incrementally while processing, and that visuals persist in the Canvora workspace. These are meaningful behavioral details an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then layers on only actionable detail: ID behavior, polling guidance, incremental outputs, and storage context. Every sentence contributes 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?
No output schema exists, but the description covers return values adequately: output image URLs when ready, incremental arrival during processing, and where visuals are stored. Combined with annotations, an agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It fully explains the only parameter: generation_id fetches that generation, while omitting it fetches the user's most recent generation, including the exact user phrasing this supports.
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: 'Get the status and outputs of a generation.' It also differentiates the two modes (by ID vs. most recent), making the tool's purpose immediately clear relative to siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: pass generation_id to fetch a specific generation, omit it to fetch the user's most recent generation, and poll after confirm_generation every 10-15 seconds until completed. This is unusually complete routing information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_brandsList Brand KitsARead-onlyIdempotentInspect
List all brand kits in your Canvora account. Returns brand names, colors, fonts, logos, and tone. Use the brand ID with confirm_generation to apply brand styling.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a safe, idempotent read operation. The description adds useful content detail by listing the returned brand attributes: names, colors, fonts, logos, and tone. It omits pagination or ordering behavior, but the tool has no parameters and the annotation set carries the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences with no filler. The core action is front-loaded, followed immediately by return contents and a downstream usage hint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, the description supplies exactly what an agent needs: what is listed, what fields are returned, and how the result is used with confirm_generation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain. The description correctly does not invent parameter guidance and instead focuses on the returned data and downstream usage.
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: 'List all brand kits in your Canvora account.' It further distinguishes the tool by naming the sibling confirm_generation as the downstream consumer of brand IDs.
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 explains the practical use case: retrieve brand IDs to pass to confirm_generation for branded styling. It gives clear context but does not explicitly state when not to use this tool or name a competing alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_formatsList Visual FormatsARead-onlyIdempotentInspect
List the available visual formats with dimensions and categories. Canvora supports 100+ formats; use this to find the right format ID for confirm_generation.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds the scale fact (100+ formats), which is genuinely useful context, but says nothing about pagination or response size despite implying a large catalog.
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 sentences, front-loaded with the action and the return fields before the usage routing. Every clause 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?
With no output schema, the description correctly implies the return payload (format IDs, dimensions, categories), which is what an agent needs to chain into confirm_generation. The one gap is pagination or completeness behavior for a catalog advertised as 100+ entries.
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 0%, so the description should carry the weight, but it never mentions the category parameter or that results can be filtered by it. The enum values are self-explanatory and the default is 'all', which limits the damage, but the filtering behavior itself is left entirely to inference.
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 ("List the available visual formats") and names exactly what comes back (dimensions and categories). It also distinguishes itself from sibling tools by routing the agent to confirm_generation for the follow-up action.
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 an explicit reason to call it — finding the right format ID before calling confirm_generation — which is a clear use context, not implied. It does not state when not to use it (e.g. when an ID is already known), so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList WorkspacesARead-onlyIdempotentInspect
List your workspaces and personal account. Use this when the user wants to generate visuals for a specific team or workspace. Returns workspace IDs, names, your role, and credit balances.
Pass the workspace_id to the chat or confirm_generation tools to create visuals under that workspace (uses workspace credits instead of personal).
If the user doesn't mention a workspace, default to personal (no workspace_id needed).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive, closed-world operation. The description adds useful behavioral context beyond that: it returns workspace IDs, names, role, and credit balances, and using workspace_id switches credit usage from personal to workspace credits.
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 purposeful sentences: purpose and return values first, downstream usage second, default behavior last. There is no filler, and the most important routing information is front-loaded.
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 correctly explains what is returned. Together with annotations covering safety and the zero-parameter schema, it gives the agent everything needed to decide when to call this tool and how to use its output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero input parameters, so the baseline is 4. The description appropriately avoids discussing input parameters and instead explains how the returned workspace_id is used downstream.
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: 'List your workspaces and personal account.' It clearly distinguishes the workspaces resource from sibling list tools such as list_brands and list_formats.
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 an explicit trigger ('when the user wants to generate visuals for a specific team or workspace') and a clear default path when no workspace is mentioned. It also names the downstream tools that consume workspace_id, so the agent knows how this tool fits into a workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
localize_generationLocalize Visuals Into Multiple LanguagesADestructiveInspect
Translate the visuals of a completed generation into one or more target languages. Each visual is translated in place (image-to-image) — the layout, colors, fonts, icons and imagery stay EXACTLY the same, only the text changes language. Canvora supports 150+ languages including RTL scripts (Arabic, Hebrew, Urdu) and CJK.
Perfect for localizing a campaign: one LinkedIn carousel becomes Spanish, Japanese, Arabic and German variants in a single call.
Costs 10 credits per translated image, per language (a 6-slide deck into Spanish = 60 credits). Up to 10 languages per call. Returns one generation ID per language — poll each with get_generation until status is "completed".
This translates ALL visuals in the chosen generation. If more than one generation exists in the chat, localize the specific generation the user is referring to — ask which one if it is unclear.
SEMANTICS: this translates EVERY visual in the generation (each translated visual costs 10 credits). To translate just ONE visual (e.g. "translate the Instagram post to Spanish"), do NOT use this tool — use edit_image on that image with an instruction like "Translate all visible text in this image into Spanish", which translates only that visual.
IMPORTANT: Confirm the target languages with the user before calling.
Localized visuals are saved to the user's Canvora workspace (account and brand kit at canvora.ai) and are also returned as preview/downloadable URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| languages | Yes | ||
| generation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/openWorldHint annotations: quantifies cost (10 credits per image per language, with a worked 6-slide example), caps languages at 10, explains that every visual in the generation is translated, and describes where output lands (Canvora workspace plus preview/downloadable URLs). It also discloses the async pattern: one generation ID returned per language, poll each with get_generation.
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 cost, then the critical SEMANTICS/IMPORTANT blocks, so a skimming agent sees the routing rule. It is longer than average and repeats the translation scope (ALL visuals, single call) more than once, but every section carries operational value.
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 still explains the return shape (a generation ID per language, pollable via get_generation until 'completed') and the resulting artifacts. Cost, caps, side effects, and the sibling escape hatch are all present, so an agent can invoke it correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load: it explains that languages is an array of one or more targets (150+ supported, RTL/CJK, max 10 per call) and that generation_id refers to a completed generation inside a chat, with guidance to disambiguate when several exist. It does not specify exact language code format (e.g. BCP-47 vs. names), which is the one gap.
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 (translate the visuals of a completed generation into target languages) and immediately constrains it to in-place image-to-image translation of an existing generation. This clearly differentiates it from siblings like edit_image and create_variation.
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 the exclusion path: for a single visual, do NOT use this tool, use edit_image with a translation instruction. It also says to ask which generation when multiple exist and to confirm target languages with the user before calling, covering the main ambiguity cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revert_editRevert Image EditAIdempotentInspect
Revert a generated image to a previous edit version or to the original. Free — does not consume credits. Use get_edit_history first to find edit IDs. The reverted visual stays in the Canvora workspace (canvora.ai) and is returned as a preview/downloadable URL.
| Name | Required | Description | Default |
|---|---|---|---|
| edit_id | No | ||
| output_index | No | ||
| generation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds value beyond the annotations: the "Free — does not consume credits" cost signal is not in annotations, and the statement that the result stays in the Canvora workspace and is returned as a preview/downloadable URL discloses the output side-effect. Annotations already carry idempotent/non-destructive hints, and the description does not contradict them. It does not say what happens to the edit versions after a revert (still recoverable or discarded).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose first, then the cost signal, then the prerequisite, then the return shape. No filler or 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?
Return behavior is described in place of an output schema, which is good. However, with 0 required params and 0% schema coverage, an agent still cannot tell how to select between edit_id and generation_id, what output_index refers to, or what the default behavior is when no edit_id is supplied.
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 0% and the description only implicitly covers edit_id ("find edit IDs"). It says nothing about generation_id or output_index, nor what passing a null/absent edit_id does relative to "revert to the original", which is central to correct invocation given all 3 params are optional.
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 (revert) and resource (a generated image's edit) plus the two possible targets: a previous edit version or the original. This clearly separates it from edit_image (which creates a new edit) and get_edit_history (which reads history).
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?
"Use get_edit_history first to find edit IDs" gives an explicit prerequisite and names the sibling to call before this one. Missing is any statement of when NOT to revert (e.g. instead of re-editing), but the operational context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_photoUpload PhotoAInspect
Upload a photo (base64) to be embedded in generated visuals — product shots, event photos, headshots. Returns a CDN URL to pass as embedding_photos to confirm_generation. Used primarily by the setup widget.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| filename | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-read-only, non-idempotent, non-destructive, open-world operation. The description adds useful behavior by explaining that it accepts base64 data and returns a CDN URL for embedding_photos, but it omits constraints such as file size, accepted formats, auth needs, and error behavior.
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, immediately stating the upload action and then the return value and downstream usage. There is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully explains that the return value is a CDN URL to pass as embedding_photos. However, it remains incomplete regarding filename semantics and upload constraints, which is significant given the 0% schema description coverage.
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 0% for two parameters. The description explains that data is a base64 photo, but it gives no meaning for filename or its expected format/role, so it only partially compensates for the schema gap.
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 — uploading a photo — and explains its purpose: embedding photos into generated visuals. It also names the downstream use with confirm_generation, making the tool easy to distinguish from sibling tools like list_formats or get_generation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: photos are intended to be embedded in generated visuals and the returned CDN URL is passed as embedding_photos to confirm_generation. It also notes primary use by the setup widget, though it does not explicitly state when not to use it or name alternatives.
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.
16 tool updates
v0.1.0- First observed
chat - First observed
check_credits - First observed
confirm_generation - First observed
convert_image - First observed
create_variation - First observed
download_visual - First observed
edit_image - First observed
export_visuals - First observed
get_edit_history - First observed
get_generation - First observed
list_brands - First observed
list_formats - First observed
list_workspaces - First observed
localize_generation - First observed
revert_edit - First observed
upload_photo
TDQS
Scored across 16 tools
Most tools map cleanly to distinct actions on distinct resources (format listing, generation polling, editing, variations, localization, export, conversion), and descriptions explicitly cross-reference each other to steer selection (e.g. chat vs. get_generation, localize_generation vs. edit_image translate). The only real friction is get_generation vs. download_visual, both of which surface output URLs for a completed generation.
Nearly all names follow a consistent verb_noun snake_case pattern (list_formats, get_generation, confirm_generation, edit_image, export_visuals). The single outlier is `chat`, a bare noun that breaks the pattern and gives no hint of its action.
16 tools is on the high side but justified by a genuinely broad surface: creation, polling, editing, reversion, variations, localization, export, conversion, plus workspace/brand/credit context. No tool appears redundant enough to drop.
The lifecycle is well covered end-to-end from format discovery and planning through confirm, poll, edit/revert, vary, localize, export, and convert. Minor gaps exist: no way to list or enumerate past generations (only 'most recent' via an omitted ID) and no cancel/delete operation for abandoned generations.
Maintenance
Related MCP Connectors
Generate images, GIFs, videos, and PDFs from HTML, URLs, or templates — from your AI agent.
Give your AI agents a design superpower. Generate, edit, and publish publication-grade decks, reports, landing pages, resumes, and marketing visuals directly within your agent workflow. Delivering frontier-level design quality at 3× the speed and 53× lower cost -from conversational prompt to live link or vector PDF in minutes.
On-brand creative studio for AI agents: images, video, audio, and 3D.
Deterministic visual marketing engine. Your agent plans, renders, and posts on-brand campaigns.
Related MCP Servers
AlicenseAqualityCmaintenanceEnables AI agents to create, manage, and publish brand kits with colors, typography, logos, and white-label branding via the BrandKity platform.2215 npm2MIT- AlicenseNot gradedqualityDmaintenanceGenerates logos, social media posts, app-store screenshots, comic panels, and visual-novel assets from natural-language prompts using 119 templates.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to create high-resolution marketing images from simple JSON configs without design skills or API keys. Provides presets, themes, and layouts to render deterministic PNGs locally.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to act as graphic designers by generating images and social-ready visuals, with brand DNA memory, genre-aware styles, 35+ platform presets, self-critique, and version control.MIT