David-S-Botero/canva-mcp-server
If you are the rightful owner of canva-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
The Canva MCP Server is a comprehensive Model Context Protocol server that exposes Canva API endpoints as tools, enabling programmatic interaction with Canva through AI assistants.
Canva MCP Server
Un servidor MCP (Model Context Protocol) completo que expone los endpoints de la API de Canva como herramientas. Este servidor permite interactuar con Canva programáticamente a través de asistentes de IA.
Características
🔐 Autenticación OAuth 2.0
- Generación de URLs de autorización con PKCE
- Intercambio de códigos de autorización por tokens de acceso
- Renovación automática de tokens de acceso
- Gestión segura de credenciales
📁 Gestión de Diseños
- Crear nuevos diseños
- Listar diseños existentes
- Obtener metadatos de diseños
- Gestionar páginas de diseños
- Obtener formatos de exportación disponibles
🖼️ Gestión de Assets
- Subir assets desde archivos locales
- Subir assets desde URLs
- Obtener metadatos de assets
- Actualizar información de assets
- Eliminar assets
📂 Gestión de Carpetas
- Crear carpetas
- Listar contenido de carpetas
- Actualizar metadatos de carpetas
- Mover elementos entre carpetas
- Eliminar carpetas
📤 Exportación
- Exportar diseños a múltiples formatos (PDF, JPG, PNG, GIF, PPTX, MP4)
- Trabajo asíncrono para exportaciones
- Seguimiento del estado de exportación
🎨 Plantillas de Marca
- Listar plantillas de marca
- Obtener metadatos de plantillas
- Verificar capacidades de autocompletado
🔄 Autocompletado
- Crear trabajos de autocompletado de diseños
- Seguimiento del estado de autocompletado
- Generación dinámica de diseños
💬 Comentarios
- Crear hilos de comentarios
- Responder a comentarios
- Listar respuestas de comentarios
- Obtener metadatos de comentarios
👤 Gestión de Usuarios
- Obtener información del usuario actual
- Obtener perfil del usuario
- Verificar capacidades del usuario
Instalación
1. Clonar el repositorio
git clone <repository-url>
cd canva-mcp-server
2. Instalar dependencias
pip install -r requirements.txt
3. Configurar variables de entorno
Crea un archivo .env en el directorio raíz:
CANVA_CLIENT_ID=tu_client_id_aqui
CANVA_CLIENT_SECRET=tu_client_secret_aqui
CANVA_REDIRECT_URI=https://tu-dominio.com/callback
4. Configurar la integración en Canva
- Ve a Canva Developer Portal
- Crea una nueva integración
- Configura los scopes necesarios:
asset:read- Leer assetsasset:write- Escribir assetsdesign:meta:read- Leer metadatos de diseñosdesign:meta:write- Escribir metadatos de diseñosfolder:read- Leer carpetasfolder:write- Escribir carpetascomment:write- Escribir comentariosbrand_template:read- Leer plantillas de marca
- Configura la URL de redirección
- Copia el Client ID y Client Secret a tu archivo
.env
Uso
1. Iniciar el servidor
python server.py
2. Flujo de autenticación
Paso 1: Crear URL de autorización
# Usar la herramienta create_authorization_url
auth_result = create_authorization_url(
scopes="asset:read asset:write design:meta:read folder:read"
)
# auth_result contiene:
# - authorization_url: URL para que el usuario autorice
# - code_verifier: Verificador de código para PKCE
# - state: Parámetro de estado para seguridad
Paso 2: Intercambiar código por token
# Después de que el usuario autorice, recibirás un código
# Usar la herramienta exchange_code_for_token
token_result = exchange_code_for_token(
authorization_code="código_recibido",
code_verifier="verificador_guardado"
)
Paso 3: Usar las herramientas de la API
Una vez autenticado, puedes usar todas las herramientas disponibles.
3. Ejemplos de uso
Crear un nuevo diseño
design = create_design(
title="Mi Nuevo Diseño",
folder_id="folder_id_opcional"
)
Listar diseños
designs = list_designs(
limit=20,
folder_id="folder_id_opcional"
)
Subir un asset desde URL
upload_job = create_url_asset_upload_job(
url="https://ejemplo.com/imagen.jpg",
filename="mi_imagen.jpg",
folder_id="folder_id_opcional"
)
# Verificar estado del trabajo
job_status = get_url_asset_upload_job(upload_job["job"]["id"])
Exportar un diseño
export_job = create_design_export_job(
design_id="design_id",
file_type="pdf",
page_range="1-3"
)
# Verificar estado de exportación
export_status = get_design_export_job(export_job["job"]["id"])
Crear una carpeta
folder = create_folder(
name="Mi Carpeta",
parent_folder_id="parent_folder_id_opcional"
)
Autocompletar un diseño desde plantilla de marca
autofill_job = create_design_autofill_job(
brand_template_id="template_id",
dataset={
"company_name": "Mi Empresa",
"logo_url": "https://ejemplo.com/logo.png",
"primary_color": "#FF5733"
}
)
# Verificar estado del autocompletado
autofill_status = get_design_autofill_job(autofill_job["job"]["id"])
Herramientas Disponibles
Autenticación
create_authorization_url- Crear URL de autorización OAuthexchange_code_for_token- Intercambiar código por token de accesorefresh_access_token- Renovar token de accesoget_oauth_config- Obtener configuración OAuth actualclear_tokens- Limpiar tokens almacenados
Usuarios
get_current_user- Obtener información del usuario actualget_user_profile- Obtener perfil del usuarioget_user_capabilities- Obtener capacidades del usuario
Diseños
create_design- Crear nuevo diseñolist_designs- Listar diseñosget_design- Obtener metadatos de diseñoget_design_pages- Obtener páginas de diseñoget_design_export_formats- Obtener formatos de exportación
Assets
create_asset_upload_job- Crear trabajo de subida de assetget_asset_upload_job- Verificar estado de subida de assetcreate_url_asset_upload_job- Subir asset desde URLget_url_asset_upload_job- Verificar estado de subida desde URLget_asset- Obtener metadatos de assetupdate_asset- Actualizar assetdelete_asset- Eliminar asset
Carpetas
create_folder- Crear carpetaget_folder- Obtener metadatos de carpetaupdate_folder- Actualizar carpetadelete_folder- Eliminar carpetalist_folder_items- Listar contenido de carpetamove_folder_item- Mover elemento entre carpetas
Exportación
create_design_export_job- Crear trabajo de exportaciónget_design_export_job- Verificar estado de exportación
Plantillas de Marca
list_brand_templates- Listar plantillas de marcaget_brand_template- Obtener metadatos de plantillaget_brand_template_dataset- Obtener dataset de plantilla
Autocompletado
create_design_autofill_job- Crear trabajo de autocompletadoget_design_autofill_job- Verificar estado de autocompletado
Comentarios
create_comment_thread- Crear hilo de comentarioscreate_comment_reply- Responder a comentarioget_comment_thread- Obtener metadatos de hilolist_comment_replies- Listar respuestas de comentarios
Configuración de Seguridad
Variables de Entorno Requeridas
CANVA_CLIENT_ID- ID del cliente de CanvaCANVA_CLIENT_SECRET- Secreto del cliente de CanvaCANVA_REDIRECT_URI- URI de redirección configurada
Mejores Prácticas
- Nunca compartas tus credenciales de Canva
- Usa variables de entorno para las credenciales
- Implementa almacenamiento seguro de tokens en producción
- Maneja errores de autenticación apropiadamente
- Implementa renovación automática de tokens
Trabajos Asíncronos
Muchas operaciones en la API de Canva son asíncronas. El flujo típico es:
- Crear un trabajo (ej:
create_asset_upload_job) - Obtener un ID de trabajo
- Verificar el estado del trabajo periódicamente
- Usar el resultado cuando el trabajo esté completo
Ejemplo de polling
import asyncio
import time
async def wait_for_job_completion(job_id: str, check_function):
while True:
status = await check_function(job_id)
if status["job"]["status"] == "success":
return status["job"]["result"]
elif status["job"]["status"] == "failed":
raise Exception(f"Job failed: {status}")
# Esperar antes de verificar nuevamente
await asyncio.sleep(2)
Manejo de Errores
El servidor maneja errores de la API de Canva y los propaga como excepciones. Los errores comunes incluyen:
401 Unauthorized- Token inválido o expirado403 Forbidden- Permisos insuficientes404 Not Found- Recurso no encontrado429 Too Many Requests- Límite de tasa excedido
Contribuir
- Fork el repositorio
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -am 'Agregar nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Crea un Pull Request
Licencia
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.