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,qualityybackground. - 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ámetro | Tipo | Descripción |
|---|---|---|
| search_illustrations | lectura | Busca en la galería por significado. Argumentos: query, limit, collection. Equivale a GET /search. |
| generate_illustration | escritura | Genera una ilustración nueva (o reutiliza una existente según reuse). Equivale a POST /generate. |
| convert_image | escritura | Redibuja una imagen pública en estilo LL. Equivale a POST /convert. |
| colorize_illustration | escritura | Rellena el fondo con un color plano, sin IA. Equivale a POST /colorize. |
| get_illustration | lectura | Detalles de una imagen por su id. |
| list_collections | lectura | Todas 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ámetro | Tipo | Descripción |
|---|---|---|
| q | texto, obligatorio | Lo que buscas, en español o inglés (máx. 500 caracteres). Puede ser una palabra, un concepto o una frase. |
| limit | 1–50 | Número máximo de resultados (12 por defecto). |
| collection | texto | Limita 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ámetro | Tipo | Descripción |
|---|---|---|
| topic | texto, obligatorio | Qué dibujar, en español o inglés (se traduce solo). Las frases entre comillas no se traducen. |
| quality | low | medium | high | Más calidad = más tiempo (≈35 s / 1,5 min / 2,5 min). Por defecto, la del token. |
| format | png | webp | avif | Formato de la URL devuelta. Por defecto, el del token. |
| background | original | white | transparent | white normaliza el papel a #ffffff; transparent (beta) lo quita. |
| reuse | exact | similar | none | exact (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. |
| similarityThreshold | 0,3–0,95 | Con reuse: "similar": lo parecida que debe ser (0,55 por defecto). |
| referenceImage | URL | Una 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_ENLACEtopic(máx. 300 caracteres; no puede parecer una URL) ykey(llk_…) son obligatorios;format,qualityybackground, 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-Afteral 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ámetro | Tipo | Descripción |
|---|---|---|
| imageUrl | URL, obligatoria | Imagen pública http(s) (OpenAI tiene que poder descargarla). |
| detail | expanded | short | expanded (por defecto) hace dos pasadas de descripción y es más fiel; short da un dibujo más libre y simple. |
| description | texto | Salta la descripción y usa este texto como prompt (p. ej. uno devuelto antes y editado). |
| quality, format, background | Como 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ámetro | Tipo | Descripción |
|---|---|---|
| imageUrl | URL, obligatoria | Ilustración en blanco y negro (PNG, JPEG o WebP). |
| backgroundColor | hex | Color de fondo, p. ej. #ffe201. |
| format | png | webp | Qué URL se devuelve (se guardan ambos). |
| bgThreshold | 140–250 | Lo claro que debe ser un píxel para contar como fondo. |
| inkThreshold | 40–200 | Lo oscuro que debe ser para conservarse como línea. |
| closeRadius | 1–40 | Cuánto se tragan estrellitas y puntos sueltos. |
| restoreRadius | 1–75 | Devuelve al personaje el tamaño perdido (≥ closeRadius). |
| organicRadius | 0–30 | Variación aleatoria del borde, como pintado a mano. |
| smoothRadius | 0–30 | Redondea 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=transparentEl 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ámetro | Tipo | Descripción |
|---|---|---|
| 400 | petición | Falta un parámetro obligatorio o tiene un valor no válido (el mensaje dice cuál). |
| 401 | credencial | Token ausente, no válido o revocado (o una clave de enlace usada como token). |
| 404 | no existe | La imagen o el id no existen. |
| 429 | límite | Solo en el enlace GET: límite de generaciones por hora o día. |
| 502 | proveedor | Falló 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.