Skip to main content
Glama

Install as a skill

npx skills add canvora/canvora-mcp

Canvora — visuals for AI agents

npm Canvora MCP server License: MIT

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 URLs

Your 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, one npx skills add installs all of them into Claude Code, Cursor, Codex, OpenCode, OpenClaw and 60+ agents.

    Skill

    For

    canvora

    core: setup, generate loop, credits, refinement

    instagram-carousel

    Instagram carousels / swipe posts

    linkedin-carousel

    LinkedIn document carousels + safe zones

    pitch-deck

    pitch/sales/training decks, document → slides

    pdf-document

    multi-page PDFs: brochures, reports, one-pagers

    landing-page-visuals

    a whole page's visual kit from its URL

    ad-campaign

    paid social + display ad sets and variants

    blog-promo-kit

    header, OG image and promo set from one post

    data-infographic

    process flows, comparisons, timelines, stats

    multilingual-campaign

    one campaign → many languages

    product-photo-visuals

    designs built around the user's own photos

    visual-refresh

    edit, vary, localize and revert what exists

  • Remote MCP server — for Claude, ChatGPT, Cursor, and any MCP client. Nothing to install.

  • canvora CLI — 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 --json

More runnable recipes: examples/

Commands

Command

What it does

canvora generate

Create visuals from an --idea (short concept, Canvora develops it), --input (your full content text), --url, or --file-url (PDF). --wait polls to completion and prints output URLs.

canvora localize <id> --language es

Same design, new language: translates an existing generation's visuals, layout untouched

canvora variations <id> [--count n]

Fresh takes on an existing generation's visuals

canvora edit <outputId> --prompt "..."

Natural-language edit of one visual (previews the change; --yes auto-confirms)

canvora status <id>

Check a generation and list its output URLs

canvora download <id> --dir out/

Save all output files locally

canvora formats

All format IDs with dimensions (live catalog)

canvora brands

Your brand kits (pass one via --brand <uuid>)

canvora credits

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 output

Option 2 — MCP (Claude, ChatGPT, any MCP client)

One remote server, OAuth sign-in, 16 tools your agent discovers on connect:

Server URL

https://api.canvora.ai/mcp (streamable HTTP)

Claude

Settings → Connectors → Add custom connector → OAuth Client ID claude_mcp

Claude Code plugin

/plugin marketplace add canvora/canvora-mcp then /plugin install canvora@canvora (connector + all 12 skills)

ChatGPT

Apps → search Canvora → Connect, then start a message with @Canvora

Registry

ai.canvora/canvora on the official MCP Registry — also on Glama, Smithery, mcpservers.org

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 localize into 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-url at a PDF report, get presentation slides

  • Ad sets — ad_square,ad_landscape,ad_portrait from one product URL, all placements covered

Built to be called by software

  • Predictable costs — flat credit pricing (10/visual, 15/slide); canvora credits before 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).

MIT licensed (CLI, skills, and docs in this repo).

Available Tools

16 tools
chatChat 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"

Inputs: message (required), workspace_id, conversation_id.

check_creditsCheck Credit BalanceA
Read-onlyIdempotent
Inspect

Check your current Canvora credit balance. Only call this when the user explicitly asks about their credits or balance.

Inputs: no named parameters.

confirm_generationConfirm & Generate VisualsA
Destructive
Inspect

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.

Inputs: conversation_id (required), formats, brand_id, language, +9 more.

convert_imageConvert Image FormatBInspect

Convert an image to JPG, WebP, or PNG format. Returns the converted image as a downloadable URL.

Inputs: format (required), image_url (required), quality.

create_variationCreate VariationsA
Destructive
Inspect

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.

Inputs: generation_id (required), count.

download_visualDownload VisualB
Read-onlyIdempotent
Inspect

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).

Inputs: generation_id (required), output_index.

edit_imageEdit ImageA
Destructive
Inspect

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:

  1. First call with the operation and instruction — Canvora checks the edit and returns a refined edit plan for review

  2. 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.

Inputs: operation (required), instruction (required), format, confirmed, +5 more.

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).

Inputs: format (required), generation_id (required).

get_edit_historyGet Image Edit HistoryA
Read-onlyIdempotent
Inspect

Get the edit history of a generated image — original version plus every applied edit, with which version is current. Use before reverting an edit.

Inputs: output_id, output_index, generation_id.

get_generationGet Generation StatusA
Read-onlyIdempotent
Inspect

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.

Inputs: generation_id.

list_brandsList Brand KitsA
Read-onlyIdempotent
Inspect

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.

Inputs: no named parameters.

list_formatsList Visual FormatsA
Read-onlyIdempotent
Inspect

List the available visual formats with dimensions and categories. Canvora supports 100+ formats; use this to find the right format ID for confirm_generation.

Inputs: category.

list_workspacesList WorkspacesA
Read-onlyIdempotent
Inspect

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).

Inputs: no named parameters.

localize_generationLocalize Visuals Into Multiple LanguagesA
Destructive
Inspect

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.

Inputs: languages (required), generation_id (required).

revert_editRevert Image EditA
Idempotent
Inspect

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.

Inputs: edit_id, output_index, generation_id.

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.

Inputs: data (required), filename.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 16 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count4/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables AI agents to create, manage, and publish brand kits with colors, typography, logos, and white-label branding via the BrandKity platform.
      22
      13 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Generates logos, social media posts, app-store screenshots, comic panels, and visual-novel assets from natural-language prompts using 119 templates.
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables 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