Skip to main content
Glama
elisbanpaco

Canva MCP Server

by elisbanpaco
README.md
# 🎨 Canva MCP Server

[![CI](https://github.com/elisbanpaco/mcp-canva-gemini-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/elisbanpaco/mcp-canva-gemini-cli/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg)](https://nodejs.org/)
[![NPM Version](https://img.shields.io/npm/v/@elisbanpaco/mcp-canva-gemini-cli.svg)](https://www.npmjs.com/package/@elisbanpaco/mcp-canva-gemini-cli)
[![MCP Standard](https://img.shields.io/badge/Protocol-Model%20Context%20Protocol-purple.svg)](https://modelcontextprotocol.io)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue.svg)](https://www.typescriptlang.org/)
[![Tested with Vitest](https://img.shields.io/badge/Tested%20with-Vitest-yellow.svg)](https://vitest.dev/)

Conecta tus asistentes de IA (**Google Antigravity, Gemini CLI, Claude Desktop, Cursor**) directamente con tu cuenta de **Canva** a través de la API oficial (**Canva Connect API**). Crea, busca, exporta y sube diseños mediante lenguaje natural.

---

## ⚡ Inicio Rápido (Quickstart)

### 1. Configuración Directa vía `npx`

Puedes ejecutarlo directamente con `npx` sin necesidad de clonar el repositorio:

#### 🤖 Google Antigravity / Gemini CLI (`~/.gemini/config/mcp_config.json`)
```json
{
  "mcpServers": {
    "canva": {
      "command": "npx",
      "args": ["-y", "--package", "@elisbanpaco/mcp-canva-gemini-cli", "mcp-canva"],
      "env": {
        "CANVA_CLIENT_ID": "tu_client_id",
        "CANVA_CLIENT_SECRET": "tu_client_secret"
      }
    }
  }
}
```

#### 🟣 Claude Desktop (`claude_desktop_config.json`)
```json
{
  "mcpServers": {
    "canva": {
      "command": "npx",
      "args": ["-y", "--package", "@elisbanpaco/mcp-canva-gemini-cli", "mcp-canva"],
      "env": {
        "CANVA_CLIENT_ID": "tu_client_id",
        "CANVA_CLIENT_SECRET": "tu_client_secret"
      }
    }
  }
}
```

#### 💻 Cursor IDE (`.cursor/mcp.json`)
```json
{
  "mcpServers": {
    "canva": {
      "command": "npx",
      "args": ["-y", "--package", "@elisbanpaco/mcp-canva-gemini-cli", "mcp-canva"],
      "env": {
        "CANVA_CLIENT_ID": "tu_client_id",
        "CANVA_CLIENT_SECRET": "tu_client_secret"
      }
    }
  }
}
```

---

## 🧰 Herramientas Disponibles

Una vez conectado, puedes pedirle a tu IA:

| Herramienta | ¿Qué hace? | Ejemplo de Prompt |
| :--- | :--- | :--- |
| `canva_list_designs` | Lista tus diseños recientes con miniaturas y enlaces de edición. | *"Muéstrame mis presentaciones recientes en Canva"* |
| `canva_get_design` | Obtiene los detalles, páginas y URLs de un diseño por su ID. | *"Dame la información del diseño con ID DAHKDKZXFcQ"* |
| `canva_create_design` | Crea un diseño nuevo (presentación, documento, post de Instagram, etc.). | *"Crea un post de Instagram en Canva titulado Lanzamiento 2026"* |
| `canva_export_design` | Exporta un diseño a PNG, JPG, PDF o PPTX y te da el link de descarga. | *"Exporta mi presentación a formato PDF"* |
| `canva_list_folders` | Explora el contenido de tu carpeta raíz de Canva. | *"¿Qué elementos tengo en mi carpeta principal de Canva?"* |
| `canva_list_folder_items` | Lista los elementos dentro de una carpeta específica. | *"Muéstrame los archivos dentro de la carpeta con ID X"* |
| `canva_create_folder` | Crea una nueva carpeta en tu Canva. | *"Crea una carpeta llamada Proyectos 2026"* |
| `canva_upload_asset` | Sube una imagen local de tu computadora a Canva. | *"Sube la imagen ./banner.png a mi cuenta de Canva"* |
| `canva_get_auth_status` | Verifica el estado de conexión y validez de los tokens. | *"Revisa si mi conexión con Canva está activa"* |

---

## 🔑 Configuración Inicial de Credenciales

1. Entra a [Canva Developers](https://www.canva.com/developers/) y haz clic en **`Your integrations`**.
2. Haz clic en **`Create an integration`** $\rightarrow$ Elige **`Public`**.
   
   ![Crear Integración Canva](./assets/configure_integracion.png)

3. En **`Credentials`**, copia tu **Client ID** y genera tu **Client Secret**.
4. En **`Scopes`**, activa los permisos (son los únicos compatibles):
   * `design:content:read`, `design:content:write`, `design:meta:read`
   * `asset:read`, `asset:write`, `folder:read`, `folder:write`, `app:read`
   
   ![Configuración de Scopes en Canva](./assets/scopes.png)

5. En **`Authentication`**, agrega la URL de redirección exacta:
   `http://127.0.0.1:3000/callback`
   
   ![Añadir URL de Redirect](./assets/auth-url-add.png)

### Autenticación (Solo la primera vez)

Como Canva exige credenciales por usuario, abre tu terminal y ejecuta esto para autenticarte y guardar los tokens de forma segura:

```bash
# En Linux/macOS
export CANVA_CLIENT_ID="tu_client_id"
export CANVA_CLIENT_SECRET="tu_client_secret"
npx -p @elisbanpaco/mcp-canva-gemini-cli mcp-canva-auth

# En Windows (PowerShell)
$env:CANVA_CLIENT_ID="tu_client_id"
$env:CANVA_CLIENT_SECRET="tu_client_secret"
npx -p @elisbanpaco/mcp-canva-gemini-cli mcp-canva-auth
```

Se abrirá tu navegador para confirmar. ¡Listo! Tus tokens se guardarán con permisos `0600` en tu sistema operativo.

---

## 🏗️ Arquitectura y Seguridad

```mermaid
sequenceDiagram
    autonumber
    actor User as Usuario / Asistente IA
    participant MCP as Canva MCP Server (Stdio)
    participant Vault as Bóveda de Tokens (~/.config/canva-mcp)
    participant CanvaOAuth as Canva OAuth2 (PKCE S256)
    participant CanvaAPI as Canva Connect API (REST v1)

    Note over User,CanvaAPI: 1. Flujo de Autenticación (pnpm auth)
    MCP->>CanvaOAuth: Inicia flujo PKCE con desafío SHA-256
    CanvaOAuth-->>MCP: Redirección con Código de Autorización
    MCP->>CanvaOAuth: Intercambio de código por Tokens de acceso
    CanvaOAuth-->>MCP: Access Token + Refresh Token
    MCP->>Vault: Guarda en almacenamiento seguro (Permisos 0600)

    Note over User,CanvaAPI: 2. Ejecución de Herramientas en Tiempo Real
    User->>MCP: Llama a herramienta (ej. canva_list_designs)
    MCP->>Vault: Carga token válido (Auto-renovación con Mutex)
    MCP->>CanvaAPI: Petición HTTP Bearer con Exponential Backoff
    CanvaAPI-->>MCP: Respuesta JSON con metadatos y URLs
    MCP-->>User: Resultado estructurado
```

### Características de Ingeniería:
* 🔐 **Bóveda OS Segura**: Los tokens se guardan en el directorio del sistema (`~/.config/canva-mcp/` en Linux/Mac o `%APPDATA%\canva-mcp` en Windows) con permisos POSIX `0600` (solo legibles por tu usuario).
* ⚡ **Mutex Anticolisiones**: Previene condiciones de carrera cuando el modelo ejecuta múltiples herramientas en paralelo durante la renovación del token.
* 🛡️ **Exponential Backoff**: Reintentos automáticos con retroceso exponencial ante límites de tasa (`HTTP 429`) y caídas temporales (`5xx`).
* 🧪 **100% Test Coverage**: Suite completa de pruebas unitarias con Vitest.

---

## 🧪 Pruebas y Desarrollo

```bash
# Ejecutar suite de pruebas unitarias
pnpm test

# Verificación estricta de tipos TypeScript
pnpm typecheck

# Compilar paquete de producción
pnpm build
```

---

## 📄 Licencia

Este proyecto está bajo la licencia **MIT**. Consulta el archivo [LICENSE](LICENSE) para más detalles.

TDQS

A3.6/5.0

Scored across 10 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but canva_list_folders and canva_list_folder_items overlap: one lists root folder contents and the other lists contents of a specific folder, which could cause selection confusion. The rest are well separated by resource and action.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern with the canva_ prefix and a clear verb_noun structure (list_designs, get_design, create_folder, upload_asset). This makes the tool set predictable and easy to navigate.

Tool Count5/5

Ten tools is a well-scoped size for a Canva integration, covering authentication, design CRUD, folder operations, asset upload, and export. Each tool serves a meaningful purpose without the set feeling bloated or too thin.

Completeness4/5

The server covers the main Canva workflows: viewing profile, listing/getting/creating designs, exporting, folder navigation/creation, and uploading assets. Minor gaps include no delete or update operations for designs/folders and no asset listing, but these are not critical for typical use.

Maintenance

ActivityMaintained
ResponsivenessNo issues