MCP Server y Claude Code

Por: Artiko
openpencilmcpclaude-codecursorwindsurfintegración

MCP Server y Claude Code

¿Qué es el protocolo MCP?

MCP (Model Context Protocol) es un estándar abierto creado por Anthropic que permite a los modelos de lenguaje comunicarse con herramientas externas de forma estructurada. En lugar de copiar y pegar JSON entre tu editor y una app, el modelo puede directamente llamar a las herramientas del sistema externo como si fueran funciones de código.

OpenPencil implementa un MCP server que expone el canvas del editor como un conjunto de herramientas invocables por cualquier cliente MCP compatible. Esto significa que desde Claude Code puedes crear, modificar y consultar diseños en OpenPencil sin salir de tu entorno de desarrollo.

sequenceDiagram
    participant D as Desarrollador
    participant CC as Claude Code
    participant MCP as OpenPencil MCP Server
    participant OP as OpenPencil Canvas

    D->>CC: "Diseña el componente UserCard"
    CC->>MCP: new_document({name: "UserCard"})
    MCP->>OP: Crea documento
    CC->>MCP: design_skeleton({prompt: "..."})
    MCP->>OP: Estructura inicial
    CC->>MCP: design_content({pageId: "..."})
    MCP->>OP: Contenido real
    CC->>MCP: design_refine({pageId: "..."})
    MCP->>OP: Estilos finales
    CC->>MCP: get_page_tree({pageId: "..."})
    MCP-->>CC: Árbol de nodos
    CC->>D: "UserCard diseñado. Exportando..."
    CC->>MCP: export_react({componentId: "..."})
    MCP-->>CC: Código React + Tailwind
    CC->>D: Muestra el código generado

Iniciar el MCP Server de OpenPencil

El MCP server de OpenPencil se inicia como un proceso separado que expone las herramientas de diseño vía el protocolo MCP:

# Iniciar el MCP server en el puerto por defecto (3333)
op mcp start

# Iniciar en un puerto específico
op mcp start --port 4444

# Iniciar con log detallado
op mcp start --verbose

# Iniciar con un documento específico ya abierto
op mcp start --file mi-proyecto.op

# El server acepta conexiones en:
# stdio (para Claude Code local)
# WebSocket ws://localhost:3333 (para integraciones remotas)

Configurar en Claude Code

Claude Code soporta MCP servers nativamente. La configuración se hace en ~/.claude/settings.json:

// ~/.claude/settings.json
{
  "mcpServers": {
    "openpencil": {
      "command": "op",
      "args": ["mcp", "start", "--stdio"],
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-...",
        "OPENPENCIL_WORKSPACE": "/home/usuario/Diseños"
      }
    }
  }
}

La opción --stdio hace que el server use stdin/stdout en lugar de WebSocket, lo que es más eficiente para uso local con Claude Code.

Verificar la conexión

# En Claude Code, prueba que el MCP está disponible
/mcp list

# Deberías ver:
# ✓ openpencil - OpenPencil Design Tools (12 tools available)

# Listar herramientas disponibles
/mcp tools openpencil

Configuración con variables de entorno

Para no exponer la API key en el archivo de configuración:

# ~/.zshrc
export ANTHROPIC_API_KEY="sk-ant-..."
export OPENPENCIL_WORKSPACE="$HOME/Diseños"
// ~/.claude/settings.json
{
  "mcpServers": {
    "openpencil": {
      "command": "op",
      "args": ["mcp", "start", "--stdio"],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "OPENPENCIL_WORKSPACE": "${OPENPENCIL_WORKSPACE}"
      }
    }
  }
}

Configurar en Cursor

Cursor usa el mismo protocolo MCP. La configuración va en .cursor/mcp.json dentro del proyecto (o en la configuración global de Cursor):

// .cursor/mcp.json
{
  "mcpServers": {
    "openpencil": {
      "command": "op",
      "args": ["mcp", "start", "--stdio"],
      "description": "OpenPencil design tools for creating and modifying UI designs",
      "env": {
        "OPENPENCIL_WORKSPACE": "./designs"
      }
    }
  }
}

En Cursor, puedes verificar el estado del MCP desde Settings → MCP Servers.

Configurar en Windsurf y Codex

Windsurf

// ~/.windsurf/mcp.json
{
  "servers": {
    "openpencil": {
      "transport": "stdio",
      "command": "op mcp start --stdio",
      "capabilities": ["design", "canvas", "export"]
    }
  }
}

GitHub Copilot (VS Code con extensión MCP)

// .vscode/settings.json
{
  "github.copilot.mcp.servers": {
    "openpencil": {
      "command": "op",
      "args": ["mcp", "start", "--stdio"]
    }
  }
}

Herramientas MCP disponibles

El MCP server expone 12 herramientas principales que Claude puede invocar:

open_file

Abre un archivo .op existente para trabajar con él:

// Claude lo invoca internamente así:
open_file({
  path: "./designs/dashboard.op"
})
// Respuesta: { documentId: "doc-abc123", pages: [...] }

new_document

Crea un nuevo documento de diseño:

new_document({
  name: "UserCard Component",
  width: 400,    // Ancho del frame inicial
  height: 300,   // Alto del frame inicial
  workspace: "./designs"
})
// Respuesta: { documentId: "doc-xyz", pageId: "page-1" }

get_page_tree

Obtiene el árbol de nodos de una página:

get_page_tree({
  documentId: "doc-abc123",
  pageId: "page-1"
})
// Respuesta: árbol JSON completo de todos los nodos

find_nodes

Busca nodos por criterios específicos:

find_nodes({
  documentId: "doc-abc123",
  filters: {
    type: "TEXT",           // Tipo de nodo
    name: "Button*",        // Patrón de nombre (glob)
    hasStyle: "fill-blue",  // Que tenga un estilo específico
    page: "all"             // En todas las páginas
  }
})

get_node

Obtiene todas las propiedades de un nodo específico:

get_node({
  documentId: "doc-abc123",
  nodeId: "node-789"
})
// Respuesta: objeto completo con todas las propiedades del nodo

list_pages

Lista todas las páginas del documento:

list_pages({
  documentId: "doc-abc123"
})
// Respuesta: [{id, name, nodeCount, thumbnailUrl}, ...]

design_skeleton

Primera fase del flujo de diseño: crea la estructura:

design_skeleton({
  documentId: "doc-abc123",
  pageId: "page-1",
  prompt: "Dashboard con sidebar de navegación, header con usuario y área principal con grid de métricas"
})
// Respuesta: { status: "completed", nodesCreated: 45, nextStep: "design_content" }

design_content

Segunda fase: rellena con contenido real:

design_content({
  documentId: "doc-abc123",
  pageId: "page-1",
  context: "App de analytics para ecommerce. Usuario: [email protected]"
})

design_refine

Tercera fase: aplica estilos y pulido visual:

design_refine({
  documentId: "doc-abc123",
  pageId: "page-1",
  brandTokens: {
    colorPrimary: "#2563EB",
    fontHeading: "Inter",
    fontBody: "DM Sans",
    borderRadius: 8
  }
})

export_react

Exporta un nodo o página a React + Tailwind:

export_react({
  documentId: "doc-abc123",
  nodeId: "component-btn-primary",  // Exportar componente específico
  options: {
    typescript: true,
    useShadcn: false,
    outputPath: "./src/components"
  }
})
// Respuesta: { code: "...", filename: "ButtonPrimary.tsx" }

update_node

Modifica propiedades de un nodo existente:

update_node({
  documentId: "doc-abc123",
  nodeId: "text-heading",
  properties: {
    content: "Nuevo título",
    fontSize: 32,
    fontWeight: 700,
    fills: [{ type: "SOLID", color: "#1E293B" }]
  }
})

create_component

Crea un nuevo componente con variantes:

create_component({
  documentId: "doc-abc123",
  pageId: "page-1",
  name: "Badge",
  variants: [
    { name: "success", props: { color: "#16A34A" } },
    { name: "error", props: { color: "#DC2626" } },
    { name: "warning", props: { color: "#D97706" } }
  ]
})

El flujo de diseño desde Claude Code

Flujo básico: un componente desde cero

El flujo más común es pedir a Claude que diseñe un componente y lo exporte directamente al proyecto:

# En Claude Code
Necesito un componente UserCard para mi app React.
El componente muestra: avatar circular del usuario, nombre completo, 
cargo, departamento y un badge de estado (online/offline/away).
Diseña el componente en OpenPencil y luego expórtalo a React + Tailwind 
en src/components/UserCard.tsx

Claude invocará internamente las herramientas en este orden:

flowchart TD
    A[new_document<br/>Crea documento UserCard] --> B[design_skeleton<br/>Estructura del componente]
    B --> C[design_content<br/>Avatar, nombre, cargo, badge]
    C --> D[design_refine<br/>Colores, tipografía, sombras]
    D --> E[get_page_tree<br/>Verifica el resultado]
    E --> F[export_react<br/>Genera código TypeScript]
    F --> G[Escribe archivo<br/>src/components/UserCard.tsx]

Flujo avanzado: sistema de diseño completo

Para proyectos más ambiciosos, Claude puede construir un sistema de diseño completo:

Necesito un design system para mi app SaaS de gestión de proyectos.
El stack es React + Tailwind CSS + shadcn/ui.
El branding es: moderno, minimalista, confiable.
Color primario: #2563EB (azul corporativo).

Por favor:
1. Crea el documento de design system en designs/system.op
2. Diseña y exporta estos componentes:
   - Button (4 variantes: primary, secondary, ghost, destructive)
   - Input (estados: default, focus, error, disabled)
   - Card (header, body, footer opcionales)
   - Badge (5 variantes de color + tamaños sm/md/lg)
   - Avatar (con imagen + fallback con iniciales)
3. Exporta todos a src/components/ui/ con TypeScript
4. Genera el archivo de tokens CSS en src/styles/tokens.css

Iterar sobre diseños existentes

Si ya tienes un archivo .op en tu proyecto:

Abre el archivo designs/dashboard.op.
En la página "Mobile", el componente "BottomNav" tiene el ícono de 
configuración equivocado. Reemplázalo con el ícono "settings" de Heroicons.
Luego exporta solo ese componente actualizado.

Claude usará open_filefind_nodes (busca “BottomNav”) → update_nodeexport_react.

Ejemplos de prompts para diseño con MCP

Componentes UI comunes

Diseña en OpenPencil y exporta a React:

[MODAL DE CONFIRMACIÓN]
- Overlay semi-transparente oscuro
- Card centrada (max 400px)
- Ícono de advertencia (Heroicons: exclamation-triangle)
- Título "¿Confirmar acción?"
- Descripción personalizable como prop
- Dos botones: "Cancelar" (ghost) y "Confirmar" (destructive)
- Animación de entrada: fade + scale desde el centro
Diseña en OpenPencil y exporta a React:

[SIDEBAR DE NAVEGACIÓN]
- Ancho: 260px, altura: 100vh
- Logo del app en la parte superior (placeholder)
- Sección "Principal": 5 items de nav con iconos
- Sección "Configuración": 3 items de nav
- Perfil del usuario en la parte inferior (avatar + nombre + logout)
- Estado active visible en el item actual
- Versión colapsada (solo iconos) como variante

Pantallas completas

Diseña en OpenPencil:

[PANTALLA DE ONBOARDING]
Paso 3 de 5: "Configura tu equipo"
- Progress bar en el top mostrando 60%
- Título grande y descripción
- Campo para nombre del equipo
- Grid de avatares para invitar miembros (input de email + botón add)
- Lista de miembros ya agregados con opción de eliminar
- Botones de navegación: "Anterior" y "Siguiente"
- Diseño limpio, mucho whitespace, tipografía Inter

Modificaciones sobre diseños existentes

En el archivo designs/landing.op, página "Desktop":
1. Busca la sección "Pricing" 
2. El plan "Pro" necesita el badge "Más popular" encima del título
3. Cambia el CTA del plan Pro de "Empezar" a "Empezar gratis 14 días"
4. Agrega un texto pequeño debajo: "Sin tarjeta de crédito"
5. Exporta la sección Pricing actualizada como PricingSection.tsx

Configuración del proyecto para equipos

Para que todo el equipo use la misma configuración de MCP, crea un archivo de configuración compartido en el repositorio:

// .openpencil/mcp-config.json (commiteado al repo)
{
  "workspace": "./designs",
  "defaultPage": {
    "width": 1440,
    "height": 900
  },
  "brandTokens": {
    "colorPrimary": "#2563EB",
    "colorSecondary": "#7C3AED",
    "fontHeading": "Inter",
    "fontBody": "DM Sans",
    "borderRadius": 8,
    "spacingBase": 4
  },
  "exportDefaults": {
    "framework": "react",
    "typescript": true,
    "outputDir": "./src/components/generated"
  }
}
// .cursor/mcp.json (commiteado al repo)
{
  "mcpServers": {
    "openpencil": {
      "command": "op",
      "args": ["mcp", "start", "--stdio", "--config", ".openpencil/mcp-config.json"]
    }
  }
}

El archivo mcp-config.json se commitea al repositorio (sin API keys), y cada desarrollador agrega su API key en su configuración local (~/.claude/settings.json o variables de entorno).

Debugging y troubleshooting

Ver logs del MCP server

# Iniciar con logs detallados
op mcp start --verbose --log-file ~/.openpencil/mcp.log

# Ver logs en tiempo real
tail -f ~/.openpencil/mcp.log

Problemas comunes

El MCP server no aparece en Claude Code

# Verificar que op está en el PATH
which op
op --version

# Reiniciar Claude Code después de cambiar settings.json
# En Claude Code: /restart

Error “Connection refused”

# Verificar que el server está corriendo
op mcp status

# Si no está corriendo, iniciarlo manualmente
op mcp start --stdio &

Las herramientas no responden

# Verificar que OpenPencil Desktop está abierto
# El MCP server necesita que la app esté corriendo
op start  # Abre la app de escritorio

# En otro terminal, iniciar el MCP server
op mcp start --stdio

Prueba manual de las herramientas MCP

Puedes probar las herramientas directamente desde Claude Code:

# Prueba rápida del MCP
Por favor usa la herramienta MCP "openpencil" para:
1. Crear un nuevo documento llamado "test"
2. Obtener la lista de páginas
3. Mostrarme el resultado

Resumen

En este capítulo has aprendido:

En el próximo capítulo profundizaremos en las opciones de exportación de código.