/ api y mcp

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:

campoqué es
domainObligatorio. 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.
scriptObligatorio. 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, heightTamañ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.
animatetrue: aparición animada en el orden del script, en bucle. Por defecto, estática.
stepSeconds, holdSecondsCon 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).
editLinktrue: 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.svg

Con "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:

herramientaqué hace
qf_dsl_referenceLa 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_figureCompila 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_explainCompila 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_bookletArma 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ímitevalor
Llamadas por minuto, por llave60
Llamadas por mes, por llave1000; se renueva el día 1 de cada mes (UTC)
Cuerpo de la petición64 kB
Script20.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"]
}
kindqué hacer
inputEl cuerpo de la petición está mal (falta domain o script, tipos, tamaños). HTTP 400.
versionLa línea /qf-dsl pide una versión que no existe. La versión es opcional: se puede quitar. HTTP 422.
other_grammarEl script usa palabras de otra gramática: reenviarlo con el dominio de suggestedDomains. HTTP 422.
unsupportedUsa algo que QuickFigen todavía no sabe dibujar (unsupported lo nombra). No aproximarlo con otra construcción. HTTP 422.
invalidEl 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.
engineEl 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:

HTTPcuándo
401Falta la llave, o no es válida o fue revocada (missing_key, invalid_key).
413El cuerpo supera 64 kB.
429Límite por minuto (rate_limited) o cuota del mes (quota_exceeded), con Retry-After.
503El servicio no está disponible en este momento; reintentar más tarde.