← All guides

Design handoff · 6 min

Canva to a coding agent: the export path, not the MCP server

Canva has an MCP server and it is not the one you want. The route that works runs through the Connect API's HTML export — and produces something an agent has to be told how to read.

Updated


Search for how to get a Canva design into a coding agent and you will quickly find that Canva has an MCP server. That is true, and it is the wrong answer.

The Canva Dev MCP server connects a coding agent to Canva's developer documentation, examples and helper tooling. It is for engineers building Canva apps and integrations — it makes your agent good at writing code for Canva. It does not hand it your design. The two are easy to confuse because both sentences contain "Canva", "MCP" and "coding agent", and the distinction only becomes obvious once you have wired it up and found no way to ask it about your file.

The route that works is older and less fashionable: a REST export.

The export job

Canva's Connect API exports a design through an asynchronous job, which is three steps rather than one request:

  1. Create the job, naming the design and the format you want.
  2. Poll for status, because rendering is not instant and the API does not block while it happens.
  3. Collect the download links from the completed job.

The asynchronous shape is the thing to design around. If you are scripting this for an agent, the polling loop is your responsibility, and a naive implementation that fires once and gives up will look like an empty export rather than an unfinished one.

Supported formats are pdf, jpg, png, gif, pptx, mp4 and csv, plus two HTML options: html_bundle and html_standalone. Availability varies by design type — Docs, Whiteboards, Presentations, Videos, Emails and Sheets each support a different subset, so a format that works for a presentation may not exist for a whiteboard.

Which format to hand the agent

This is the decision that determines whether the rest is worth doing.

html_bundle is the right default. It preserves the document's structure and keeps assets as separate files, which means the agent receives element boundaries and real image references rather than a flat surface. If you are going to give an agent one artefact, give it this one.

html_standalone inlines everything into a single file. Convenient to move around, and the inlining tends to produce very large base64 blobs that eat context to no benefit. Prefer it only when passing a single file is the actual constraint.

png or jpg turns the whole design into pixels. Every element boundary, every text string and every colour value becomes something the model has to infer visually. This is the weakest route and also the most common one, because exporting an image is the obvious thing to do.

pdf is a print layout. It carries text as text, which is more than an image gives you, and it carries it inside a page model built for paper.

Getting it in front of the agent

There is no MCP server to point at, so the export lands as files and the agent reads files. That is less elegant and has one advantage worth noting: it works identically everywhere, with no catalog gate deciding whether your client is allowed to connect.

The pattern that works is to script the export into a known directory in the repository — design/canva/<design-name>/ — and commit the result, or generate it in a build step. The agent then reads it the way it reads any other part of the codebase, and you get a diff when the design changes, which no live MCP connection gives you.

Two things make the difference between an agent that uses the export and one that ignores it:

  • Say where it is, once, in the file the agent already reads. A line in AGENTS.md or CLAUDE.md pointing at the directory costs nothing and means you stop re-attaching it every session. Where design rules belong covers what else belongs in that file and what does not.
  • Say what it is. "This is a flattened Canva export; positions are absolute and grouping is not expressed" is one sentence that prevents the most common failure, which is an agent faithfully reproducing absolute coordinates because nothing told it they were an artefact of the format rather than the intent.

What a Canva export looks like from the agent's side

Set expectations honestly here, because this is where the Canva route differs most from the Figma one.

Canva is a document and graphics tool. Its canvas is a surface where elements are placed, not a layout engine with constraints and hierarchy. So even the HTML bundle tends to arrive flat and absolutely positioned: a stack of elements with coordinates, rather than a nested structure of containers that imply relationships.

Three consequences follow, and they are all worth telling the agent about explicitly rather than hoping it works them out:

  • Position does not imply grouping. Four items that read as a card are four items that happen to be near each other. The agent has to be told that they are a card, or it will emit four absolutely-positioned divs and reproduce the design perfectly at exactly one viewport width.
  • There is no responsive intent to recover, because none was expressed. A Canva design is authored at a size. Anything about how it should behave at 375px is a decision you are making now, not one you are extracting.
  • Text sizes are values, not a scale. 28, 22, 17 and 15 appear because they looked right, and nothing distinguishes "this is the H2 size" from "this heading is slightly bigger".

None of this makes the route bad. It makes it a route that carries layout and not structure, and the structure is the part you have to supply.

The part that never leaves Canva

Your Brand Kit — the palette, the fonts, the logo variants — is the most useful thing in the account and the least likely to arrive with the export. The export describes one document. The brand rules are the system behind every document, and they sit outside it.

Which means the agent gets the flattened geometry of one design and nothing about what the colours mean, which face belongs at which size, or what the product is never allowed to look like. Given a screen you did not export, it has nothing to reason from and will produce the statistical middle of everything it has seen — which is the mechanism behind why every vibe-coded app looks the same.

So the practical shape of a Canva handoff is two inputs, not one. The export supplies this design. Something else has to supply the rules: which face owns which size, what the accent is allowed to touch, the spacing scale, who the copy is addressed to, and the short list of things you would never ship. Those are structured data, and they belong somewhere the agent reads at the moment of use rather than in a paragraph you retype each session. A few properties are worth insisting on in anything that holds them, and which moodspec's endpoint enforces: it is read-only, the token is scoped to one canvas rather than an account, and an agent can only propose changes through propose_change, never write directly. The docs are one block of config.

The test

Export a design as html_bundle and hand it to your agent with no other instruction. Ask it to build the page, then ask it for one more section in the same style — a FAQ block, a footer, a pricing row.

Look at the second one. If it reuses your sizes and your accent in the same roles, the export carried more than you expected. If it invents a new heading size and puts the accent on a heading, you have confirmed the split: the export moved the picture, and the rules were never in it to move.

Further reading

Common questions

Does Canva have an MCP server for handing designs to an agent?
Canva's Dev MCP server exists, but it is for building Canva apps and integrations — it connects a coding agent to Canva's developer documentation and helper tooling. It does not export your design.
What is the actual route out of Canva?
The Connect API's export endpoint. You create an asynchronous export job, poll it for status, and receive download links when it completes.
Which export format should I give a coding agent?
html_bundle, in most cases. It preserves structure and assets as separate files, where a PNG gives the agent pixels and a PDF gives it a print layout.
What export formats does the Connect API support?
pdf, jpg, png, gif, pptx, mp4 and csv, plus html_bundle and html_standalone. Availability varies by design type — Docs, Whiteboards, Presentations, Videos, Emails and Sheets each support a different subset.
Can I pull my Brand Kit through the API?
Do not assume so. Treat the brand rules as something you supply to the agent separately rather than something the design export carries, because the export describes one document rather than the system behind it.

Keep reading