Draw· API y MCPOpenAPI

API y MCP de Draw

Draw crea ilustraciones en blanco y negro, dibujadas a mano, en el estilo de Learning Legendario, y las guarda en una galería con miles de imágenes. Todo lo que hace la web se puede hacer desde fuera de tres formas:

  • API REST en https://draw.milab.es/api/v1 — para scripts, automatizaciones (Zapier, Make, n8n) y cualquier aplicación.
  • Servidor MCP en https://draw.milab.es/api/mcp — para asistentes de IA (Claude, Cursor, VS Code…), que pueden buscar y generar ilustraciones por sí mismos.
  • Enlace GET — para herramientas que solo saben abrir una URL.

La galería se puede buscar por significado: cada imagen está descrita e indexada con IA en español e inglés, así que buscar conflicto también encuentra un dibujo generado como dos personas peleando.

Inicio rápido

1. Pide a la persona que administra Draw un token de API (se crean en Ajustes → Tokens de API y MCP). 2. Prueba una búsqueda:

curl "https://draw.milab.es/api/v1/search?q=conflicto&limit=5" \ -H "Authorization: Bearer TU_TOKEN"

3. Y genera una ilustración nueva (tarda entre 30 y 160 segundos):

curl -X POST https://draw.milab.es/api/v1/generate \ -H "Authorization: Bearer TU_TOKEN" \ -H "Content-Type: application/json" \ -d '{"topic": "una persona leyendo bajo un árbol"}'{ "url": "https://draw.milab.es/i/aB3dE5fG7h.png?background=white", "id": "aB3dE5fG7h", "cached": false }

Autenticación

Todas las llamadas de la API REST (salvo /i/… y /api/v1/image) y el servidor MCP usan un token Bearer:

Authorization: Bearer ll_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • Cada token tiene un nombre (para verlo en Estadísticas) y se puede revocar en cualquier momento.
  • Cada token tiene su formato, calidad y fondo por defecto; una petición puede cambiarlos con format, quality y background.
  • Las claves de enlace (llk_…) son otra credencial distinta, solo para el enlace GET: viajan en la URL, así que no sirven como Bearer, ni un token como clave.

Servidor MCP

Endpoint: https://draw.milab.es/api/mcp (transporte HTTP "streamable", sin estado), autenticado con el mismo token Bearer.

Claude Code

claude mcp add --transport http draw https://draw.milab.es/api/mcp \ --header "Authorization: Bearer TU_TOKEN"

Claude Desktop

En claude_desktop_config.json (Ajustes → Desarrollador → Editar configuración), usando el puente mcp-remote:

{ "mcpServers": { "draw": { "command": "npx", "args": [ "-y", "mcp-remote", "https://draw.milab.es/api/mcp", "--header", "Authorization: Bearer TU_TOKEN" ] } } }

Cursor, VS Code y otros clientes con HTTP

{ "mcpServers": { "draw": { "url": "https://draw.milab.es/api/mcp", "headers": { "Authorization": "Bearer TU_TOKEN" } } } }

(En VS Code la clave es "servers" y cada servidor lleva además "type": "http".)

Herramientas

ParámetroTipoDescripción
search_illustrationslecturaBusca en la galería por significado. Argumentos: query, limit, collection. Equivale a GET /search.
generate_illustrationescrituraGenera una ilustración nueva (o reutiliza una existente según reuse). Equivale a POST /generate.
convert_imageescrituraRedibuja una imagen pública en estilo LL. Equivale a POST /convert.
colorize_illustrationescrituraRellena el fondo con un color plano, sin IA. Equivale a POST /colorize.
get_illustrationlecturaDetalles de una imagen por su id.
list_collectionslecturaTodas las colecciones con su número de imágenes.

Las herramientas devuelven el mismo JSON que la API REST. El servidor indica al asistente que busque antes de generar, para reutilizar lo que ya existe.

Buscar

GET /api/v1/search?q=conflicto&limit=12&collection=Oficina
ParámetroTipoDescripción
qtexto, obligatorioLo que buscas, en español o inglés (máx. 500 caracteres). Puede ser una palabra, un concepto o una frase.
limit1–50Número máximo de resultados (12 por defecto).
collectiontextoLimita la búsqueda a una colección (nombre o id).

Cómo funciona

Cada ilustración tiene una descripción y una lista de conceptos relacionados, escritas una vez por un modelo de visión en español e inglés (p. ej. un dibujo de una pelea incluye "conflicto, discusión, desacuerdo, argument…"). La búsqueda combina tres señales:

  • Significado (embeddings): encuentra sinónimos y conceptos cercanos en cualquier idioma.
  • Palabras exactas (texto completo).
  • Parecido de escritura (trigramas): tolera erratas como "conflito".

Respuesta

{ "query": "conflicto", "count": 2, "results": [ { "id": "0sk7AvjiNQ", "url": "https://draw.milab.es/i/0sk7AvjiNQ.webp", "pngUrl": "https://draw.milab.es/i/0sk7AvjiNQ.png", "thumbnailUrl": "https://…/crossed-swords-…-thumb.webp", "topic": "crossed swords emoji battle weapon duel knight", "prompt": "⚔️", "description": "Two figures facing each other with crossed swords… / Dos figuras…", "collections": ["API"], "createdAt": "2026-08-27T12:45:22.000Z", "score": 0.03252, "similarity": 0.359 } ] }

similarity es la similitud semántica (0–1; por encima de ~0,3 ya es un concepto relacionado, por encima de ~0,55 suele ser la misma escena). Es null si la imagen coincidió solo por palabras.

Generar

POST /api/v1/generate Content-Type: application/json { "topic": "una persona leyendo bajo un árbol", "quality": "low", "format": "webp", "background": "white" }
ParámetroTipoDescripción
topictexto, obligatorioQué dibujar, en español o inglés (se traduce solo). Las frases entre comillas no se traducen.
qualitylow | medium | highMás calidad = más tiempo (≈35 s / 1,5 min / 2,5 min). Por defecto, la del token.
formatpng | webp | avifFormato de la URL devuelta. Por defecto, el del token.
backgroundoriginal | white | transparentwhite normaliza el papel a #ffffff; transparent (beta) lo quita.
reuseexact | similar | noneexact (por defecto) devuelve al instante una imagen ya generada con el mismo tema exacto. similar además reutiliza la más parecida por significado si supera el umbral. none siempre genera una nueva.
similarityThreshold0,3–0,95Con reuse: "similar": lo parecida que debe ser (0,55 por defecto).
referenceImageURLUna imagen de estilo extra solo para esta generación.

Respuesta

{ "url": "https://draw.milab.es/i/aB3dE5fG7h.webp?background=white", "id": "aB3dE5fG7h", "cached": false } // Reutilizada por significado (reuse: "similar"): { "url": "…", "id": "…", "cached": true, "similar": true, "similarity": 0.613, "matchedTopic": "man reading a book" }

La petición queda abierta hasta que la imagen está lista (no hay que consultar). Cada imagen generada aparece en la galería, en la colección API, y queda indexada para la búsqueda en unos segundos.

Generar con un enlace (GET)

Para herramientas que solo pueden abrir una URL, sin cabeceras ni cuerpo (p. ej. el Document Reader de Glean):

GET https://draw.milab.es/api/v1/generate-link?topic=una%20tostada&key=TU_CLAVE_DE_ENLACE
  • topic (máx. 300 caracteres; no puede parecer una URL) y key (llk_…) son obligatorios; format, quality y background, opcionales.
  • Primero busca en caché (texto exacto y su traducción). Las respuestas llevan Cache-Control: no-store.
  • Las generaciones nuevas por enlace están limitadas a 20 por hora y 100 por día entre todas las claves (429 + Retry-After al superarlo).
  • No acepta URLs de entrada de ningún tipo: el servidor nunca descarga una dirección que le pase quien llama.

Convertir una imagen

Redibuja cualquier imagen pública (foto, captura, otra ilustración) en estilo LL: un modelo de visión la describe, amplía la descripción con el detalle visible, y se genera con la imagen original como referencia.

POST /api/v1/convert { "imageUrl": "https://ejemplo.com/foto.jpg", "detail": "expanded", "quality": "medium" }
ParámetroTipoDescripción
imageUrlURL, obligatoriaImagen pública http(s) (OpenAI tiene que poder descargarla).
detailexpanded | shortexpanded (por defecto) hace dos pasadas de descripción y es más fiel; short da un dibujo más libre y simple.
descriptiontextoSalta la descripción y usa este texto como prompt (p. ej. uno devuelto antes y editado).
quality, format, backgroundComo en generar.
{ "url": "https://draw.milab.es/i/…", "id": "…", "description": "A person is captured in mid-air…", "sourceImage": "https://ejemplo.com/foto.jpg" }

Nunca usa caché (dos fotos distintas pueden describirse igual). Tarda 5–10 s más que una generación normal. Las conversiones van a la colección Conversiones.

Colorear

Rellena el papel alrededor del personaje con un color plano (amarillo LL #ffe201 por defecto); el personaje queda blanco y las líneas negras. Sin IA: rápido y gratis, el mismo cálculo que la pestaña Colorear.

POST /api/v1/colorize { "imageUrl": "https://draw.milab.es/i/aB3dE5fG7h.webp", "backgroundColor": "#1010be", "format": "webp" }
ParámetroTipoDescripción
imageUrlURL, obligatoriaIlustración en blanco y negro (PNG, JPEG o WebP).
backgroundColorhexColor de fondo, p. ej. #ffe201.
formatpng | webpQué URL se devuelve (se guardan ambos).
bgThreshold140–250Lo claro que debe ser un píxel para contar como fondo.
inkThreshold40–200Lo oscuro que debe ser para conservarse como línea.
closeRadius1–40Cuánto se tragan estrellitas y puntos sueltos.
restoreRadius1–75Devuelve al personaje el tamaño perdido (≥ closeRadius).
organicRadius0–30Variación aleatoria del borde, como pintado a mano.
smoothRadius0–30Redondea picos y muescas de la silueta.

Los valores fuera de rango se ajustan (no se rechazan) y la respuesta devuelve los aplicados. El resultado se guarda en la galería, en la colección Color.

Imágenes y colecciones

GET /api/v1/images/{id} → detalles de una imagen (mismo formato que un resultado de búsqueda) GET /api/v1/collections → { "collections": [{ "id", "name", "kind", "imageCount" }] }

kind indica el tipo de colección: topic son los 26 temas automáticos (cada imagen está en 1–3, p. ej. "Teamwork & Collaboration", "Animals"), origin de dónde viene la imagen (API, CleanStyle, MyNewStyle…) y project colecciones hechas a mano. Cualquier nombre sirve como collection en la búsqueda.

URLs estables

Las URLs que devuelve la API tienen la forma https://draw.milab.es/i/<id>.<formato> y no necesitan token: se pueden incrustar en webs, documentos o presentaciones.

https://draw.milab.es/i/aB3dE5fG7h.webp el archivo guardado (fondo blanco puro) https://draw.milab.es/i/aB3dE5fG7h.png PNG https://draw.milab.es/i/aB3dE5fG7h.avif AVIF (el más ligero) https://draw.milab.es/i/aB3dE5fG7h.png?background=transparent

El id no cambia nunca, aunque la imagen se renombre o el almacenamiento cambie de proveedor. La URL responde con una redirección (302) al archivo real; los clientes HTTP normales la siguen solos (en curl, -L).

Errores y límites

ParámetroTipoDescripción
400peticiónFalta un parámetro obligatorio o tiene un valor no válido (el mensaje dice cuál).
401credencialToken ausente, no válido o revocado (o una clave de enlace usada como token).
404no existeLa imagen o el id no existen.
429límiteSolo en el enlace GET: límite de generaciones por hora o día.
502proveedorFalló la llamada a OpenAI o no se pudo descargar la imagen de origen.

Todos los errores son JSON: { "error": "…" }. En MCP llegan como resultado de herramienta con isError: true. El uso de cada token se ve en Estadísticas.

OpenAPI y llms.txt

  • /api/v1/openapi.json — especificación OpenAPI 3.1 de la API REST (para importar en Postman, GPTs, generadores de clientes…).
  • /llms.txt — resumen en texto plano pensado para asistentes de IA.

¿Tienes acceso a la web? Crea un token en Ajustes.