Saltar al contenido principal

Comportamiento por defecto

Cuando tu handler retorna un objeto plano, la plataforma responde con 200 OK y Content-Type: application/json:
Esto es suficiente para la mayoría de los casos. Pero cuando necesitas un status code diferente o headers personalizados, usa el response builder.

Response builder

Importa response desde @jelou/functions:

Status code personalizado

Headers personalizados

Múltiples headers de una vez

Encadenamiento completo

El builder es inmutable — cada método retorna una nueva instancia sin modificar la anterior:

API

.json() y .noContent() son los métodos terminales — después de llamarlos obtienes un response final, no un builder. Los métodos .status(), .header() y .headers() retornan un nuevo builder encadenable.

Ejemplos prácticos

Validación de output

Cuando usas response.json(body) con un schema output definido, la validación se aplica al body del response — exactamente igual que con objetos planos:
La validación de output nunca bloquea la respuesta. Si el body no coincide con el schema, se registra un warning en los logs pero el cliente recibe la respuesta con el status que configuraste.

Funciona en app() también

Comportamiento en MCP

Cuando tu función es invocada vía MCP (por un agente IA en Brain Studio), el response builder funciona diferente:
  • El body se emite como structuredContent del tool result
  • El status code y los headers se ignoran — MCP no tiene concepto de HTTP status
  • También se envía el body como texto JSON para compatibilidad con clientes MCP que esperan content[].text
No necesitas condicionar tu código para HTTP vs MCP — usa el response builder normalmente. La plataforma extrae el body y descarta los metadatos HTTP cuando la invocación es vía MCP.

Content-Type

El response builder siempre retorna application/json. Si intentas sobreescribir Content-Type, la plataforma lo fuerza de vuelta a application/json:
Para respuestas no-JSON (binarios, HTML, etc.), usa raw mode en lugar del response builder.

Limitaciones

Para necesidades más avanzadas (streaming, binarios, status dinámico basado en content-type), usa raw mode.

Mezclar con objetos planos

Puedes retornar objetos planos o response.json() desde el mismo handler — la plataforma detecta automáticamente cuál usas: