Skip to main content
Glama
Canva MCP Server

Canva MCP Server

Canva MCP Server

Servidor MCP base para orquestar la creacion de presentaciones en Canva con un enfoque hibrido:

  • planeacion narrativa con LLM

  • composicion estructurada por slides

  • integracion con Canva por API oficial donde exista soporte

  • capa opcional de automatizacion web para cerrar huecos operativos

Objetivo

Este proyecto no intenta "hacer clics al azar" en Canva. La meta es traducir instrucciones de alto nivel a operaciones controladas como:

  • crear un deck desde un brief

  • aplicar branding

  • rellenar placeholders

  • insertar imagenes y graficos

  • reordenar slides

  • exportar el resultado

Related MCP server: mulmocast-vision

Estructura

Variables de entorno

Duplica .env.example en tu .env real y completa al menos:

  • CANVA_CLIENT_ID

  • CANVA_CLIENT_SECRET

  • CANVA_REDIRECT_URI

  • OPENAI_API_KEY

  • CANVA_ACCESS_TOKEN

  • CANVA_TEAM_ID

  • CANVA_BRAND_TEMPLATE_ID

Para la integracion real ya implementada en el scaffold, el token debe tener scopes compatibles con:

  • design:content:write para crear disenos

  • design:content:read para exportarlos

  • design:meta:read para consultar jobs de autofill

  • folder:read para listar presentaciones

  • brandtemplate:meta:read y brandtemplate:content:read para brand templates y autofill

El import de .pptx a Canva usa tambien design:content:write.

Instalacion

npm install

Ejecucion

npm start

Smoke test

npm run smoke

Ejecuta una prueba real de create_presentation y export_presentation con el token configurado.

Siguiente integracion real

  1. Implementar DeckPlanner para generar outline y contenido por slide.

  2. Añadir AssetPipeline para imagenes, iconos y graficos.

  3. Completar mutaciones de slides cuando la API o el fallback de navegador lo requieran.

  4. Añadir BrowserAutomationAdapter solo para acciones no cubiertas por API.

Estado actual

Ya hay integracion real para:

  • create_presentation

  • export_presentation

  • list_presentations

  • list_brand_templates

  • get_brand_template_dataset

  • create_autofilled_presentation

  • generate_presentation_from_brief

  • create_presentation_outline

  • create_markdown_presentation

  • get_import_job

La exportacion puede devolver el job inmediatamente o esperar a que termine haciendo polling del estado del export job.

Si quieres usar las tools nuevas de carpetas y brand templates, actualiza CANVA_SCOPES y vuelve a autorizar la integracion para obtener un token con esos scopes.

Si quieres generar un deck completo y bonito sin depender de brand templates, usa create_markdown_presentation: genera un .pptx estilizado y lo importa a Canva como una presentacion editable.

Como obtener el access token de Canva

Canva Connect usa OAuth 2.0 con Authorization Code + PKCE. Eso significa que en el Developer Portal normalmente no veras un access_token listo para copiar. Lo que si ves es:

  • Client ID

  • Client Secret

  • scopes

  • redirect URL

Con eso debes generar el token.

Paso 1

Completa en tu .env:

  • CANVA_CLIENT_ID

  • CANVA_CLIENT_SECRET

  • CANVA_REDIRECT_URI

  • CANVA_SCOPES

Paso 2

Genera una URL de autorizacion:

npm run oauth:url

Ese comando imprime:

  • authorizationUrl

  • state

Ademas guarda localmente el codeVerifier y el state en un archivo temporal para que no tengas que copiarlos a mano.

Abre la authorizationUrl en tu navegador, autoriza la app y copia el valor code que Canva devolvera al redirect_uri.

Paso 3

Intercambia el code por el token:

node src/oauth-helper.js exchange <authorization_code>

O pega directamente la URL completa de redireccionamiento:

node src/oauth-helper.js exchange-url "http://127.0.0.1:3001/oauth/redirect?code=...&state=..."

La respuesta devolvera:

  • access_token

  • refresh_token

  • expires_in

  • scope

Paso 4

Copia el access_token a tu .env como CANVA_ACCESS_TOKEN y el refresh_token como CANVA_REFRESH_TOKEN.

Si quieres, luego puedo dejar automatizado tambien el refresco del token con refresh_token.

Available Tools

28 tools
add_slideAdd SlideA

Not implementable: Canva Connect API has no endpoint to add a slide to an existing design.

Inputs: position (required), layoutType (required), presentationId (required), body, +1 more.

apply_brand_kitApply Brand KitA

Not implementable: Canva Connect API has no endpoint to restyle colors/fonts on an existing design.

Inputs: presentationId (required), brandKitId, fontFamily, logoAssetId, +2 more.

batch_upsert_slidesBatch Upsert SlidesA

Not implementable: Canva Connect API has no endpoint to create or update slides in an existing design.

Inputs: slides (required), presentationId (required).

browser_run_canva_actionBrowser Run Canva ActionD

Not implemented: no browser-automation dependency (e.g. Playwright) is installed in this project.

Inputs: action (required), reason (required), target (required).

create_autofilled_presentationCreate Autofilled PresentationB

Creates a Canva design from a brand template using Autofill data.

Inputs: data (required), brandTemplateId (required), title, waitForCompletion.

create_flyerCreate FlyerA

Builds a styled single-page flyer (PPTX) and optionally imports it into Canva as a design. If you already have a flyer-shaped Brand Template in Canva, generate_presentation_from_brief + get_brand_template_dataset (autofill) can target it directly instead.

Inputs: headline (required), body, size, title, +10 more.

create_markdown_presentationCreate Markdown PresentationB

Builds a styled PPTX from a markdown file and optionally imports it into Canva.

Inputs: markdownPath (required), title, fontStyle, outputPath, +2 more.

create_presentationCreate PresentationC

Creates a new Canva presentation from template or outline.

Inputs: title (required), assetId, language, outlineId, +1 more.

create_presentation_outlineCreate Presentation OutlineC

Generates a presentation plan from a brief.

Inputs: topic (required), audience (required), objective (required), tone, +3 more.

export_presentationExport PresentationC

Exports the presentation to a supported format.

Inputs: presentationId (required), size, pages, format, +2 more.

generate_presentation_from_briefGenerate Presentation From BriefA

Builds an outline and creates a Canva presentation using Autofill when a brand template is available.

Inputs: topic (required), audience (required), objective (required), tone, +7 more.

generate_speaker_notesGenerate Speaker NotesA

Not implemented: Canva Connect API has no endpoint to write speaker notes into an existing design.

Inputs: presentationId (required), tone, slideId.

get_brand_template_datasetGet Brand Template DatasetB

Returns the autofillable dataset fields for a Canva brand template.

Inputs: brandTemplateId (required).

get_export_jobGet Export JobB

Retrieves the current status of a Canva export job.

Inputs: jobId (required).

get_import_jobGet Import JobB

Retrieves the current status of a Canva import job.

Inputs: jobId (required).

insert_chartInsert ChartA

Not implementable: Canva Connect API has no endpoint to insert a chart into an existing design's slide.

Inputs: data (required), slideId (required), chartType (required), presentationId (required), +1 more.

insert_imageInsert ImageA

Not implementable: Canva Connect API has no endpoint to insert an image into an existing design's slide.

Inputs: assetId (required), slideId (required), presentationId (required), placementHint.

list_brand_templatesList Brand TemplatesC

Lists Canva brand templates available to the authorized user.

Inputs: limit, query, sortBy, dataset, +2 more.

list_presentationsList PresentationsC

Lists Canva presentations in a folder, defaulting to root.

Inputs: limit, query, sortBy, folderId, +1 more.

reorder_slidesReorder SlidesA

Not implementable: Canva Connect API has no endpoint to reorder slides in an existing design.

Inputs: presentationId (required), orderedSlideIds (required).

replace_text_placeholdersReplace Text PlaceholdersC

Not implementable: Canva Connect API has no endpoint to edit text nodes in an existing design.

Inputs: replacements (required), presentationId (required).

search_assetsSearch AssetsC

Not implemented: no Canva-hosted asset search/library endpoint is wired up here.

Inputs: query (required), limit, assetType.

select_templateSelect TemplateC

Selects the most appropriate Canva template for the brief.

Inputs: style (required), audience (required), query, brandKitId, +1 more.

server_healthServer HealthA

Returns runtime readiness for the Canva MCP server.

Inputs: no named parameters.

share_presentationShare PresentationB

Not implemented: no sharing/permissions endpoint for designs was confirmed or wired up in this integration.

Inputs: presentationId (required), access.

update_slide_contentUpdate Slide ContentC

Not implementable: Canva Connect API has no endpoint to edit text/structure of a slide in an existing design.

Inputs: slideId (required), presentationId (required), body, merge, +2 more.

upload_image_assetUpload Image AssetA

Uploads a local image file to Canva as a reusable asset (for use in autofill image fields).

Inputs: name (required), filePath (required), mimeType, waitForCompletion.

validate_presentationValidate PresentationC

Not implemented: Canva Connect API exposes no design-content introspection endpoint to validate an existing design against.

Inputs: presentationId (required), checks.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    C2.7/5.0

    Scored across 28 tools

    Disambiguation2/5

    Multiple tools target the same action of creating presentations (create_presentation, create_markdown_presentation, generate_presentation_from_brief, create_autofilled_presentation, create_flyer), with descriptions that only partially differentiate them. Many tools are stubs marked 'Not implementable' or 'Not implemented,' which creates ambiguity about which tools are actually usable and what they do.

    Naming Consistency5/5

    All tool names follow a consistent snake_case verb_noun pattern (e.g., list_presentations, create_presentation, export_presentation, get_export_job). There are no mixed conventions or unpredictable verb styles, making the naming highly predictable.

    Tool Count2/5

    The server exposes 28 tools, but a large portion are non-functional stubs or redundant creation variants. This overinflates the count relative to the actual working surface, making it heavier than needed for the core functionality and adding noise for agents.

    Completeness2/5

    The tool set covers creation, autofill, export, and import workflows, but lacks any meaningful editing or management capabilities—slide manipulation, text replacement, and sharing are all stubs. This leaves obvious gaps in the lifecycle of a presentation (e.g., no update/delete), causing dead ends for agents.

    Related MCP Connectors

    Related MCP Servers