# Penpot MCP — notas de este deployment Investigado a fondo en la Fase 1 (código fuente oficial + docs), para saber exactamente qué tools/parámetros existen realmente en este deployment y cuáles hay que excluir del dataset de entrenamiento. ## Identificación del proyecto - Repo oficial: `github.com/penpot/penpot/tree/develop/mcp` (antes `penpot/penpot-mcp`, ahora archivado y fusionado al monorepo principal). - Paquete npm: `@penpot/mcp` (se ejecuta vía `npx -y @penpot/mcp@latest`). - Monorepo con 4 paquetes: `packages/common` (tipos compartidos), `packages/server` (servidor MCP), `packages/plugin` (plugin de Penpot vía WebSocket), `types-generator`. - Confirmado con 100% de coincidencia contra el código fuente (`mcp/packages/server/src/tools/*.ts`) comparando las descripciones exactas de las 4 tools (incluida la frase gramaticalmente atípica "You have access two main objects" en `execute_code`). ## Tools registradas en el código, por condición de gating - **Siempre registradas** (presentes en nuestro deployment): `execute_code`, `high_level_overview`, `penpot_api_info`, `export_shape`. - **`import_image`** — registrada solo si `mcpServer.isFileSystemAccessEnabled()` es `true`. **Ausente en nuestro deployment.** - **Solo en modo devenv interno de Penpot** (`PENPOT_MCP_DEVENV=true`, para el equipo core, no para diseñadores): `CljsReplTool`, `ImportPenpotFileTool`, `CljsCompilerOutputTool`, `CljCheckParentheses`, `ReadTaigaIssueTool` (Clojure REPL y Taiga — no relevante para el dataset de diseño). ## Lógica exacta del gating (`PenpotMcpServer.ts`) ``` isRemoteMode() = isMultiUserMode() || (PENPOT_MCP_REMOTE_MODE === "true") isFileSystemAccessEnabled() = !isRemoteMode() ``` `import_image` solo se registra si `isFileSystemAccessEnabled()` es verdadero. ## `export_shape` y `filePath` El schema oficial SÍ define un parámetro opcional `filePath` (para guardar el export a disco), pero el constructor de `ExportShapeTool` hace `delete schema.filePath` cuando `!isFileSystemAccessEnabled()`. La descripción también agrega condicionalmente la frase "Alternatively, you can save it to a file." solo cuando el filesystem está habilitado. **En nuestro deployment, `export_shape` NO tiene `filePath`** (ver `penpot.json`) — señal inequívoca de que este deployment corre en modo remoto/multi-usuario con acceso a filesystem deshabilitado, la misma condición que oculta `import_image`. ## Estructura de la Penpot Plugin API (accesible desde `execute_code`) El objeto global `penpot` (tipo `Penpot`, ver docs oficiales en https://help.penpot.app/plugins/ y https://doc.plugins.penpot.app/, tipos vía npm `@penpot/plugin-types`) expone: - `ui`, `utils` (`ContextUtils`), `root`/`currentFile`/`currentPage`/`viewport`, `library`, `fonts`, `currentUser`/`activeUsers`, `theme`, `localStorage`, `selection`. - Métodos de creación: `createRectangle`, `createBoard`, etc. - Árbol de diseño: `Page` → `Board`/`Group` → shapes de bajo nivel (`Rectangle`, `Path`, `Text`, `Ellipse`, `Image`, `Boolean`, `SvgRaw`), todos derivando de `ShapeBase`/`Shape`. **Importante**: `penpotUtils` (visto en la descripción de `execute_code`) **no es API oficial de Penpot** — es una capa de conveniencia propia del plugin MCP (`mcp/packages/plugin/src/PenpotUtils.ts`), con helpers como `findShapeById`, `exportImage`, `importImage`, `setParentXY`. No confundir con la API oficial `penpot`. ## Implicación para el dataset de entrenamiento (Fase 2) El bucket de Penpot debe reflejar que, en deployments remotos/multi-usuario (como este), `import_image` y `export_shape(filePath)` no existen. El modelo debe aprender a: - Nunca intentar llamar `import_image` (no existe como tool). - Nunca pasar `filePath` a `export_shape` (el parámetro no está en el schema; si el modelo lo inventa, la llamada fallará con un error de parámetro no reconocido). - Devolver imágenes por respuesta directa (base64/PNG vía `export_shape`) en vez de asumir escritura a disco.