QuickFigen desde tu plataforma o desde un agente
Un script QF DSL entra y la figura sale en SVG, construida por el motor de QuickFigen: la mediatriz es mediatriz y la normal sale de la relación «sobre el plano», no se dibujan a ojo. Dibujar no usa IA ni gasta créditos. Hay dos puertas con la misma llave: una API HTTP para tu servidor y un servidor MCP para agentes como Claude.
1. La llave
Se crea en Configuración → API y MCP, con un nombre que diga dónde se usará (hasta 3 llaves activas por cuenta). La llave entera se muestra una sola vez; después solo se ve su comienzo para reconocerla. Si se filtra, revócala y crea otra: deja de funcionar en la llamada siguiente.
Va en el servidor de tu plataforma, nunca en el navegador: la API no habilita CORS, así que una página de otro sitio no puede leer sus respuestas, justamente para que nadie deje la llave expuesta en el código de una página.
Por ahora la API está en piloto cerrado. Para pedir acceso, escribe a soporte@quickfigen.com.
2. API: POST /api/v1/figure
La llave va en Authorization: Bearer qf_… (o en X-API-Key). El cuerpo es JSON:
| campo | qué es |
|---|---|
domain | Obligatorio. La gramática del script: geometry, math2d (plano cartesiano) o physics. No se adivina: un mismo script puede ser válido en dos gramáticas con significados distintos. |
script | Obligatorio. El script QF DSL, un enunciado por línea (hasta 20.000 caracteres). Al final puede llevar un bloque /qf-style con el aspecto —grosores, tipos de línea, marcadores, rellenos y decimal: coma—; sin él, la figura sale con el estilo estándar y punto decimal. La sintaxis está en la guía del QF DSL. |
width, height | Tamaño del SVG en px, de 32 a 4096. Con uno solo, el otro sale del aspecto de la figura; sin ninguno, tamaño natural. |
format | "json" (por defecto): el SVG dentro de un objeto con datos de la figura. "svg": el archivo directo, con su huella en el encabezado X-QF-Fingerprint. |
animate | true: aparición animada en el orden del script, en bucle. Por defecto, estática. |
stepSeconds, holdSeconds | Con animate, el ritmo: segundos entre un objeto y el siguiente (0,2 a 10; por defecto 0,9) y segundos que la figura completa queda quieta antes de repetir (0,5 a 30; por defecto 2,8). |
editLink | true: agrega editUrl, un link que abre esa misma figura en el editor de QuickFigen para seguir trabajándola (pide iniciar sesión). |
Por ejemplo, la mediatriz de dos puntos, guardada como archivo:
curl -X POST https://www.quickfigen.com/api/v1/figure \
-H "Authorization: Bearer qf_TU_LLAVE" \
-H "Content-Type: application/json" \
-d '{"domain": "geometry", "script": "A = point(0, 0)\nB = point(4, 0)\nm = perpendicular_bisector(A, B)", "width": 480, "format": "svg"}' \
-o figura.svgCon "format": "json" la respuesta trae, además del SVG, lo que el script declaró y, en notes, lo que se dibujó con salvedades (por ejemplo, una regla de /qf-style que esa figura no puede aplicar, o en física una force() hacia abajo sobre un cuerpo que ya muestra su peso en el DCL):
{
"ok": true,
"domain": "geometry",
"dslVersion": 1,
"width": 480,
"height": 472,
"declared": ["A", "B", "m"],
"notes": [],
"fingerprint": "6b598355ad37a44e",
"svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" …"
}La fingerprint identifica el pedido (gramática, script, tamaño y animación): el mismo pedido produce la misma figura, así que sirve como clave de caché de tu lado.
3. MCP remoto: Claude y otros agentes
El servidor MCP vive en https://www.quickfigen.com/api/mcp (Streamable HTTP, sin sesiones) y pide la misma llave en el encabezado Authorization. En Claude Code se agrega así:
claude mcp add --transport http quickfigen https://www.quickfigen.com/api/mcp --header "Authorization: Bearer qf_TU_LLAVE"
Ofrece tres herramientas de solo lectura:
| herramienta | qué hace |
|---|---|
qf_dsl_reference | La referencia de una gramática —constructores, ejemplos que compilan y límites—, generada desde el compilador. El agente la lee antes de escribir el script. |
qf_draw_figure | Compila el script y devuelve un resumen y el SVG. Con respuesta: "resumen", solo el resumen y editUrl, sin el SVG en lo que lee el agente (una figura ocupa de 45 a 100 kB): la vista de QuickFigen en el chat la muestra igual. Si no se puede dibujar, devuelve el rechazo clasificado (ver 5). |
qf_explain | Compila una explicación paso a paso (un .qfe: la figura dada y, por paso, momentos con narración, líneas del DSL y acciones como resaltar, ocultar o recorrer un punto) y la muestra navegable en el chat, animada (lo nuevo entra en el orden del script y un botón «Reproducir» avanza solo), con un .html descargable que funciona sin conexión. Solo geometría, hasta 12 pasos. Sin IA: si algo no se puede dibujar, dice el paso, el momento y la línea, y cómo arreglarlo. |
qf_booklet | Arma un boletín de problemas verificado (enunciado, figura en QF DSL, alternativas, clave y lo que hay que medir en la figura) y lo devuelve como .html autónomo, en versión alumno y profesor, para imprimir o guardar como PDF desde el navegador. Cada problema pasa la validación v1 (la clave contra la figura, alternativas, datos del enunciado, nombres e invariancia) y solo el que pasa todo lleva «Verificado por QF». El agente lee un resumen con el estado de cada problema; si algo no se puede armar, dice el problema, la ruta y la línea. |
Con viewLink: true, qf_explain devuelve además viewUrl: un link de solo lectura, firmado, que vence a los 7 días. Cualquier persona con el link puede ver la explicación, sin cuenta, hasta que vence. Sin viewLink no se genera ningún link. Lo mismo con qf_booklet, que da un link por versión: el de la versión profesor muestra la clave a quien lo tenga.
Conectarse y listar herramientas no gasta cuota; cada dibujo, explicación o boletín, sí. Si la cuota se agota, el dibujo responde con un error que dice cuándo se renueva, para que el agente pueda explicárselo a la persona.
En claude.ai, al añadir un conector personalizado con su URL, se elige la autenticación «Sin inicio de sesión» y, en «Encabezados de solicitud», el encabezado authorization con el valor Bearer qf_TU_LLAVE (con la palabra Bearer y el espacio). El aviso de que el servidor parece pedir inicio de sesión se puede ignorar: la llave va en el encabezado. Según la documentación de Anthropic, esa sección está en beta para un grupo limitado de organizaciones; si no aparece, por ahora usa Claude Code.
Sirve en cualquier cliente MCP que permita configurar encabezados HTTP propios.
4. Límites
| límite | valor |
|---|---|
| Llamadas por minuto, por llave | 60 |
| Llamadas por mes, por llave | 1000; se renueva el día 1 de cada mes (UTC) |
| Cuerpo de la petición | 64 kB |
| Script | 20.000 caracteres |
Cuentan también las llamadas que fallan: lo que se protege es el tiempo de cálculo. Al pasar un límite la API responde 429 con Retry-After. Si tu plataforma necesita más, escríbenos.
5. Cuando no se puede dibujar
Un rechazo viene clasificado en kind, con un hint que dice qué hacer. Está pensado para que un agente reintente bien, o diga honestamente que no se puede:
{
"ok": false,
"kind": "other_grammar",
"message": "Línea 1: Constructor desconocido: «block». …",
"hint": "«block» no es de la gramática de geometría; existe en física (domain=\"physics\"). Reenvía el script con ese dominio; un mismo script no mezcla gramáticas.",
"unsupported": [],
"suggestedDomains": ["physics"]
}| kind | qué hacer |
|---|---|
input | El cuerpo de la petición está mal (falta domain o script, tipos, tamaños). HTTP 400. |
version | La línea /qf-dsl pide una versión que no existe. La versión es opcional: se puede quitar. HTTP 422. |
other_grammar | El script usa palabras de otra gramática: reenviarlo con el dominio de suggestedDomains. HTTP 422. |
unsupported | Usa algo que QuickFigen todavía no sabe dibujar (unsupported lo nombra). No aproximarlo con otra construcción. HTTP 422. |
invalid | El script está mal escrito: corregirlo con el mensaje, que trae el número de línea (y sugiere la palabra si es un error de tipeo). HTTP 422. |
engine | El script se entendió, pero la escena no salió: una construcción sin solución con esos datos, un valor fuera de rango o algo que el motor no pudo construir. El mensaje dice qué objeto y el hint, qué hacer. HTTP 422. |
Y los de la llave, en error:
| HTTP | cuándo |
|---|---|
401 | Falta la llave, o no es válida o fue revocada (missing_key, invalid_key). |
413 | El cuerpo supera 64 kB. |
429 | Límite por minuto (rate_limited) o cuota del mes (quota_exceeded), con Retry-After. |
503 | El servicio no está disponible en este momento; reintentar más tarde. |