Pular para o conteúdo principal

Comportamento padrão

Quando seu handler retorna um objeto simples, a plataforma responde com 200 OK e Content-Type: application/json:
handler: async (input) => {
  return { nome: "Maria", saldo: 150.00 };
}
// → 200 OK
Quando você precisa de um status code diferente ou headers personalizados, use o response builder.

Response builder

Importe response de @jelou/functions:
import { define, response, z } from "@jelou/functions";

Status code personalizado

export default define({
  description: "Cria um usuário",
  input: z.object({ nome: z.string(), email: z.string().email() }),
  output: z.object({ id: z.string(), nome: z.string() }),
  handler: async (input) => {
    const usuario = await criarUsuario(input);
    return response
      .status(201)
      .json({ id: usuario.id, nome: usuario.nome });
  },
});

Headers personalizados

handler: async (input) => {
  return response
    .header("X-Request-Id", crypto.randomUUID())
    .header("Cache-Control", "max-age=300")
    .json({ dados: [] });
}

Múltiplos headers de uma vez

handler: async (input) => {
  return response
    .headers({
      "X-Request-Id": crypto.randomUUID(),
      "Cache-Control": "no-store",
    })
    .json({ ok: true });
}

Encadeamento completo

O builder é imutável — cada método retorna uma nova instância:
handler: async (input) => {
  return response
    .status(201)
    .header("Location", `/usuarios/${input.id}`)
    .json({ id: input.id, nome: input.nome });
}
// → 201 Created
// → Location: /usuarios/abc123

API

MétodoDescrição
response.status(code)Define o status HTTP (padrão: 200)
response.header(name, value)Adiciona um header
response.headers(init)Adiciona múltiplos headers
response.json(body)Finaliza e retorna JsonResponse
.json() é o método terminal — depois de chamá-lo você obtém um JsonResponse, não um builder.

Exemplos práticos

handler: async (input) => {
  const ticket = await criarTicket(input);
  return response
    .status(201)
    .header("Location", `/tickets/${ticket.id}`)
    .json({ ticketId: ticket.id, estado: "aberto" });
}

Validação de output

Quando usa response.json(body) com schema output, a validação se aplica ao body. A validação nunca bloqueia a resposta.

Comportamento em MCP

Quando invocado via MCP (agentes IA no Brain Studio):
  • O body é emitido como structuredContent
  • Status code e headers são ignorados
  • O body também é enviado como texto JSON para compatibilidade
Não precisa condicionar seu código para HTTP vs MCP — use o response builder normalmente.

Limitações

LimitaçãoDetalhe
Apenas JSON.json() é o único método terminal
Sem Web Response nativoRetornar new Response() de define()/app() não funciona
Content-Type fixoSempre application/json
OpenAPISpec em /openapi.json documenta apenas resposta 200 por enquanto