# Cómo generar imágenes con Claude Code: SVG, script o MCP

> Claude Code no genera píxeles: las imágenes salen de código que escribe y ejecuta, o de un modelo externo vía script o MCP. Qué vía elegir y cuánto cuesta.

- URL: https://blog.laozhang.ai/es/posts/claude-code-image-generation
- Published: 2026-10-02
- Updated: 2026-10-02
- Author: LaoZhang AI Team (https://blog.laozhang.ai/es/about)
- Category: Claude Code
- Tags: Claude Code, Generación de imágenes, GPT Image 2.5, Gemini API, MCP, Skills

---
Claude Code no produce imágenes por sí mismo. Lo que sí hace, y muy bien, es escribir y ejecutar lo que las produce. A 2 de octubre de 2026, una imagen que aparece en tu proyecto durante una sesión tiene uno de estos dos orígenes:

- **Código que Claude escribe y renderiza**: un SVG, un HTML o un script de Python que se convierte en PNG o WebP. Sirve para diagramas, gráficos, iconos sencillos y portadas con texto. No necesita clave ni cuesta nada aparte de la propia sesión.
- **Un modelo de imagen externo**: GPT Image de OpenAI, los modelos de imagen de Gemini, FLUX y similares. Claude Code llega a ellos con un script que llama a la API o con un servidor MCP. Es la única vía para fotografía e ilustración, y casi siempre se paga por imagen o por tokens.

La decisión, por tanto, empieza por el tipo de imagen y sigue por dos condiciones tuyas: si puedes activar una API de pago y si trabajas solo o en un repositorio compartido.

## Claude Code no dibuja píxeles: quién genera realmente la imagen

Ningún modelo ni plan de Claude devuelve imágenes. El centro de ayuda de Anthropic lo dice así: «Claude doesn't generate photos or illustrations the way image-generation tools do», y añade que puede crear gráficos y diagramas como HTML o SVG ([artículo de ayuda](https://support.claude.com/en/articles/9002504-can-claude-produce-images)). La documentación de la API es más tajante: Claude es «an image understanding model only» y no puede generar, editar ni manipular imágenes ([documentación de Visión](https://platform.claude.com/docs/en/build-with-claude/vision)).

Conviene separar tres cosas que suelen mezclarse:

- **Leer imágenes** sí es una capacidad de Claude Code: puedes arrastrar un archivo, pegarlo con Ctrl+V (Alt+V en Windows y WSL) o darle la ruta, y la herramienta Read le muestra el contenido.
- **Generar imágenes** no lo es. Cuando alguien dice que «Claude genera imágenes», lo que ocurre es que Claude Code ejecuta algo que las genera.
- **Las aplicaciones de chat de Claude** son otra superficie, con sus propias opciones. Para ellas tienes la guía [¿Puede Claude generar imágenes?](https://blog.laozhang.ai/es/posts/can-claude-generate-images).

Anthropic tampoco ofrece un conector ni una skill propios con un modelo de imagen. Los conectores relacionados con imágenes que aparecen en su directorio, como los de Adobe, Canva o Hugging Face, están hechos por esas empresas. Y las skills de imagen del repositorio oficial `anthropics/skills` (`canvas-design`, `algorithmic-art`, `slack-gif-creator`) renderizan con código, sin llamar a ningún modelo de imagen.

## Qué vía elegir según la imagen que necesitas

Si la imagen se puede describir con formas, texto y datos, usa código; si necesita textura fotográfica o trazo de ilustración, necesitas un modelo. El resto de la elección depende del acceso y del equipo.

![Árbol de decisión para elegir vía en Claude Code: SVG por código si bastan formas y texto; script contra OpenAI o Gemini o MCP de pago si puedes activar una API; cupo diario si no](https://blog.laozhang.ai/posts/es/claude-code-image-generation/img/elegir-via-imagen.webp)

| Lo que necesitas | Vía | Qué hace falta | Coste | Dónde queda el archivo |
| --- | --- | --- | --- | --- |
| Diagrama, gráfico, portada con texto, icono geométrico | SVG o HTML renderizado por código | `rsvg-convert`, `cwebp` o Pillow instalados | Solo la sesión de Claude Code | En la ruta del proyecto que indiques |
| Foto o ilustración, con control de modelo, tamaño y calidad | Script contra la API de OpenAI | `OPENAI_API_KEY`; puede exigir verificar la organización | Por tokens: USD 30 por millón de tokens de imagen de salida | En la ruta que pases en `--out` |
| Foto o ilustración con precio fijo por imagen | Script contra la API de Gemini | Clave de Gemini con facturación activada | De USD 0,0336 a USD 0,24 por imagen según modelo y resolución | En la ruta que elija el script |
| Probar modelos abiertos sin pagar al principio | Servidor MCP de Hugging Face o API de Cloudflare Workers AI | Cuenta gratuita | Cupo diario pequeño, no imágenes sin límite | MCP: carpeta de la sesión, fuera del proyecto |
| Elegir entre muchos modelos sin escribir código | Servidor MCP de fal.ai o Replicate | Cuenta y saldo en esa plataforma | Cada ejecución de modelo se paga | Carpeta de la sesión, fuera del proyecto |

Dos reglas prácticas salen de la tabla. En un repositorio compartido, el script dentro de una skill de proyecto es lo más fácil de revisar: todo el equipo ve qué modelo se llama, con qué parámetros y dónde se guarda el resultado. Y si no puedes activar ninguna API de pago, empieza por la vía de código; cubre más casos de los que parece.

## Diagramas, gráficos y portadas con texto: SVG renderizado sin modelo de imagen

Para todo lo que sea estructura y texto, pídele a Claude Code que escriba un SVG y lo convierta a PNG o WebP con una herramienta local. El texto sale nítido y exacto, el tamaño es el que pidas al píxel y puedes corregir un detalle editando una línea en lugar de volver a generar.

Las imágenes de este blog se hacen así, sin ningún modelo de imagen: Claude escribe el SVG, `rsvg-convert` lo renderiza a un PNG de tamaño exacto y `cwebp` lo convierte a WebP. Las portadas miden 2400×1350 y las imágenes de cuerpo, 2000×1125. Los 18 archivos WebP de un artículo publicado el 2 de octubre de 2026 pesaron entre 136 KB y 192 KB cada uno. En una prueba del día anterior, un SVG de 911 bytes escrito a mano se renderizó a un PNG de 1600×600 en 135 ms, y Pillow se encargó del recorte, el paso a escala de grises y la conversión a WebP. Son datos de un solo sitio y una sola máquina, pero dan una idea del orden de magnitud.

Una petición suficiente para empezar:

```text
Escribe assets/arquitectura.svg (1600×900) con el flujo: navegador → API → cola → worker.
Renderízalo a PNG con rsvg-convert al mismo tamaño, conviértelo a WebP,
abre el PNG con Read y corrige solapes de texto o elementos fuera del lienzo.
```

El límite es claro: esta vía compone, recorta y convierte, pero no puede crear una fotografía ni una ilustración nueva. Si lo que buscas es un retrato, un producto en una escena o un estilo pictórico, pasa a la siguiente.

## Fotos e ilustraciones con un script: generate.py y la API de OpenAI

La forma más controlable de usar un modelo de imagen desde Claude Code es un script pequeño que Claude ejecuta con Bash. Los modelos de imagen vigentes de OpenAI son `gpt-image-2.5-flare` (rápido, para uso diario) y `gpt-image-2.5-sunburst` (más preciso en edición), y se llaman con `POST /v1/images/generations` según su [guía de generación de imágenes](https://developers.openai.com/api/docs/guides/image-generation). La API no devuelve un archivo ni una URL, sino la imagen en base64 dentro de `data[0].b64_json`, PNG por defecto: alguien tiene que decodificarla y escribirla en disco. Eso es lo que hace este script, que solo usa la biblioteca estándar de Python:

```python
#!/usr/bin/env python3
"""Generate one image with the OpenAI Images API and save it to disk.

Standard library only. Reads the key from OPENAI_API_KEY; never prints it.
"""
import argparse
import base64
import json
import os
import pathlib
import sys
import urllib.error
import urllib.request

MODELS = ("gpt-image-2.5-flare", "gpt-image-2.5-sunburst")


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--prompt", required=True)
    parser.add_argument("--out", required=True, help="output file, e.g. assets/hero.png")
    parser.add_argument("--model", default="gpt-image-2.5-flare", choices=MODELS)
    parser.add_argument("--size", default="1536x1024")
    parser.add_argument("--quality", default="low")
    args = parser.parse_args()

    key = os.environ.get("OPENAI_API_KEY")
    if not key:
        print("OPENAI_API_KEY is not set. Export it in the shell before starting claude.", file=sys.stderr)
        return 2

    out = pathlib.Path(args.out)
    if out.exists():
        print(f"{out} already exists. Choose another --out so nothing is overwritten.", file=sys.stderr)
        return 2

    base = os.environ.get("OPENAI_BASE_URL", "https://api.openai.com/v1").rstrip("/")
    body = json.dumps({
        "model": args.model,
        "prompt": args.prompt,
        "size": args.size,
        "quality": args.quality,
    }).encode()
    request = urllib.request.Request(
        f"{base}/images/generations",
        data=body,
        headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"},
    )
    try:
        with urllib.request.urlopen(request, timeout=300) as response:
            payload = json.load(response)
    except urllib.error.HTTPError as error:
        print(f"HTTP {error.code}: {error.read().decode(errors='replace')[:600]}", file=sys.stderr)
        return 1
    except urllib.error.URLError as error:
        print(f"Request failed: {error.reason}", file=sys.stderr)
        return 1

    out.parent.mkdir(parents=True, exist_ok=True)
    out.write_bytes(base64.b64decode(payload["data"][0]["b64_json"]))
    print(json.dumps({"saved": str(out), "bytes": out.stat().st_size, "usage": payload.get("usage")}))
    return 0


if __name__ == "__main__":
    sys.exit(main())
```

Guárdalo, por ejemplo, en `.claude/skills/image/scripts/generate.py`. Exporta la clave en la terminal antes de arrancar `claude` (Claude Code lee las variables de entorno al iniciarse, así que un cambio de clave exige reiniciarlo) y pídele la imagen con una ruta de salida concreta. La llamada que acabará ejecutando tiene esta forma:

```bash
python3 .claude/skills/image/scripts/generate.py \
  --prompt "Fotografía de producto: taza de cerámica blanca sobre mesa de roble, luz lateral suave" \
  --out assets/hero.png
```

Si todo va bien, el script imprime una línea JSON con `saved`, `bytes` y `usage`, y Claude sabe exactamente dónde está el archivo.

### Qué está comprobado del script y qué no

El alcance de la verificación es limitado y conviene saberlo: a 2 de octubre de 2026 el script solo se ejecutó en sus rutas de rechazo, sin clave real, y no generó ninguna imagen. Esto es lo observado:

| Condición | Resultado |
| --- | --- |
| `OPENAI_API_KEY` sin definir | Mensaje de error, código de salida 2, ninguna llamada de red |
| Clave falsa | La petición llega a api.openai.com y vuelve `HTTP 401` con `invalid_api_key`; salida 1, ningún archivo |
| `--model dall-e-3`, fuera de la lista permitida | argparse lo rechaza con «invalid choice» |
| `--out` apunta a un archivo que ya existe | Mensaje de error, salida 2, ninguna llamada de red |

Queda sin comprobar una generación correcta, la forma real del campo `usage`, el coste por imagen, la latencia y si tu cuenta acepta los valores por defecto. Esos valores (`1536x1024` y calidad `low`) son parámetros documentados por OpenAI: los tamaños recomendados son `1024x1024`, `1536x1024` y `1024x1536`, y la calidad admite `low`, `medium`, `high`, `xhigh`, `max` y `auto`.

### Tres detalles de OpenAI que cambian el resultado

- **Verificación de la organización.** OpenAI avisa de que puede exigir la verificación de la organización antes de usar los modelos GPT Image. Requiere un documento de identidad físico emitido por un país admitido, y una persona solo puede verificar una organización ([ayuda de OpenAI](https://help.openai.com/en/articles/10910291-api-organization-verification)). Si no puedes completarla, esta vía no te sirve con tu propia clave.
- **Tiempo de espera.** Un prompt complejo puede tardar hasta unos 2 minutos, por eso el script espera 300 segundos antes de rendirse.
- **Ritmo.** En el nivel 1 de uso el límite es de 5 imágenes por minuto. Un lote de 30 imágenes no termina antes de 6 minutos.

## Convierte el script en una skill /image para todo el repositorio

Una skill hace que Claude use el script sin que tengas que explicárselo en cada sesión. Las skills de proyecto viven en `.claude/skills/NOMBRE/SKILL.md` y las personales en `~/.claude/skills/NOMBRE/SKILL.md`; Claude decide cuándo usarlas a partir de `description`, o las invocas tú escribiendo `/image` ([documentación de skills](https://code.claude.com/docs/en/skills)).

```markdown
---
name: image
description: Genera una fotografía o ilustración con la API de imágenes de OpenAI y la guarda en el proyecto. Úsala cuando se pida una imagen que no pueda resolverse con SVG.
allowed-tools: Bash(python3 ${CLAUDE_SKILL_DIR}/scripts/generate.py *)
---

Ejecuta `python3 ${CLAUDE_SKILL_DIR}/scripts/generate.py --prompt "..." --out RUTA`.

- Guarda en `assets/` salvo que se indique otra carpeta. El script no sobrescribe: elige un nombre nuevo.
- Usa el modelo y la calidad por defecto salvo petición expresa.
- Tras generar, abre el archivo con Read y describe lo que ves antes de darlo por bueno.
- No generes más de una imagen por petición sin preguntar: cada ejecución es una llamada de pago.
```

La variable `${CLAUDE_SKILL_DIR}` se expande tanto en el cuerpo como en las reglas Bash de `allowed-tools`; la línea de arriba sigue el formato del ejemplo oficial, adaptado a la ruta de este script. Añadir o editar una skill surte efecto en la sesión en curso, salvo que la carpeta `skills` no existiera al arrancar: entonces hace falta `/reload-skills`.

Dos matices de `allowed-tools` que importan aquí. El permiso solo vale para el turno en que se invoca la skill y se retira con tu siguiente mensaje, de modo que no equivale a una autorización permanente. Y la documentación advierte de que el `allowed-tools` de una skill de proyecto no pasa por el control de confianza del espacio de trabajo: antes de ejecutar una skill que viene en un repositorio ajeno, lee qué comandos se concede.

Las skills personales no llegan a Cowork ni a las sesiones en la nube. Si quieres ideas sobre qué más instalar, mira [las mejores skills de Claude Code para instalar primero](https://blog.laozhang.ai/es/posts/claude-code-best-skills).

## Con la API de Gemini: tres modelos vigentes y sin nivel gratuito

Si prefieres un precio fijo por imagen, los modelos de imagen de Gemini (la familia Nano Banana) son la alternativa directa, pero exigen facturación activada: la tabla de precios de Google marca el nivel gratuito como «Not available» para los tres ([precios de la API de Gemini](https://ai.google.dev/gemini-api/docs/pricing)).

Los ID vigentes son `gemini-3.1-flash-lite-image`, `gemini-3.1-flash-image` y `gemini-3-pro-image`. Cuidado con los tutoriales antiguos: `gemini-2.5-flash-image` se retira el 2 de octubre de 2026, los ID de vista previa se apagaron el 25 de junio de 2026 y los de Imagen 4, el 17 de agosto de 2026 ([calendario de retiradas](https://ai.google.dev/gemini-api/docs/deprecations)). Un script que llame a uno de esos nombres fallará aunque la clave sea válida.

El ejemplo REST que Google publica hoy usa la API de Interactions: una petición `POST` a `https://generativelanguage.googleapis.com/v1beta/interactions`, con la clave en la cabecera `x-goog-api-key` y un cuerpo como este:

```json
{
  "model": "gemini-3.1-flash-image",
  "input": [{"type": "text", "text": "Ilustración isométrica de un servidor en una sala de máquinas"}]
}
```

`generateContent` sigue funcionando, aunque Google lo describe ya como la vía heredada. Todas las imágenes de salida llevan la marca de agua SynthID. La carpeta de la skill, el script completo y la extensión MCP de Google están explicados paso a paso en [Nano Banana en Claude Code: skill o MCP con modelos vigentes](https://blog.laozhang.ai/es/posts/nano-banana-claude-code).

## Servidores MCP de Hugging Face, fal.ai y Replicate: dónde queda el archivo

Un servidor MCP te ahorra escribir el script: Claude Code ve las herramientas del servidor y las llama directamente. A cambio, controlas menos dónde se guarda la imagen y cómo se almacena la clave. Los comandos siguientes proceden de la documentación de cada proveedor.

**Hugging Face.** El servidor oficial tiene instrucciones propias para Claude Code:

```bash
claude mcp add hf-mcp-server -t http "https://huggingface.co/mcp?login"
```

Las comillas evitan que zsh interprete el signo de interrogación. Después arrancas `claude` y completas la autenticación. La generación de imágenes funciona a través de los Spaces que añadas en huggingface.co/settings/mcp; los ejemplos de Hugging Face incluyen Spaces de FLUX y de Qwen. Lo que se anuncia como gratis es un cupo diario de GPU en ZeroGPU: 2 minutos sin autenticar, 5 minutos con cuenta gratuita y 40 con PRO, que se renueva 24 horas después del primer uso ([documentación de ZeroGPU](https://huggingface.co/docs/hub/spaces-zerogpu)).

**fal.ai.** Servidor alojado con cabecera de autorización:

```bash
claude mcp add --transport http fal-ai https://mcp.fal.ai/mcp --header "Authorization: Bearer YOUR_FAL_KEY"
```

El servidor es gratuito y pagas las ejecuciones de modelo que lances; entre sus herramientas están `run_model` y `get_pricing`, así que puedes pedirle a Claude que consulte el precio antes de generar ([documentación de fal](https://docs.fal.ai/model-apis/mcp)). Este comando deja la clave escrita en claro en la configuración.

**Replicate.** Su comando oficial es `claude mcp add replicate https://mcp.replicate.com/sse --transport sse --scope user`, seguido de `/mcp` para autenticarte. Usa el transporte SSE, que la documentación de Claude Code marca como obsoleto frente a HTTP.

Con cualquiera de ellos, cuando una herramienta MCP devuelve un PNG, JPEG, GIF o WebP, Claude lo ve en línea y Claude Code guarda los bytes originales en la carpeta `tool-results` de la sesión, bajo `~/.claude/projects/`, y le pasa la ruta a Claude. Esto exige la versión 2.1.283 o posterior ([documentación de MCP](https://code.claude.com/docs/en/mcp)). El archivo no está en tu proyecto: pídele a Claude que lo copie a la carpeta que necesites. Además, las herramientas que devuelven imágenes siguen sujetas al límite de salida de MCP, 25.000 tokens por defecto con aviso a partir de 10.000; si una imagen grande se corta, la única opción es subir `MAX_MCP_OUTPUT_TOKENS`. Lo que cada servidor devuelve exactamente, imagen en línea o URL, no figura en la documentación de Claude Code y depende del proveedor.

![Comparación de dónde queda el archivo y dónde vive la clave: con el script, en la ruta de --out del proyecto y la clave en el entorno; con MCP, en tool-results de la sesión y la clave en la configuración](https://blog.laozhang.ai/posts/es/claude-code-image-generation/img/archivo-y-clave.webp)

Los conectores de claude.ai, entre ellos el de Hugging Face, solo aparecen en Claude Code si inicias sesión con una cuenta de claude.ai; con `ANTHROPIC_API_KEY` no están.

## Cuánto cuesta cada imagen: tarifas oficiales y cómo calcularlo

El coste depende de la unidad de cobro de cada proveedor, y no todas permiten dar una cifra por imagen. Tarifas a 2 de octubre de 2026:

| Proveedor y modelo | Unidad de cobro | Tarifa | 100 imágenes |
| --- | --- | --- | --- |
| Código (SVG, Pillow) | Ninguna | Sin coste de imagen | Sin coste de imagen |
| OpenAI `gpt-image-2.5-flare` y `gpt-image-2.5-sunburst` | Tokens | USD 30 por millón de tokens de imagen de salida; USD 5 por millón de texto de entrada; USD 8 por millón de imagen de entrada | Depende de los tokens que consuma cada imagen |
| Gemini `gemini-3.1-flash-lite-image` | Imagen | USD 0,0336 (1K) | USD 3,36 |
| Gemini `gemini-3.1-flash-image` | Imagen | USD 0,045 (0,5K), USD 0,067 (1K), USD 0,101 (2K), USD 0,151 (4K) | USD 6,70 a 1K |
| Gemini `gemini-3-pro-image` | Imagen | USD 0,134 (1K y 2K), USD 0,24 (4K) | USD 13,40 a 1K o 2K |
| Cloudflare `@cf/black-forest-labs/flux-1-schnell` | Neurons | 10.000 al día sin coste; después, USD 0,011 por 1.000 | Dentro del cupo diario |

**OpenAI no publica un precio fijo por imagen.** El consumo de tokens varía con el tamaño y la calidad, y la única cifra fiable es la de tu propia respuesta. Por eso el script imprime `usage`: multiplica los tokens de imagen de salida por 30 y divide entre 1.000.000 para obtener el coste en dólares de esa llamada. El procesamiento por lotes baja la salida de imagen a USD 15 por millón. El desglose completo está en [Precio de GPT Image 2.5 Sunburst: por imagen, llamada y mes](https://blog.laozhang.ai/es/posts/gpt-image-2-5-api-pricing).

**Cloudflare se calcula con su tarifa de Neurons.** El modelo cobra 4,80 Neurons por cada bloque de 512×512 y 9,60 por paso, con 4 pasos por defecto ([ficha del modelo](https://developers.cloudflare.com/workers-ai/models/flux-1-schnell/)). Una imagen de 1024×1024 son 4 bloques: 4 × 4,80 + 4 × 9,60 = 57,6 Neurons. Con 10.000 Neurons diarios salen 10.000 ÷ 57,6 ≈ 173 imágenes al día, siempre que la cuenta no gaste el cupo en nada más. Es una estimación sobre la tarifa publicada. Superado el cupo, las peticiones fallan salvo que tengas Workers Paid, y entonces cada imagen así cuesta 57,6 × 0,011 ÷ 1.000 ≈ USD 0,0006. La llamada oficial es:

```bash
curl https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/ai/run/@cf/black-forest-labs/flux-1-schnell \
  -X POST \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -d '{ "prompt": "cyberpunk cat" }'
```

Devuelve un JPEG en base64, así que también necesita un paso de decodificación.

**Una opción de terceros con precio por llamada.** Si no puedes completar la verificación de OpenAI ni activar la facturación de Gemini, o quieres saber de antemano lo que cuesta cada llamada, laozhang.ai, el servicio de API de los autores de este blog, documenta puntos de acceso compatibles con la API de imágenes de OpenAI en `https://api2.laozhang.ai/v1`. Sus precios publicados eran de USD 0,03 por llamada para `gpt-image-2.5-flare-vip` y `gpt-image-2.5-sunburst-vip` a 12 de septiembre de 2026, y de USD 0,025, USD 0,055 y USD 0,09 por llamada para los tres modelos de imagen de Gemini a 24 de septiembre de 2026 ([documentación](https://docs.laozhang.ai/en/api-capabilities/gpt-image-2-5)). Es un intermediario, no OpenAI ni Google: sus condiciones, compromisos de datos y garantías de servicio no son los de esos proveedores. Para usarlo con `generate.py` habría que añadir esos ID a la tupla `MODELS` y definir `OPENAI_BASE_URL`, una combinación que no se ha probado.

## La clave y la aprobación automática: llamadas de pago sin supervisión

La clave debe vivir en el entorno, no en la conversación ni en el repositorio, y el permiso para ejecutar el script debe seguir pidiéndose mientras cada ejecución cueste dinero.

**Dónde poner la clave.** Expórtala en la terminal antes de arrancar `claude`, o usa la clave `env` de la configuración, que define variables para la sesión y sus subprocesos. No la pegues en el prompt: queda en el historial de la conversación. Si la guardas en un `.env`, añade una regla `deny` como `Read(./.env)` para que Claude no pueda leer el archivo ([documentación de permisos](https://code.claude.com/docs/en/permissions)). Con MCP, `claude mcp add --env CLAVE=valor` y las cabeceras `--header` escriben el valor literal en la configuración; en un `.mcp.json` compartido usa la expansión `${VAR}` para que cada persona aporte la suya y la clave no acabe en un commit.

**Qué significa «no volver a preguntar».** La primera vez que Claude quiera ejecutar el script, verás una petición de permiso de Bash. Si eliges «Yes, and don't ask again», Claude Code escribe una regla `allow` en `.claude/settings.local.json`. Una regla como esta, construida con el formato documentado y la ruta del script:

```json
{
  "permissions": {
    "allow": ["Bash(python3 .claude/skills/image/scripts/generate.py *)"]
  }
}
```

autoriza cualquier ejecución futura con cualquier argumento. A partir de ahí, cada vez que Claude decida generar o regenerar una imagen, lo hará sin consultarte y será una llamada facturada. La propia documentación advierte de que las reglas que intentan restringir argumentos de Bash son frágiles, así que no cuentes con limitar el modelo o la calidad desde ahí.

Un criterio razonable: mantén la confirmación manual mientras ajustas prompts, porque es cuando más regeneraciones hay. Si necesitas un lote sin supervisión, fija un límite de gasto en la consola del proveedor, deja la calidad en `low` y elimina la regla cuando termines. El `allowed-tools` de la skill es más prudente que una regla permanente precisamente porque caduca con el turno.

## Que Claude mire su propio resultado y lo corrija: el límite de Read

Claude Code puede abrir la imagen que acaba de producir y juzgarla, y eso convierte la generación en un ciclo de generar, mirar y corregir. La herramienta Read devuelve los PNG, JPG y formatos similares como contenido visual ([referencia de herramientas](https://code.claude.com/docs/en/tools-reference)).

El matiz documentado es que Claude no ve el archivo a resolución completa. Las imágenes grandes se escalan y se recomprimen, y desde la versión 2.1.196 las que siguen pasando de 500 KB tras el escalado se recodifican como JPEG de menor calidad. Para revisar detalle fino, como texto pequeño, bordes o artefactos, la documentación sugiere recortar: pídele a Claude que recorte la zona dudosa y abra solo ese fragmento.

El ciclo rinde de forma distinta según la vía. Con SVG, corregir es editar el código y volver a renderizar, sin coste. Con un modelo de imagen, cada corrección es otra llamada de pago y el resultado no es determinista: limita los intentos en la skill, como en el ejemplo de arriba.

## Cuándo cambiar de vía

Cambia cuando el fallo sea de la vía y no del prompt:

- **El texto dentro de la imagen sale mal o el diagrama no cuadra tras dos intentos con un modelo**: pásalo a SVG. El texto será exacto.
- **El SVG queda plano para lo que quieres comunicar**: genera la base fotográfica o ilustrada con un modelo y compón el texto encima con código.
- **El script devuelve `HTTP 401`**: la clave es incorrecta o no está en el entorno de la sesión; reinicia `claude` tras exportarla. Si el rechazo se debe a la organización sin verificar, pasa a Gemini o a un cupo diario de Hugging Face o Cloudflare.
- **El script de Gemini falla con un modelo que funcionaba**: comprueba si el ID sigue vigente antes de tocar nada más.
- **La imagen de MCP no aparece en el proyecto**: está en la carpeta de la sesión. Si ni siquiera se guarda, revisa que tu versión de Claude Code sea la 2.1.283 o posterior.
- **Se agota el cupo diario**: en Cloudflare las peticiones fallan hasta las 00:00 UTC; en ZeroGPU, hasta 24 horas después del primer uso.

## Preguntas frecuentes

### ¿Claude Code puede generar imágenes?

No directamente. Los modelos de Claude solo entienden imágenes; no las producen. Claude Code obtiene imágenes escribiendo código que se renderiza (SVG, HTML, Python) o llamando a un modelo externo con un script o un servidor MCP. En ambos casos el archivo acaba en tu disco y Claude puede abrirlo para revisarlo.

### ¿Cómo poner imágenes en Claude Code para que las analice?

Arrastra el archivo a la terminal, pégalo con Ctrl+V (Alt+V en Windows y WSL) o escribe la ruta en tu mensaje. Eso es leer una imagen, no generarla: sirve para que Claude revise una captura, un diseño o el resultado de una generación.

### ¿Se pueden generar imágenes con Claude Code sin pagar?

Sin modelo de imagen, sí: la vía de SVG no tiene coste aparte de la sesión. Con modelo de imagen, lo verificable son cupos diarios: de 2 a 5 minutos de GPU al día en ZeroGPU de Hugging Face sin plan de pago, y 10.000 Neurons diarios en Cloudflare Workers AI, unas 173 imágenes de 1024×1024 con `flux-1-schnell` a 4 pasos. Los modelos de imagen de Gemini no tienen nivel gratuito y OpenAI cobra por tokens.

### ¿Qué es más barato, la API de Gemini o GPT Image?

Con Gemini lo sabes antes de llamar: USD 0,0336 por imagen a 1K con `gemini-3.1-flash-lite-image` y USD 0,067 con `gemini-3.1-flash-image`. Con GPT Image 2.5 depende de los tokens de cada imagen, a USD 30 por millón de tokens de salida, y OpenAI no publica una cifra fija. Genera una imagen con tu tamaño y calidad habituales, lee `usage` y compara con esos números.

### ¿Hace falta un servidor MCP o basta con un script?

Basta con un script. Te da una ruta de salida elegida por ti, parámetros fijados en el código y algo que el equipo puede revisar en el repositorio. El servidor MCP compensa cuando quieres probar muchos modelos sin escribir nada, a cambio de que la imagen quede en la carpeta de la sesión y de vigilar cómo se guarda la clave.

### ¿Y generar imágenes a través de Codex CLI con una suscripción de ChatGPT?

Es un método que circula en vídeos y foros, pero la documentación de Claude Code no lo describe, de modo que falta una referencia oficial con la que contrastar cómo funciona y en qué condiciones se permite. Las vías respaldadas por documentación de primera mano son las tres anteriores: código, script contra una API y servidor MCP.
