{"_id":"@elisbanpaco/mcp-canva-gemini-cli","_rev":"3-3370596cb2a0e84416e7fc0f10cfc14c","name":"@elisbanpaco/mcp-canva-gemini-cli","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"@elisbanpaco/mcp-canva-gemini-cli","version":"0.0.1","keywords":["mcp","mcp-server","model-context-protocol","canva","canva-api","canva-connect","gemini","antigravity","claude-desktop","cursor"],"author":{"name":"Elisban Paco"},"license":"MIT","_id":"@elisbanpaco/mcp-canva-gemini-cli@0.0.1","maintainers":[{"name":"elisbanpaco","email":"paccoacchaelias@gmail.com"}],"homepage":"https://github.com/elisbanpaco/mcp-canva-gemini-cli#readme","bugs":{"url":"https://github.com/elisbanpaco/mcp-canva-gemini-cli/issues"},"bin":{"mcp-canva":"dist/index.js","mcp-canva-auth":"dist/auth.js"},"dist":{"shasum":"6f46a134dbca292f3c4407c1acb7ec6c9a17f810","tarball":"https://registry.npmjs.org/@elisbanpaco/mcp-canva-gemini-cli/-/mcp-canva-gemini-cli-0.0.1.tgz","fileCount":17,"integrity":"sha512-W+mx4a1F9zL+4sV6rVmeahvFcF2nRDahlzBv3apF/7gDqBTgwOr6s9wCWugPZm1BxKgCYVPa0PkE1etrb9LYtA==","signatures":[{"sig":"MEUCIQCg2Kp6c5Tw6pn6Tij/ME4bVQpw+tb5f59HZPfnTl6vdwIgAWf8TWcevI2zI02Hv/1ROSmfmocy24K/HpTnRQF5Eac=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56891},"main":"dist/index.js","type":"module","_from":"file:elisbanpaco-mcp-canva-gemini-cli-0.0.1.tgz","types":"./dist/index.d.ts","scripts":{"dev":"tsx src/index.ts","auth":"tsx src/auth.ts","test":"vitest run","build":"tsc","start":"node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"elisbanpaco","email":"paccoacchaelias@gmail.com"},"_resolved":"/tmp/3f4d2cdd4e8694b43d95ac51e87cb51b/elisbanpaco-mcp-canva-gemini-cli-0.0.1.tgz","_integrity":"sha512-W+mx4a1F9zL+4sV6rVmeahvFcF2nRDahlzBv3apF/7gDqBTgwOr6s9wCWugPZm1BxKgCYVPa0PkE1etrb9LYtA==","repository":{"url":"git+https://github.com/elisbanpaco/mcp-canva-gemini-cli.git","type":"git"},"_npmVersion":"11.11.0","description":"Production-ready Model Context Protocol (MCP) Server for the official Canva Connect API","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.24.2","dotenv":"^16.4.7","@modelcontextprotocol/sdk":"^1.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^3.0.7","typescript":"^5.7.3","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/mcp-canva-gemini-cli_0.0.1_1787877630650_0.9985665293223858","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@elisbanpaco/mcp-canva-gemini-cli","version":"0.0.2","keywords":["mcp","mcp-server","model-context-protocol","canva","canva-api","canva-connect","gemini","antigravity","claude-desktop","cursor"],"author":{"name":"Elisban Paco"},"license":"MIT","_id":"@elisbanpaco/mcp-canva-gemini-cli@0.0.2","maintainers":[{"name":"elisbanpaco","email":"paccoacchaelias@gmail.com"}],"homepage":"https://github.com/elisbanpaco/mcp-canva-gemini-cli#readme","bugs":{"url":"https://github.com/elisbanpaco/mcp-canva-gemini-cli/issues"},"bin":{"mcp-canva":"dist/index.js","mcp-canva-auth":"dist/auth.js"},"dist":{"shasum":"838498bb50f4f7fecd1f479e6bf3a023ae8697a9","tarball":"https://registry.npmjs.org/@elisbanpaco/mcp-canva-gemini-cli/-/mcp-canva-gemini-cli-0.0.2.tgz","fileCount":17,"integrity":"sha512-e3XKl4JKMYahjYyGQvQM80RYF/h+HIJqD5KaYDOVbDRDLuZ/G9vqF8eJzCdl+VpAgx/fJn8yVa2UbretaJ8FNg==","signatures":[{"sig":"MEUCIB5emleLtOesLbp8reAmqkBiFN26VDGLeAWKWtsJ3Z+1AiEA3NOepZfLoZqJaeJtkkCch9VOk/UHR+P3FfEf7+STCC0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56891},"main":"dist/index.js","type":"module","_from":"file:elisbanpaco-mcp-canva-gemini-cli-0.0.2.tgz","types":"./dist/index.d.ts","scripts":{"dev":"tsx src/index.ts","auth":"tsx src/auth.ts","test":"vitest run","build":"tsc","start":"node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"elisbanpaco","email":"paccoacchaelias@gmail.com"},"_resolved":"/tmp/64117605be211d1970c5406f3426bdff/elisbanpaco-mcp-canva-gemini-cli-0.0.2.tgz","_integrity":"sha512-e3XKl4JKMYahjYyGQvQM80RYF/h+HIJqD5KaYDOVbDRDLuZ/G9vqF8eJzCdl+VpAgx/fJn8yVa2UbretaJ8FNg==","repository":{"url":"git+https://github.com/elisbanpaco/mcp-canva-gemini-cli.git","type":"git"},"_npmVersion":"10.8.2","description":"Production-ready Model Context Protocol (MCP) Server for the official Canva Connect API","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.24.2","dotenv":"^16.4.7","@modelcontextprotocol/sdk":"^1.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.3","vitest":"^3.0.7","typescript":"^5.7.3","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/mcp-canva-gemini-cli_0.0.2_1787878761775_0.9127922047156096","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@elisbanpaco/mcp-canva-gemini-cli","version":"0.0.3","description":"Production-ready Model Context Protocol (MCP) Server for the official Canva Connect API","main":"dist/index.js","type":"module","publishConfig":{"access":"public"},"bin":{"mcp-canva":"dist/index.js","mcp-canva-auth":"dist/auth.js"},"repository":{"type":"git","url":"git+https://github.com/elisbanpaco/mcp-canva-gemini-cli.git"},"keywords":["mcp","mcp-server","model-context-protocol","canva","canva-api","canva-connect","gemini","antigravity","claude-desktop","cursor"],"author":{"name":"Elisban Paco"},"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.6.0","dotenv":"^16.4.7","zod":"^3.24.2"},"devDependencies":{"@types/node":"^22.13.5","tsx":"^4.19.3","typescript":"^5.7.3","vitest":"^3.0.7"},"scripts":{"build":"tsc","start":"node dist/index.js","dev":"tsx src/index.ts","auth":"tsx src/auth.ts","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","typecheck":"tsc --noEmit"},"_id":"@elisbanpaco/mcp-canva-gemini-cli@0.0.3","types":"./dist/index.d.ts","bugs":{"url":"https://github.com/elisbanpaco/mcp-canva-gemini-cli/issues"},"homepage":"https://github.com/elisbanpaco/mcp-canva-gemini-cli#readme","_integrity":"sha512-HQcybK5SSjN/st/+C7YgXfMwH/H612tZGhie9fIsGwGqcOknQ12W92s2ZFjwbgwiwkA195tfJz5ivEl2Q0cHyg==","_resolved":"/tmp/d2d2bf1e8cebe9cd483c550f4ef1d1d3/elisbanpaco-mcp-canva-gemini-cli-0.0.3.tgz","_from":"file:elisbanpaco-mcp-canva-gemini-cli-0.0.3.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-HQcybK5SSjN/st/+C7YgXfMwH/H612tZGhie9fIsGwGqcOknQ12W92s2ZFjwbgwiwkA195tfJz5ivEl2Q0cHyg==","shasum":"4c92cb5047b7798a5269f5f9ac3b7ff896580046","tarball":"https://registry.npmjs.org/@elisbanpaco/mcp-canva-gemini-cli/-/mcp-canva-gemini-cli-0.0.3.tgz","fileCount":17,"unpackedSize":57065,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHtKQYnh3sNfIx4N+596G1LI8iWszuHBs39WsD1V4uf2AiEAsVGzRV3Kwp1a0TcB8X+TCjly1StSIs5A5F4MTGPNdKU="}]},"_npmUser":{"name":"elisbanpaco","email":"paccoacchaelias@gmail.com"},"directories":{},"maintainers":[{"name":"elisbanpaco","email":"paccoacchaelias@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-canva-gemini-cli_0.0.3_1787887834996_0.49008038167625645"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-28T00:40:30.466Z","modified":"2026-08-28T03:30:35.284Z","0.0.1":"2026-08-28T00:40:30.812Z","0.0.2":"2026-08-28T00:59:21.909Z","0.0.3":"2026-08-28T03:30:35.139Z"},"bugs":{"url":"https://github.com/elisbanpaco/mcp-canva-gemini-cli/issues"},"author":{"name":"Elisban Paco"},"license":"MIT","homepage":"https://github.com/elisbanpaco/mcp-canva-gemini-cli#readme","keywords":["mcp","mcp-server","model-context-protocol","canva","canva-api","canva-connect","gemini","antigravity","claude-desktop","cursor"],"repository":{"type":"git","url":"git+https://github.com/elisbanpaco/mcp-canva-gemini-cli.git"},"description":"Production-ready Model Context Protocol (MCP) Server for the official Canva Connect API","maintainers":[{"name":"elisbanpaco","email":"paccoacchaelias@gmail.com"}],"readme":"# 🎨 Canva MCP Server\n\n[![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)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n[![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg)](https://nodejs.org/)\n[![NPM Version](https://img.shields.io/npm/v/@elisbanpaco/mcp-canva-gemini-cli.svg)](https://www.npmjs.com/package/@elisbanpaco/mcp-canva-gemini-cli)\n[![MCP Standard](https://img.shields.io/badge/Protocol-Model%20Context%20Protocol-purple.svg)](https://modelcontextprotocol.io)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue.svg)](https://www.typescriptlang.org/)\n[![Tested with Vitest](https://img.shields.io/badge/Tested%20with-Vitest-yellow.svg)](https://vitest.dev/)\n\nConecta 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.\n\n---\n\n## ⚡ Inicio Rápido (Quickstart)\n\n### 1. Configuración Directa vía `npx`\n\nPuedes ejecutarlo directamente con `npx` sin necesidad de clonar el repositorio:\n\n#### 🤖 Google Antigravity / Gemini CLI (`~/.gemini/config/mcp_config.json`)\n```json\n{\n  \"mcpServers\": {\n    \"canva\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"--package\", \"@elisbanpaco/mcp-canva-gemini-cli\", \"mcp-canva\"],\n      \"env\": {\n        \"CANVA_CLIENT_ID\": \"tu_client_id\",\n        \"CANVA_CLIENT_SECRET\": \"tu_client_secret\"\n      }\n    }\n  }\n}\n```\n\n#### 🟣 Claude Desktop (`claude_desktop_config.json`)\n```json\n{\n  \"mcpServers\": {\n    \"canva\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"--package\", \"@elisbanpaco/mcp-canva-gemini-cli\", \"mcp-canva\"],\n      \"env\": {\n        \"CANVA_CLIENT_ID\": \"tu_client_id\",\n        \"CANVA_CLIENT_SECRET\": \"tu_client_secret\"\n      }\n    }\n  }\n}\n```\n\n#### 💻 Cursor IDE (`.cursor/mcp.json`)\n```json\n{\n  \"mcpServers\": {\n    \"canva\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"--package\", \"@elisbanpaco/mcp-canva-gemini-cli\", \"mcp-canva\"],\n      \"env\": {\n        \"CANVA_CLIENT_ID\": \"tu_client_id\",\n        \"CANVA_CLIENT_SECRET\": \"tu_client_secret\"\n      }\n    }\n  }\n}\n```\n\n---\n\n## 🧰 Herramientas Disponibles\n\nUna vez conectado, puedes pedirle a tu IA:\n\n| Herramienta | ¿Qué hace? | Ejemplo de Prompt |\n| :--- | :--- | :--- |\n| `canva_list_designs` | Lista tus diseños recientes con miniaturas y enlaces de edición. | *\"Muéstrame mis presentaciones recientes en Canva\"* |\n| `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\"* |\n| `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\"* |\n| `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\"* |\n| `canva_list_folders` | Explora el contenido de tu carpeta raíz de Canva. | *\"¿Qué elementos tengo en mi carpeta principal de Canva?\"* |\n| `canva_list_folder_items` | Lista los elementos dentro de una carpeta específica. | *\"Muéstrame los archivos dentro de la carpeta con ID X\"* |\n| `canva_create_folder` | Crea una nueva carpeta en tu Canva. | *\"Crea una carpeta llamada Proyectos 2026\"* |\n| `canva_upload_asset` | Sube una imagen local de tu computadora a Canva. | *\"Sube la imagen ./banner.png a mi cuenta de Canva\"* |\n| `canva_get_auth_status` | Verifica el estado de conexión y validez de los tokens. | *\"Revisa si mi conexión con Canva está activa\"* |\n\n---\n\n## 🔑 Configuración Inicial de Credenciales\n\n1. Entra a [Canva Developers](https://www.canva.com/developers/) y haz clic en **`Your integrations`**.\n2. Haz clic en **`Create an integration`** $\\rightarrow$ Elige **`Public`**.\n   \n   ![Crear Integración Canva](./assets/configure_integracion.png)\n\n3. En **`Credentials`**, copia tu **Client ID** y genera tu **Client Secret**.\n4. En **`Scopes`**, activa los permisos (son los únicos compatibles):\n   * `design:content:read`, `design:content:write`, `design:meta:read`\n   * `asset:read`, `asset:write`, `folder:read`, `folder:write`, `app:read`\n   \n   ![Configuración de Scopes en Canva](./assets/scopes.png)\n\n5. En **`Authentication`**, agrega la URL de redirección exacta:\n   `http://127.0.0.1:3000/callback`\n   \n   ![Añadir URL de Redirect](./assets/auth-url-add.png)\n\n### Autenticación (Solo la primera vez)\n\nComo Canva exige credenciales por usuario, abre tu terminal y ejecuta esto para autenticarte y guardar los tokens de forma segura:\n\n```bash\n# En Linux/macOS\nexport CANVA_CLIENT_ID=\"tu_client_id\"\nexport CANVA_CLIENT_SECRET=\"tu_client_secret\"\nnpx -p @elisbanpaco/mcp-canva-gemini-cli mcp-canva-auth\n\n# En Windows (PowerShell)\n$env:CANVA_CLIENT_ID=\"tu_client_id\"\n$env:CANVA_CLIENT_SECRET=\"tu_client_secret\"\nnpx -p @elisbanpaco/mcp-canva-gemini-cli mcp-canva-auth\n```\n\nSe abrirá tu navegador para confirmar. ¡Listo! Tus tokens se guardarán con permisos `0600` en tu sistema operativo.\n\n---\n\n## 🏗️ Arquitectura y Seguridad\n\n```mermaid\nsequenceDiagram\n    autonumber\n    actor User as Usuario / Asistente IA\n    participant MCP as Canva MCP Server (Stdio)\n    participant Vault as Bóveda de Tokens (~/.config/canva-mcp)\n    participant CanvaOAuth as Canva OAuth2 (PKCE S256)\n    participant CanvaAPI as Canva Connect API (REST v1)\n\n    Note over User,CanvaAPI: 1. Flujo de Autenticación (pnpm auth)\n    MCP->>CanvaOAuth: Inicia flujo PKCE con desafío SHA-256\n    CanvaOAuth-->>MCP: Redirección con Código de Autorización\n    MCP->>CanvaOAuth: Intercambio de código por Tokens de acceso\n    CanvaOAuth-->>MCP: Access Token + Refresh Token\n    MCP->>Vault: Guarda en almacenamiento seguro (Permisos 0600)\n\n    Note over User,CanvaAPI: 2. Ejecución de Herramientas en Tiempo Real\n    User->>MCP: Llama a herramienta (ej. canva_list_designs)\n    MCP->>Vault: Carga token válido (Auto-renovación con Mutex)\n    MCP->>CanvaAPI: Petición HTTP Bearer con Exponential Backoff\n    CanvaAPI-->>MCP: Respuesta JSON con metadatos y URLs\n    MCP-->>User: Resultado estructurado\n```\n\n### Características de Ingeniería:\n* 🔐 **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).\n* ⚡ **Mutex Anticolisiones**: Previene condiciones de carrera cuando el modelo ejecuta múltiples herramientas en paralelo durante la renovación del token.\n* 🛡️ **Exponential Backoff**: Reintentos automáticos con retroceso exponencial ante límites de tasa (`HTTP 429`) y caídas temporales (`5xx`).\n* 🧪 **100% Test Coverage**: Suite completa de pruebas unitarias con Vitest.\n\n---\n\n## 🧪 Pruebas y Desarrollo\n\n```bash\n# Ejecutar suite de pruebas unitarias\npnpm test\n\n# Verificación estricta de tipos TypeScript\npnpm typecheck\n\n# Compilar paquete de producción\npnpm build\n```\n\n---\n\n## 📄 Licencia\n\nEste proyecto está bajo la licencia **MIT**. Consulta el archivo [LICENSE](LICENSE) para más detalles.\n","readmeFilename":"README.md"}